datetime:2024-04-22 16:57:00
author:nzb
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