5-TC規則(traffic control)IP限速

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章