實(shí)戰(zhàn)應(yīng)用:使用Linux TC進(jìn)行流量安全管理
Linux從kernel 2.1.105開始支持QoS(服務(wù)質(zhì)量),不過,需要重新編譯內(nèi)核。具體步驟為:
(1)運(yùn)行 make config命令時(shí),將EXPERIMENTAL_OPTIONS選項(xiàng)設(shè)置成y;
(2)將 Class Based Queueing (CBQ)、Token Bucket Flow、Traffic Shapers選項(xiàng)設(shè)置為y;
(3)運(yùn)行make dep; make clean; make bzimage,生成新的內(nèi)核。
在Linux中流量控制器(TC)主要是在輸出端口處建立一個(gè)隊(duì)列進(jìn)行流量控制,控制的方式是基于路由,亦即基于目的IP地址或目的子網(wǎng)的網(wǎng)絡(luò)號(hào)的流量控制。流量控制器TC,其基本的功能模塊為隊(duì)列、分類和過濾器。Linux內(nèi)核中支持的隊(duì)列有,Class Based Queue ,Token Bucket Flow ,CSZ ,F(xiàn)irst In First Out ,Priority ,TEQL ,SFQ ,ATM ,RED。由于目前網(wǎng)絡(luò)流量種類繁多,網(wǎng)絡(luò)管理員在管理時(shí)通常都采用分類的方式進(jìn)行,因此,本文所介紹的隊(duì)列與分類都是基于CBQ(Class Based Queue)的,而過濾器是基于路由(Route)的,其他的分類方式和過濾器使用方式請(qǐng)參看相關(guān)的技術(shù)文獻(xiàn)。
配置和使用流量控制器TC,主要分以下幾個(gè)方面:分別為建立隊(duì)列、建立分類、建立過濾器和建立路由,另外還需要對(duì)現(xiàn)有的隊(duì)列、分類、過濾器和路由進(jìn)行監(jiān)視。其基本使用步驟為:
(1)針對(duì)網(wǎng)絡(luò)物理設(shè)備綁定一個(gè)CBQ隊(duì)列;
(2)在該隊(duì)列上建立分類;
(3)為每一分類建立一個(gè)基于路由的過濾器;
(4)最后與過濾器相配合,建立特定的路由表#p#
使用Linux TC進(jìn)行流量控制實(shí)例
實(shí)例環(huán)境及拓?fù)?/strong>
在一個(gè)局域網(wǎng)中(如圖1所示),我們?cè)O(shè)定流量控制器上的以太網(wǎng)卡(設(shè)備名為eth0)的IP地址為10.172.4.66,在其上建立一個(gè)CBQ隊(duì)列。假設(shè)包的平均大小為1K字節(jié),包間隔發(fā)送單元的大小為8字節(jié),可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié)。假如有三種類型的流量需要控制:
(1)發(fā)往主機(jī)1的流量,其IP地址設(shè)定為10.172.4.138。其流量帶寬控制在500Mbit,優(yōu)先級(jí)為2;
(2)是發(fā)往主機(jī)2的,其IP地址為10.172.4.141。其流量帶寬控制在200Mbit,優(yōu)先級(jí)為1;
(3)是發(fā)往子網(wǎng)1的,其子網(wǎng)號(hào)為10.172.4.0,子網(wǎng)掩碼為255.255.255.0。流量帶寬控制在300Mbit,優(yōu)先級(jí)為6。
那么,根據(jù)上面的實(shí)例條件,我們可以采用如下的步驟進(jìn)行TC配置和控制:
圖1 Linux TC流量控制示意圖
1.綁定CBQ隊(duì)列
一般情況下,針對(duì)一個(gè)網(wǎng)卡只需建立一個(gè)隊(duì)列:
將一個(gè)cbq隊(duì)列綁定到網(wǎng)絡(luò)物理設(shè)備eth0上,其編號(hào)為1:0;網(wǎng)絡(luò)物理設(shè)備eth0的實(shí)際帶寬為1000Mbit,包的平均大小為1000字節(jié);包間隔發(fā)送單元的大小為8字節(jié),最小傳輸包大小為64字節(jié)。
#tc qdisc add dev eth0 root handle 1: cbq bandwidth 1000Mbit avpkt 1000 cell 8 mpu 64
2.為隊(duì)列建立分類
分類建立在隊(duì)列之上。一般情況下,針對(duì)一個(gè)隊(duì)列需建立一個(gè)根分類,然后再在其上建立子分類。對(duì)于分類,按其分類的編號(hào)順序起作用,編號(hào)小的優(yōu)先;一旦符合某個(gè)分類匹配規(guī)則,通過該分類發(fā)送數(shù)據(jù)包,則其后的分類不再起作用。
(1)創(chuàng)建根分類1:1;分配帶寬為1000Mbit,優(yōu)先級(jí)別為8。
#tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 1000Mbit rate 1000Mbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 100Mbit
該隊(duì)列的最大可用帶寬為1000Mbit,實(shí)際分配的帶寬為1000Mbit,可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為8,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為100Mbit。
(2)創(chuàng)建分類1:2,其父分類為1:1,分配帶寬為500Mbit,優(yōu)先級(jí)別為2。
#tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 1000Mbit rate 500Mbit maxburst 20 allot 1514 prio 2 avpkt 1000 cell 8 weight 50Mbit split 1:0 bounded
該隊(duì)列的最大可用帶寬為1000Mbit,實(shí)際分配的帶寬為500Mbit,可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為1,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為50Mbit,分類的分離點(diǎn)為1:0,且不可借用未使用帶寬。
(3)創(chuàng)建分類1:3,其父分類為1:1,分配帶寬為200Mbit,優(yōu)先級(jí)別為1。
#tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 1000Mbit rate 200Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 20Mbit split 1:0
該隊(duì)列的最大可用帶寬為1000Mbit,實(shí)際分配的帶寬為200Mbit,可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為2,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為20Mbit,分類的分離點(diǎn)為1:0。
(4)創(chuàng)建分類1:4,其父分類為1:1,分配帶寬為300Mbit,優(yōu)先級(jí)別為6。
#tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 1000Mbit rate 300Mbit maxburst 20 allot 1514 prio 6 avpkt 1000 cell 8 weight 30Mbit split 1:0
該隊(duì)列的最大可用帶寬為1000Mbit,實(shí)際分配的帶寬為300Mbit,可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為1,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為30Mbit,分類的分離點(diǎn)為1:0。#p#
3.建立過濾器
過濾器主要服務(wù)于分類。一般只需針對(duì)根分類提供一個(gè)過濾器,然后為每個(gè)子分類提供路由映射。
(1)應(yīng)用路由分類器到cbq隊(duì)列的根,父分類編號(hào)為1:0;過濾協(xié)議為ip,優(yōu)先級(jí)別為100,過濾器為基于路由表。
#tc filter add dev eth0 parent 1:0 protocol ip prio 100 route
(2)建立路由映射分類1:2, 1:3, 1:4
#tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2
#tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 3 flowid 1:3
#tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 4 flowid 1:4
4.建立與過濾器對(duì)應(yīng)的路由
該路由是與前面所建立的路由映射一一對(duì)應(yīng)。
1) 發(fā)往主機(jī)10.172.4.138的數(shù)據(jù)包通過分類2轉(zhuǎn)發(fā)(分類2的速率500Mbit)
#ip route add 10.172.4.138 dev eth0 via 10.172.4.66 realm 2
2) 發(fā)往主機(jī)10.172.4.30的數(shù)據(jù)包通過分類3轉(zhuǎn)發(fā)(分類3的速率200Mbit)
#ip route add 10.172.4.30 dev eth0 via 10.172.4.66 realm 3
3)發(fā)往子網(wǎng)10.172.4.0/24的數(shù)據(jù)包通過分類4轉(zhuǎn)發(fā)(分類4的速率300Mbit)
#ip route add 10.172.4.0/24 dev eth0 via 10.172.4.66 realm 4
在配置路由時(shí)特別值得注意的是:一般對(duì)于流量控制器所直接連接的網(wǎng)段建議使用IP主機(jī)地址流量控制限制,不要使用子網(wǎng)流量控制限制。如一定需要對(duì)直連子網(wǎng)使用子網(wǎng)流量控制限制,則在建立該子網(wǎng)的路由映射前,需將原先由系統(tǒng)建立的路由刪除,才可完成相應(yīng)步驟。#p#
5.對(duì)上述建立的機(jī)制進(jìn)行查看
主要包括對(duì)現(xiàn)有隊(duì)列、分類、過濾器和路由的狀況進(jìn)行查看。
(1)顯示隊(duì)列的狀況
簡(jiǎn)單顯示指定設(shè)備(這里為eth0)的隊(duì)列狀況
#tc qdisc ls dev eth0
qdisc cbq 1: rate 1000Mbit (bounded,isolated) prio no-transmit
詳細(xì)顯示指定設(shè)備(這里為eth0)的隊(duì)列狀況
#tc -s qdisc ls dev eth0
qdisc cbq 1: rate 1000Mbit (bounded,isolated) prio no-transmit
Sent 7646731 bytes 13232 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 31 undertime 0
這里主要顯示了通過該隊(duì)列發(fā)送了13232個(gè)數(shù)據(jù)包,數(shù)據(jù)流量為7646731個(gè)字節(jié),丟棄的包數(shù)目為0,超過速率限制的包數(shù)目為0。
(2)顯示分類的狀況
簡(jiǎn)單顯示指定設(shè)備(這里為eth0)的分類狀況
#tc class ls dev eth0
class cbq 1: root rate 1000Mbit (bounded,isolated) prio no-transmit
class cbq 1:1 parent 1: rate 10Mbit prio no-transmit #no-transmit表示優(yōu)先級(jí)為8
class cbq 1:2 parent 1:1 rate 500Mbit prio 2
class cbq 1:3 parent 1:1 rate 200Mbit prio 1
class cbq 1:4 parent 1:1 rate 300Mbit prio 6
詳細(xì)顯示指定設(shè)備(這里為eth0)的分類狀況
#tc -s class ls dev eth0
class cbq 1: root rate 1000Mbit (bounded,isolated) prio no-transmit
Sent 17725304 bytes 32088 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 31 undertime 0
class cbq 1:1 parent 1: rate 1000Mbit prio no-transmit
Sent 16627774 bytes 28884 pkts (dropped 0, overlimits 0)
borrowed 16163 overactions 0 avgidle 587 undertime 0
class cbq 1:2 parent 1:1 rate 500Mbit prio 2
Sent 628829 bytes 3130 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 4137 undertime 0
class cbq 1:3 parent 1:1 rate 200Mbit prio 1
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 159654 undertime 0
class cbq 1:4 parent 1:1 rate 300Mbit prio 6
Sent 5934679 bytes 9354 pkts (dropped 0, overlimits 0)
borrowed 3797 overactions 0 avgidle 159557 undertime 0
這里主要顯示了通過不同分類發(fā)送的數(shù)據(jù)包,數(shù)據(jù)流量,丟棄的包數(shù)目,超過速率限制的包數(shù)目等等。其中根分類(class cbq 1:0)的狀況應(yīng)與隊(duì)列的狀況類似。
例如,分類class cbq 1:4發(fā)送了9354個(gè)數(shù)據(jù)包,數(shù)據(jù)流量為5934679個(gè)字節(jié),丟棄的包數(shù)目為0,超過速率限制的包數(shù)目為0。
(3)顯示過濾器的狀況
#tc -s filter ls dev eth0
filter parent 1: protocol ip pref 100 route
filter parent 1: protocol ip pref 100 route fh 0xffff0002 flowid 1:2 to 2
filter parent 1: protocol ip pref 100 route fh 0xffff0003 flowid 1:3 to 3
filter parent 1: protocol ip pref 100 route fh 0xffff0004 flowid 1:4 to 4
這里flowid 1:2代表分類class cbq 1:2,to 2代表通過路由2發(fā)送。
(4)顯示現(xiàn)有路由的狀況
#ip route
10.172.4.66 dev eth0 scope link
10.172.4.138 via 10.172.4.66 dev eth0 realm 2
10.172.4.30 via 10.172.4.66 dev eth0 realm 3
10.172.4.0/24 via 10.172.4.66 dev eth0 realm 4
10.172.4.0/24 dev eth0 proto kernel scope link src 10.172.4.66
172.16.1.0/24 via 10.172.4.66 dev eth0 scope link
127.0.0.0/8 dev lo scope link
default via 10.172.4.254 dev eth0
#p#
6.隊(duì)列、分類、過濾器及路由維護(hù)
上面我們通過一個(gè)完整的例子示意了使用Linux的TC進(jìn)行流量控制的全過程。不難看出,該技術(shù)主要包括如上步驟。而在日常的網(wǎng)絡(luò)管理過程中,網(wǎng)管員還需要對(duì)TC的隊(duì)列、分類、過濾器和路由進(jìn)行相應(yīng)的增添、修改和刪除等操作,以保證流量控制能夠因時(shí)、因地、因應(yīng)用制宜??赡苡玫降南鄳?yīng)的命令如下所示:
tc class add命令:添加分類;
tc class change命令:修改分類;
tc filter add命令:添加過濾器;
tc filter change命令:修改過濾器;
tc filter del命令:刪除過濾器;
ip route add命令:添加與過濾器對(duì)應(yīng)的路由;
ip route change命令:修改與過濾器對(duì)應(yīng)的路由;
ip route del命令:刪除與過濾器對(duì)應(yīng)的路由。