流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。
一、TC规则
1、流量控制方式:
- SHAPING(限制) 当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。
- SCHEDULING(调度) 通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。
- POLICING(策略) SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
- DROPPING(丢弃) 如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。
2、流量控制处理对象:
- qdisc(排队规则)
- class(类别)
- filter(过滤器)。
1.qdisc
1.1 CLASSLESS QDisc(不可分类QDisc)一般不用
不可分类QDISC包括:
- [p|b]fifo
- pfifo_fast
- red
- sfq
- tbf
不可分类QDisc的配置:
如果没有可分类QDisc,不可分类QDisc只能附属于设备的根。它们的用法如下:
tc qdisc add dev DEV root QDISC QDISC-PARAMETERS
要删除一个不可分类QDisc,需要使用如下命令:
tc qdisc del dev DEV root
一个网络接口上如果没有设置QDisc,pfifo_fast就作为缺省的QDisc。
1.2 CLASSFUL QDISC(分类QDisc)
可分类QDISC包括:
- CBQ
- HTB
- PRIO
- hfsc
2.CLASS(类)
某些QDisc(排队规则)可以包含一些类别,不同的类别中可以包含更深入的QDisc(排队规则),通过这些细分的QDisc还可以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据流量的优先级。
3.FILTER(过滤器)
Filter(过滤器)用于为数据包分类,决定它们按照何种QDisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用fileter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和QDISC有关。需要注意的是,filter(过滤器)是在QDisc内部,它们不能作为主体。
二、TC控制命令
tc可以使用以下命令对QDisc、类和过滤器进行操作:
add
在一个节点里加入一个QDisc、类或者过滤器。添加时,需要传递一个祖先作为参数,传递参数时既可以使用ID也可以直接传递设备的根。如果要建立一个QDisc或者过滤器,可以使用句柄(handle)来命名;如果要建立一个类,可以使用类识别符(classid)来命名。
remove/del
删除有某个句柄(handle)指定的QDisc,根QDisc(root)也可以删除。被删除QDisc上的所有子类以及附属于各个类的过滤器都会被自动删除。
change
以替代的方式修改某些条目。除了句柄(handle)和祖先不能修改以外,change命令的语法和add命令相同。换句话说,change命令不能一定节点的位置。
replace
对一个现有节点进行近于原子操作的删除/添加。如果节点不存在,这个命令就会建立节点。
link
只适用于DQisc,替代一个现有的节点。
三、在线监听
使用ls或则show都可以查看状态:
tc qdisc ls dev eth1
tc qdisc show dev eth1
1.显示队列qdisc的状况
执行命令:
/usr/sbin/tc qdisc add dev eth1 root handle 1: prio bands 2 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
/usr/sbin/tc qdisc add dev eth1 parent 1:1 handle 10: pfifo limit 3000
/usr/sbin/tc qdisc add dev eth1 parent 1:2 handle 20: htb default 1
查看结果:
root@zihome:/# tc qdisc ls dev eth1
qdisc prio 1: root refcnt 2 bands 2 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
qdisc pfifo 10: parent 1:1 limit 3000p
qdisc htb 20: parent 1:2 r2q 10 default 1 direct_packets_stat 137179 direct_qlen 2000
-s显示具体
root@zihome:/# tc -s qdisc ls dev eth1
qdisc prio 1: root refcnt 2 bands 2 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Sent 20900606 bytes 145877 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc pfifo 10: parent 1:1 limit 3000p
Sent 843953 bytes 8734 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc htb 20: parent 1:2 r2q 10 default 1 direct_packets_stat 137143 direct_qlen 2000
Sent 20056653 bytes 137143 pkt (dropped 0, overlimits 0 requeues 0)
2.显示分类class的状况
设置上行流量,上行流量是WAN口,执行命令:
/usr/sbin/tc class add dev eth1 parent 20: classid 20:1 htb quantum 96000 rate 1024000kbit ceil 1024000kbit burst 15000 cburst 15000
/usr/sbin/tc class add dev eth1 parent 20:1 classid 20:17 htb quantum 1500 rate 2222kbit ceil 2222kbit burst 15000 cburst 15000
查看结果:
root@zihome:/# tc class ls dev eth1
class prio 1:1 parent 1: leaf 10:
class prio 1:2 parent 1: leaf 20:
class htb 20:1 root rate 1024Mbit ceil 1024Mbit burst 14848b cburst 14848b
class htb 20:17 parent 20:1 prio 0 rate 2222Kbit ceil 2222Kbit burst 14999b cburst 14999b
设置下行流量,下行流量是LAN口,执行命令:
/usr/sbin/tc class add dev br-lan parent 20:1 classid 20:17 htb quantum 1500 rate 1111kbit ceil 1111kbit
查看结果:
root@zihome:/# tc class ls dev br-lan
class prio 1:1 parent 1: leaf 10:
class prio 1:2 parent 1: leaf 20:
class htb 20:1 root rate 1024Mbit ceil 1024Mbit burst 14848b cburst 14848b
class htb 20:17 parent 20:1 prio 0 rate 1111Kbit ceil 1111Kbit burst 1599b cburst 1599b
3.显示过滤器的状况
执行命令:
/usr/sbin/tc filter add dev eth1 parent 1: protocol ip prio 1 handle 0xf/0xfffff fw flowid 1:1
/usr/sbin/tc filter add dev eth1 parent 1: protocol ip prio 2 u32 match ip protocol 1 0xf/0xfffff flowid 1:1
Illegal "match"
/usr/sbin/tc filter add dev eth1 parent 1: protocol arp prio 3 handle 0xf/0xfffff fw classid 1:1
/usr/sbin/tc filter add dev eth1 parent 1: protocol ip prio 4 u32 match u8 0x00 0x00 at 0 flowid 1:2
/usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 0x1/0xfffff fw flowid 20:1
查看结果:
root@zihome:/# tc -s filter ls dev eth1
filter parent 1: protocol ip pref 1 fw
filter parent 1: protocol ip pref 1 fw handle 0xf/0xfffff classid 1:1
filter parent 1: protocol arp pref 3 fw
filter parent 1: protocol arp pref 3 fw handle 0xf/0xfffff classid 1:1
filter parent 1: protocol ip pref 4 u32
filter parent 1: protocol ip pref 4 u32 fh 800: ht divisor 1
filter parent 1: protocol ip pref 4 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:2
match 00000000/00000000 at 0
增添动作一般依照"队列->分类->过滤器->路由"的顺序进行;修改动作则没有什么要求;删除则依照"路由->过滤器->分类->队列"的顺序进行。
mac=00:66:88:11:33:22,upload=1111,download=2222
iptables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:22 -d 0.0.0.0/0 -j MARK --set-mark 17/0xfffff
iptables: No chain/target/match by that name.
ip6tables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:22 -d 0.0.0.0/0 -j MARK --set-mark 17/0xfffff
/usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
iptables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:22 -d 0.0.0.0/0 -j MARK --set-mark 17/0xfffff
ip6tables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:22 -d 0.0.0.0/0 -j MARK --set-mark 17/0xfffff
/usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
/usr/sbin/tc class add dev eth1 parent 20:1 classid 20:17 htb quantum 1500 rate 2222kbit ceil 2222kbit burst 15000 cburst 15000
/usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 17/0xfffff fw flowid 20:17
/usr/sbin/tc class add dev br-lan parent 20:1 classid 20:17 htb quantum 1500 rate 1111kbit ceil 1111kbit
/usr/sbin/tc filter add dev br-lan parent 20:0 protocol ip handle 17/0xfffff fw flowid 20:17
iptables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
iptables: No chain/target/match by that name.
ip6tables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
/usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
iptables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
ip6tables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
/usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
/usr/sbin/tc class add dev eth1 parent 20:1 classid 20:17 hfsc sc rate 204800kbit ul rate 204800kbit
/usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 257/0xfffff fw flowid 20:17
/usr/sbin/tc class add dev ifb4eth1 parent 20:1 classid 20:17 hfsc sc rate 102400kbit ul rate 102400kbit
/usr/sbin/tc filter add dev ifb4eth1 parent 20:0 protocol ip handle 257/0xfffff fw flowid 20:17
在设备eth1的父类parent 20:1下面添加子类classid 20:17,
mac=00:66:88:11:33:33,upload=3333,download=4444
iptables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:33 -d 0.0.0.0/0 -j MARK --set-mark 18/0xfffff
iptables: No chain/target/match by that name.
ip6tables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:33 -d 0.0.0.0/0 -j MARK --set-mark 18/0xfffff
/usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
iptables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:33 -d 0.0.0.0/0 -j MARK --set-mark 18/0xfffff
ip6tables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:33 -d 0.0.0.0/0 -j MARK --set-mark 18/0xfffff
/usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
/usr/sbin/tc class add dev eth1 parent 20:1 classid 20:18 htb quantum 1500 rate 4444kbit ceil 4444kbit
/usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 18/0xfffff fw flowid 20:18
/usr/sbin/tc class add dev br-lan parent 20:1 classid 20:18 htb quantum 1500 rate 3333kbit ceil 3333kbit
/usr/sbin/tc filter add dev br-lan parent 20:0 protocol ip handle 18/0xfffff fw flowid 20:18
net/sched/:
https://www.cnblogs.com/flintlovesam/p/6840596.html
https://wenku.baidu.com/view/2c99fafc910ef12d2af9e71b.html?sxts=1561714949625
TC规则:
https://www.cnblogs.com/endsock/archive/2011/12/09/2281519.html
https://wenku.baidu.com/view/324fc91a964bcf84b9d57b01.html?sxts=1561974466327
qdisc队列规则算法说明:
https://blog.csdn.net/zhaobryant/article/details/38797739
应用:
https://www.cnblogs.com/flintlovesam/p/8858200.html
iptables+tc命令实现ip组限速功能:
https://blog.csdn.net/dxt1107/article/details/86019972