datetime:2024-04-22 16:57:00
author:nzb

Software Defined Networking

tc

tc(Traffic Control)命令是Linux系统中的一个网络管理工具,用于配置和管理网络流量控制。它可以用来限制网络带宽、延迟、丢包等,以及实现QoS(Quality of Service) 等功能。以下是tc命令的详细介绍:

tc qdisc命令

tc qdisc命令用于配置队列规则,即网络流量的调度策略。常用的调度策略有以下几种:

  • pfifo_fast:先进先出队列,适用于低延迟、高吞吐量的场景。
  • tbf:令牌桶过滤器,用于限制带宽和速率。
  • htb:层次令牌桶过滤器,用于实现QoS,可以对不同的流量进行不同的限制。
  • prio:优先级队列,用于对不同的流量进行优先级排序。

例如,以下命令将创建一个htb队列规则,限制eth0接口的带宽为1Mbps

tc qdisc add dev eth0 root handle 1: htb default 1
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit

tc class命令

tc class命令用于配置类别规则,即对不同的流量进行分类和限制。每个类别规则都有一个唯一的classid,可以用来标识该规则。常用的限制参数有以下几种:

  • rate:限制带宽速率。
  • ceil:限制带宽峰值速率。
  • burst:限制突发流量大小。
  • cburst:限制类别突发流量大小。

例如,以下命令将创建一个类别规则,将IP地址为192.168.1.2的流量限制为500Kbps

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500kbit ceil 1mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.2 flowid 1:10

tc filter命令

tc filter命令用于配置过滤规则,即根据不同的条件过滤流量并将其分配到不同的类别中。常用的过滤条件有以下几种:

  • protocol:协议类型。
  • src/dst:源/目的IP地址。
  • sport/dport:源/目的端口号。
  • match:匹配特定的数据包。

例如,以下命令将创建一个过滤规则,将源IP地址为192.168.1.2的流量分配到类别1:10中:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.2 flowid 1:10

tc monitor命令

tc monitor命令用于实时监控网络流量和队列状态。可以使用以下命令启动tc monitor

tc -s monitor

添加规则

sudo tc qdisc add dev [eth0] root ...

显示规则

sudo tc qdisc show dev [eth0] root

删除规则

#删除qdisc规则:删除eth0接口上根部的qdisc规则
sudo tc qdisc del dev [eth0] root
#删除class规则:删除eth0接口上父类标识为1:的子类标识为1:10的规则
sudo tc class del dev [eth0] parent 1: classid 1:10
#删除filter规则:删除eth0接口上匹配源IP地址为192.168.1.1/32并且具有优先级1的规则。
sudo tc filter del dev [eth0] parent 1: protocol ip prio 1 u32 match ip src [192.168.1.1/32] flowid 1:10

应用:使用 tc 模拟特定端口上(示例7000端口)的网络延迟

# 创建了一个优先级队列,并且将其根节点标识为`1:`。`prio`指定了队列的类型,而`priomap`用于指定不同优先级的映射。在这个命令中,所有流量都将被分配到优先级`0`。
sudo tc qdisc add dev eth1 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 在优先级队列的第二个子队列(由`parent 1:2`指定)上添加了一个延迟队列。延迟为`3000`毫秒。
sudo tc qdisc add dev eth1 parent 1:2 handle 20: netem delay 3000ms
# 添加了一个过滤器规则,以匹配源端口为`7000`的IP数据包。一旦匹配成功,它会将匹配的数据包重定向到优先级队列的第二个子队列中,从而应用之前添加的延迟。
sudo tc filter add dev eth1 parent 1:0 protocol ip u32 match ip sport [7000] 0xffff flowid 1:2

应用:tc模拟延迟(针对网口,跟什么针对某个端口不一样)

# 模拟延迟 300ms ± 100ms
sudo tc qdisc add dev eth0 root netem delay 300ms 100ms

# 删除延迟 300ms ± 100ms
sudo tc qdisc del dev eth0 root netem delay 300ms 100ms

应用:tc模拟丢包率

# 模拟5%丢包率
sudo tc qdisc add dev eth0 root netem loss 5%

# 去除5%丢包率
sudo tc qdisc del dev eth0 root netem loss 5%

拓展知识点:iptables模拟丢包率:

# 模拟80端口10%的丢包率
iptables -A INPUT -p tcp --dport 80 -m statistic --mode random --probability 0.1 -j DROP

# 删除80端口10%的丢包率
iptables -D INPUT -p tcp --dport 80 -m statistic --mode random --probability 0.1 -j DROP

# 模拟50%的丢包率
iptables -I INPUT -p icmp -m statistic --mode random --probability 0.5 -j DROP

# 删除50%的丢包率
iptables -D INPUT -p icmp -m statistic --mode random --probability 0.5 -j DROP

# 模拟精确的33%丢包率:每3个包丢掉1个
iptables -I INPUT  -p icmp -m statistic --mode nth --every 3 --packet 0 -j DROP

# 删除精确的33%丢包率:每3个包丢掉1个
iptables -D INPUT  -p icmp -m statistic --mode nth --every 3 --packet 0 -j DROP

# 模拟精确的66%丢包率:每3个包丢掉2个,在每3个包丢1个的基础上再每2个包丢1个,实现每3个丢2个
iptables -I INPUT  -p icmp -m statistic --mode nth --every 3 --packet 0 -j DROP
iptables -I INPUT  -p icmp -m statistic --mode nth --every 2 --packet 0 -j DROP

# 删除精确的66%丢包率:每3个包丢掉2个,在每3个包丢1个的基础上再每2个包丢1个,实现每3个丢2个
iptables -D INPUT  -p icmp -m statistic --mode nth --every 3 --packet 0 -j DROP
iptables -D INPUT  -p icmp -m statistic --mode nth --every 2 --packet 0 -j DROP

results matching ""

    No results matching ""