基于CBQ的流量控制
參考了cu的很多文檔,沿著前輩的腳印,整理了一篇自己的配置記錄。在實(shí)際使用過程中效果良好,局域網(wǎng)規(guī)模不是很大40多臺(tái)機(jī)器。 內(nèi)網(wǎng):eth0 外網(wǎng):eth2 NAT共享上網(wǎng) CBQ是通過硬件的閑置時(shí)間來計(jì)算隊(duì)列,硬件不同,效果也不同,對(duì)于比較大的網(wǎng)絡(luò)使用HTB比較好。以下限制上傳和下載的方法可以寫成腳本,通過mrtg發(fā)現(xiàn)流量的異常情況,然后通過ntop查處是誰在干壞事,最后用寫好的tc腳本限制他的流量,避免影響其他人的網(wǎng)絡(luò)使用。 其基本使用步驟為: 1) 針對(duì)網(wǎng)絡(luò)物理設(shè)備(如以太網(wǎng)卡eth0)綁定一個(gè)CBQ隊(duì)列 2) 在該隊(duì)列上建立分類 3) 為每一分類建立一個(gè)基于路由的過濾器 4) 最后與過濾器相配合,建立特定的路由表 [color=red:7ae1fe0779]限制下載[/color:7ae1fe0779] #將一個(gè)cbq隊(duì)列綁定到網(wǎng)絡(luò)物理設(shè)備eth0上,其編號(hào)為1:0;網(wǎng)絡(luò)物理設(shè)備eth0的實(shí)際帶寬為10Mbit,包的平均大小為1000字節(jié);包間隔發(fā)送單元的大小為8字節(jié),最小傳輸包大小為64字節(jié)。 /sbin/tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64 #創(chuàng)建根分類1:1;分配帶寬為10Mbit,優(yōu)先級(jí)別為1。該隊(duì)列的最大可用帶寬為10Mbit,實(shí)際分配的帶寬為10Mbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為1,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為1Mbit。 /sbin/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 #創(chuàng)建分類1:2,其父分類為1:1,分配帶寬為64Kbit,優(yōu)先級(jí)別為8。該隊(duì)列的最大可用帶寬為10Mbit,實(shí)際分配的帶寬為64Kbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為8,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為100Kbit,且不可借用未使用帶寬。 /sbin/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 #創(chuàng)建分類1:3,其父分類為1:1,分配帶寬為64Kbit,優(yōu)先級(jí)別為9。該隊(duì)列的最大可用帶寬為10Mbit,實(shí)際分配的帶寬為64Kbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為9,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為100Kbit,且不可借用未使用帶寬。 /sbin/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 #在分類底下,創(chuàng)建隊(duì)列,使用sfq隨即公平隊(duì)列 /sbin/tc qdisc add dev eth0 parent 1:2 sfq quantum 1514b perturb 15 /sbin/tc qdisc add dev eth0 parent 1:3 sfq quantum 1514b perturb 15 #這句是限制內(nèi)網(wǎng)從本服務(wù)器下載,這里不需要??!只作為參考??! /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip src 192.111.1.8 flowid 1:2 #限制各ip地址的下載帶寬,使用u32過濾器,對(duì)目的地址進(jìn)行分類,對(duì)應(yīng)已經(jīng)創(chuàng)建的隊(duì)列 /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2 /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.66 flowid 1:3 #需要添加新的被限制ip的下載帶寬,需要先要?jiǎng)?chuàng)建新的分類(比如1:4),然后根據(jù)新的分類創(chuàng)建新的sfq隊(duì)列,最后使用u32過濾器對(duì)目的地址進(jìn)行帶寬限制。 需要對(duì)幾個(gè)ip限制下載帶寬,就需要?jiǎng)?chuàng)建幾個(gè)分類、隊(duì)列、過濾器 [color=red:7ae1fe0779]限制上傳[/color:7ae1fe0779] #將一個(gè)cbq隊(duì)列綁定到網(wǎng)絡(luò)物理設(shè)備eth2上,其編號(hào)為2:0;網(wǎng)絡(luò)物理設(shè)備eth2的實(shí)際帶寬為2Mbit,包的平均大小為1000字節(jié);包間隔發(fā)送單元的大小為8字節(jié),最小傳輸包大小為64字節(jié)。 /sbin/tc qdisc add dev eth2 root handle 2: cbq bandwidth 2Mbit avpkt 1000 cell 8 mpu 64 #創(chuàng)建根分類2:1;分配帶寬為2Mbit,優(yōu)先級(jí)別為1。該隊(duì)列的最大可用帶寬為2Mbit,實(shí)際分配的帶寬為2Mbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為1,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為200Kbit。 /sbin/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 #創(chuàng)建分類2:2,其父分類為2:1,分配帶寬為64Kbit,優(yōu)先級(jí)別為8。該隊(duì)列的最大可用帶寬為2Mbit,實(shí)際分配的帶寬為64Kbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為8,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為100Kbit,且不可借用未使用帶寬。 /sbin/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 #在分類底下,創(chuàng)建隊(duì)列,使用sfq隨即公平隊(duì)列 /sbin/tc qdisc add dev eth2 parent 2:2 sfq quantum 1514b perturb 15 #應(yīng)用路由分類器到cbq隊(duì)列的根,過濾協(xié)議為ip,優(yōu)先級(jí)為100 /sbin/tc filter add dev eth2 parent 2:0 protocol ip prio 1 handle 2 fw classid 2:2 #給數(shù)據(jù)包打標(biāo)簽,可以通過RETURN方法避免遍歷所有的規(guī)則,加快處理速度 /sbin/iptables –t mangle –A PREROUTING –i eth0 –s 192.111.1.xxx –j MARK --set-mark 2 /sbin/iptables –t mangle –A PREROUTING –i eth0 –s 192.111.1.xxx –j RETURN #nat(參考) /sbin/iptables -t nat -A POSTROUTING -s 192.111.1.0/24 -o eth2 -j SNAT --to 外網(wǎng)IP #需要添加新的被限制ip的上傳帶寬,需要先要?jiǎng)?chuàng)建新的分類(比如2:3),然后根據(jù)新的分類創(chuàng)建新的sfq隊(duì)列,最后使用路由過濾器,過濾協(xié)議為ip,給原地址是需要限制的ip地址來的數(shù)據(jù)包打標(biāo)記。 需要對(duì)幾個(gè)ip限制下載帶寬,就需要?jiǎng)?chuàng)建幾個(gè)分類、隊(duì)列、路由過濾器、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 [color=red:7ae1fe0779]維護(hù)[/color:7ae1fe0779] 主要包括對(duì)隊(duì)列、分類、過濾器和路由的增添、修改和刪除。 增添動(dòng)作一般依照"隊(duì)列->分類->過濾器->路由"的順序進(jìn)行;修改動(dòng)作則沒有什么要求;刪除則依照"路由->過濾器->分類->隊(duì)列"的順序進(jìn)行。 #簡單顯示指定設(shè)備的隊(duì)列狀況 /sbin/tc qdisc ls dev eth0 #詳細(xì)顯示指定設(shè)備的隊(duì)列狀況 /sbin/tc –s qdisc ls dev eth0 #簡單顯示指定設(shè)備的分類狀況 /sbin/tc class ls dev eth0 #詳細(xì)顯示指定設(shè)備的分類狀況 /sbin/tc –s class ls dev eth0 #顯示過濾器的狀況 /sbin/tc –s filter ls dev eth0 #隊(duì)列的維護(hù) 一般對(duì)于一臺(tái)流量控制器來說,出廠時(shí)針對(duì)每個(gè)以太網(wǎng)卡均已配置好一個(gè)隊(duì)列了,通常情況下對(duì)隊(duì)列無需進(jìn)行增添、修改和刪除動(dòng)作了。 #分類的維護(hù) 增添 增添動(dòng)作通過tc class add命令實(shí)現(xiàn)。 修改 修改動(dòng)作通過tc class change命令實(shí)現(xiàn),如下所示: /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 對(duì)于bounded命令應(yīng)慎用,一旦添加后就進(jìn)行修改,只可通過刪除后再添加來實(shí)現(xiàn)。 #過濾器的維護(hù) 增添 增添動(dòng)作通過tc filter add命令實(shí)現(xiàn)。 修改 修改動(dòng)作通過tc filter change命令實(shí)現(xiàn),如下所示: /sbin/tc filter change dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2 刪除 刪除動(dòng)作通過tc filter del命令實(shí)現(xiàn),如下所示: /sbin/tc filter del dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2 |
|