歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux TC基於CBQ隊列的流量管理范例

Linux TC基於CBQ隊列的流量管理范例

日期:2017/2/28 16:03:30   编辑:Linux教程

參考了TC的很多文檔,自己也整理了一篇配置記錄。在實際使用過程中效果還不錯,在此分享給大家以備參考。
環境:局域網規模不是很大40多台機器。 NAT共享上網(內網:eth0 外網:eth2)
CBQ 是通過硬件的閒置時間來計算隊列,硬件不同,效果也不同,對於比較大的網絡使用HTB比較好。以下限制上傳和下載的方法可以寫成腳本,通過mrtg發現流 量的異常情況,然後通過ntop查處是誰在干壞事,最後用寫好的tc腳本限制他的流量,避免影響其他人的網絡使用。

1) 針對網絡物理設備(如以太網卡eth0)綁定一個CBQ隊列

#tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64

將一個cbq隊列綁定到網絡物理設備eth0上,其編號為1:0;網絡物理設備eth0的實際帶寬為10Mbit,包的平均大小為1000字節;包間隔發送單元的大小為8字節,最小傳輸包大小為64字節。

2) 在該隊列上建立分類


#tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 1Mbit


創建根分類1:1;分配帶寬為10Mbit,優先級別為1。該隊列的最大可用帶寬為10Mbit,實際分配的帶寬為10Mbit,可接收沖 突的發送最長包數目為20字節;最大傳輸單元加MAC頭的大小為1514字節,優先級別為1,包的平均大小為1000字節,包間隔發送單元的大小為8字 節,相應於實際帶寬的加權速率為1Mbit。
創建子分類

#tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 100Kbit bounded
創建分 類1:2,其父分類為1:1,分配帶寬為64Kbit,優先級別為8。該隊列的最大可用帶寬為10Mbit,實際分配的帶寬為64Kbit,可接收沖突的 發送最長包數目為20字節;最大傳輸單元加MAC頭的大小為1514字節,優先級別為8,包的平均大小為1000字節,包間隔發送單元的大小為8字節,相 應於實際帶寬的加權速率為100Kbit,且不可借用未使用帶寬。


#tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 9 avpkt 1000 cell 8 weight 100Kbit bounded


創建分類1:3,其父分類為1:1,分配帶寬為64Kbit,優先級別為9。該隊列的最大可用帶寬為10Mbit,實際分配的帶寬為 64Kbit,可接收沖突的發送最長包數目為20字節;最大傳輸單元加MAC頭的大小為1514字節,優先級別為9,包的平均大小為1000字節,包間隔 發送單元的大小為8字節,相應於實際帶寬的加權速率為100Kbit,且不可借用未使用帶寬。

3)在子分類地下創建隊列,使用sfq隨機公平隊列
#tc qdisc add dev eth0 parent 1:2 sfq quantum 1514b perturb 15
#tc qdisc add dev eth0 parent 1:3 sfq quantum 1514b perturb 15
在分類底下,創建隊列,使用sfq隨即公平隊列

4) 為每一分類建立一個基於路由的過濾
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.66 flowid 1:3
限制各ip地址的下載帶寬,使用u32過濾器,對目的地址進行分類,對應已經創建的隊列
需要添加新的被限制ip的下載帶寬,需要先要創建新的分類(比如1:4),然後根據新的分類創建新的sfq隊列,最後使用u32過濾器對目的地址進行帶寬限制。
需要對幾個ip限制下載帶寬,就需要創建幾個分類、隊列、過濾器

限制上傳


#將一個cbq隊列綁定到網絡物理設備eth2上,其編號為2:0;網絡物理設備eth2的實際帶寬為2Mbit,包的平均大小為1000字節;包間隔發送單元的大小為8字節,最小傳輸包大小為64字節。
#tc qdisc add dev eth2 root handle 2: cbq bandwidth 2Mbit avpkt 1000 cell 8 mpu 64

創建根分類2:1;分配帶寬為2Mbit,優先級別為1。該隊列的最大可用帶寬為2Mbit,實際分配的帶寬為2Mbit,可接收沖突的發送最長包 數目為20字節;最大傳輸單元加MAC頭的大小為1514字節,優先級別為1,包的平均大小為1000字節,包間隔發送單元的大小為8字節,相應於實際帶 寬的加權速率為200Kbit。
#tc class add dev eth2 parent 2:0 classid 2:1 cbq bandwidth 2Mbit rate 2Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 200Kbit

#創建分類2:2,其父分類為2:1,分配帶寬為64Kbit,優先級別為8。該隊列的最大可用帶寬為2Mbit,實際分配的帶寬為64Kbit, 可接收沖突的發送最長包數目為20字節;最大傳輸單元加MAC頭的大小為1514字節,優先級別為8,包的平均大小為1000字節,包間隔發送單元的大小 為8字節,相應於實際帶寬的加權速率為100Kbit,且不可借用未使用帶寬。
#tc class add dev eth2 parent 2:1 classid 2:2 cbq bandwidth 2Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 200Kbit bounded

#在分類底下,創建隊列,使用sfq隨即公平隊列
/sbin/tc qdisc add dev eth2 parent 2:2 sfq quantum 1514b perturb 15

#應用路由分類器到cbq隊列的根,過濾協議為ip,優先級為100
#tc filter add dev eth2 parent 2:0 protocol ip prio 1 handle 2 fw classid 2:2

#給數據包打標簽,可以通過RETURN方法避免遍歷所有的規則,加快處理速度
#iptables –t mangle –A PREROUTING –i eth0 –s 192.111.1.xxx –j MARK --set-mark 2
#iptables –t mangle –A PREROUTING –i eth0 –s 192.111.1.xxx –j RETURN

#nat(參考)
#iptables -t nat -A POSTROUTING -s 192.111.1.0/24 -o eth2 -j SNAT --to 外網IP

#需要添加新的被限制ip的上傳帶寬,需要先要創建新的分類(比如2:3),然後根據新的分類創建新的sfq隊列,最後使用路由過濾器,過濾協議為ip,給原地址是需要限制的ip地址來的數據包打標記。
需要對幾個ip限制下載帶寬,就需要創建幾個分類、隊列、路由過濾器、iptable的mangle表的PREROUTING鏈

另外還有其他的過濾器比如:
#tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2 ip route add 192.111.1.24 dev eth0 via 192.111.1.4 realm 2

維護
主要包括對隊列、分類、過濾器和路由的增添、修改和刪除。
增添動作一般依照"隊列->分類->過濾器->路由"的順序進行;修改動作則沒有什麼要求;刪除則依照"路由->過濾器->分類->隊列"的順序進行。
#簡單顯示指定設備的隊列狀況
/sbin/tc qdisc ls dev eth0

#詳細顯示指定設備的隊列狀況
/sbin/tc –s qdisc ls dev eth0

#簡單顯示指定設備的分類狀況
/sbin/tc class ls dev eth0

#詳細顯示指定設備的分類狀況
/sbin/tc –s class ls dev eth0

#顯示過濾器的狀況
/sbin/tc –s filter ls dev eth0

#隊列的維護
一般對於一台流量控制器來說,出廠時針對每個以太網卡均已配置好一個隊列了,通常情況下對隊列無需進行增添、修改和刪除動作了。

分類的維護
增添動作通過tc class add命令實現。
修改動作通過tc class change命令實現,如下所示:
/sbin/tc class change dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 100Kbit bounded
對於bounded命令應慎用,一旦添加後就進行修改,只可通過刪除後再添加來實現。

#過濾器的維護

增添動作通過tc filter add命令實現。

修改動作通過tc filter change命令實現,如下所示:
/sbin/tc filter change dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2

刪除動作通過tc filter del命令實現,如下所示:
/sbin/tc filter del dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:

Copyright © Linux教程網 All Rights Reserved