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

來源:互聯網
上載者:User

參考了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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.