流量控制器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