參考了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:
轉自:http://www.netren.org/index.php/linux-tc/53-tc-cbq.html