利用TC進行流量控制

http://www.qqread.com/linux/2010/07/y494634.html


服務器:

eth0 綁定了外部地址 eth0:192.168.1.223

eth1 綁定了內部地址 eth1: 192.168.2.1


現在要實現的功能就是: 整個出口限制在512kbit(上傳流量) , 

                  192.168.2網段的(下載流量)512Kbit 。

方法如下:

  首先綁定相應的地址:(不細述)

  實現路由設定,使用iptables實現。

  iptables –A input -F

  iptables -A output -F

  iptables -A forward -F

  echo 1 > /proc/sys/net/ipv4/ip_forward

  #允許轉發

  iptables -A input –j accept

  iptables -A output -j accept

  iptables -A forward -j accept

  iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE

  #進行IP地址僞裝,使得內部的主機的數據包能通過服務器與外界聯繫。



進行流量管理


  tc qdisc add dev eth0 root tbf rate 512k lantency 50ms burst 1540

  #在網卡eth0上使用tbf(TokenBucket Filter)過濾隊列,將出口限制在512kbit,延遲50ms,突發數據1540,rate指定的數值就是限制的帶寬。

  

    繼續在eth1做限制。

  tc qdisc add dev eth1 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8

  #創建隊列,指明網卡爲100M網卡,這個跟流量限制無關,用於計算使用。


  tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 5Mbit weight 6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

  #創建根分類,帶寬限制在5Mbit,並且不允許借用別的帶寬。Prio 後面的參數爲優先級,指定數據包處理的順序。


  tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 512kbit weight 5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

  #在根類底下,創建分類1:3 限制帶寬爲512kbit,不允許借用帶寬,用於192.168.2網段。


  tc qdisc add dev eth1 parent 1:3 handle 30: sfq

  #在每個分類底下,創建隊列,使用 sfq(Stochastic Fareness Queueing)隨即公平隊列。


  tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.17.0.0/16 flowid 1:3

  #使用u32過濾器,對目的地址進行分類,對應已經創建的隊列。


  通過以上方式實現了簡單的流量控制,限制出口的上傳流量以及內口的下載流量。

  測試從 192.168.2.20 進行下載 限制的是 512kbit ,下載速率爲 64-65kB

  測試從 192.168.2.20 進行下載 限制的是 128kbit ,下載速率爲 14-16kB

  注:不匹配任何規則的數據包,將已root 設定的規則發送。



http://unix-cd.com/unixcd12/article_6034.html


需求:

目前公司專線帶寬爲4M,上下行對等,因近期內部人員使用P2P對網絡造成較大影響,所以現在進行流量控制(大部人禁止使用P2P下載,但一些管理人員不能限制,無奈之下只有採取流量控制)。

目的:

即保證ERP系統的運行,又不影響其它用戶的使用,換句話說,讓他們沒有感覺,同時達到了我們的目的。注:因爲TC只能限制發送數據包,所以下載在內網卡上進行,而上傳在外網卡上進行控制。

一、      下載設置

1、  規則 eth0爲內網卡,可以限制下載流量)

 

tc qdisc add dev eth0 root handle 2:0 htb default 30

tc class add dev eth0 parent 2:0 classid 2:1 htb rate 4Mbit burst 15k

tc class add dev eth0 parent 2:1 classid 2:10 htb rate 4Mbit burst 15k 最大流量4M

tc class add dev eth0 parent 2:1 classid 2:20 htb rate 2000kbit ceil 2Mbit burst 15k 最大流量2M

tc class add dev eth0 parent 2:1 classid 2:30 htb rate 1000kbit ceil 1000kbit burst 15k 最大流量1M

 

tc qdisc add dev eth0 parent 2:10 handle 10: sfq perturb 10

tc qdisc add dev eth0 parent 2:20 handle 20: sfq perturb 10

tc qdisc add dev eth0 parent 2:30 handle 30: sfq perturb 10

 

U32_1="tc filter add dev eth0 protocol ip parent 2:0 prio 1 u32"

$U32_1 match ip src 192.168.9.0/24 flowid 2:10 

192.168.9.0/24總公司ERP服務器所在網絡)

                       使訪問ERP服務器可用最大帶寬4M,優先級爲1


U32_2="tc filter add dev eth0 protocol ip parent 2:0 prio 2 u32"

$U32_2 match ip dst 192.168.1.172/32 flowid 2:20

$U32_2 match ip dst 192.168.1.82/32 flowid 2:20

$U32_2 match ip dst 192.168.1.200/32 flowid 2:20

                            以上3IP爲總經辦人員,限制他們下載流量爲2M,優先級爲2


tc filter add dev eth0 protocol ip parent 2:0 prio 3 u32 match ip dst 192.168.1.0/24 flowid 2:30 

(因爲有默認,此行可以省略,爲了規則更清晰,還是設置爲好)

                            以上只是設置默認情況下下載帶寬只有1000K,即將近1M優先級爲3

 

2、  注意事項:

優先級不要相同

二、      上傳設置

1、  規則 (eth1爲連接專線的網卡,可限制上傳帶寬)

 

iptables -F -t mangle

iptables -X -t mangle

iptables -Z -t mangle

iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.200/32 -j MARK --set-mark 1

iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.172/32 -j MARK --set-mark 1

iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.82/32 -j MARK --set-mark 1

 

        #iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.0/24 -j MARK --set-mark 2 (可以不用此條)

 

tc qdisc add dev eth1 root handle 1:0 htb default 30

tc class add dev eth1 parent 1:0 classid 1:1 htb rate 4Mbit burst 15k

tc class add dev eth1 parent 1:1 classid 1:10 htb rate 4Mbit burst 15k 最大上傳流量爲4M

tc class add dev eth1 parent 1:1 classid 1:20 htb rate 1000kbit ceil 2Mbit burst 15k 最大流量爲2M

tc class add dev eth1 parent 1:1 classid 1:30 htb rate 400kbit ceil 400kbit burst 15k 最大流量爲400K

 

tc qdisc add dev eth1 parent 1:10 handle 10: sfq perturb 10

tc qdisc add dev eth1 parent 1:20 handle 20: sfq perturb 10

tc qdisc add dev eth1 parent 1:30 handle 30: sfq perturb 10

 

U32="tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32"

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.9.0/24 flowid 1:10

                    以上規則使用達到ERP服務器的流量不受限制,也即最大可爲4M

tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 1 fw classid  1:20

                            以上規則使總經辦3IP地址的上傳流量爲2M

         #tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 2 fw classid  1:30 (因爲默認下使用此規則,所以可以省略)

                            默認下不符合以上兩規則的全部使用此規則,上傳帶寬最大爲400K(不要說我苛刻喲)

2、  注意事項

1)        因爲內部IP地址在經過外網卡時會進行NAT,所以不能用源地址進行U32匹配,只能是FW規則進行流量標識

2)        優先級一定不能相同,否則fw規則將失效

3)        以上規則可以放到一個文件內運行



http://apps.hi.baidu.com/share/detail/24629533

LIUNX 下TC流量控制命令詳解

tc - 顯示/維護流量控制設置 
摘要
tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ] 

tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ] 

tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific parameters ] flowid flow-id 

tc [-s | -d ] qdisc show [ dev DEV ] 

tc [-s | -d ] class show dev DEV tc filter show dev DEV 


簡介
Tc用於Linux內核的流量控制。流量控制包括以下幾種方式:

SHAPING(限制)
當流量被限制,它的傳輸速率就被控制在某個值以下。限制值可以大大小於有效帶寬,這樣可以平滑突發數據流量,使網絡更爲穩定。shaping(限制)只適用於向外的流量。 

SCHEDULING(調度)
通過調度數據包的傳輸,可以在帶寬範圍內,按照優先級分配帶寬。SCHEDULING(調度)也只適於向外的流量。 

POLICING(策略)
SHAPING用於處理向外的流量,而POLICIING(策略)用於處理接收到的數據。 

DROPPING(丟棄)
如果流量超過某個設定的帶寬,就丟棄數據包,不管是向內還是向外。 

流量的處理由三種對象控制,它們是:qdisc(排隊規則)、class(類別)和filter(過濾器)。 

QDISC(排隊規則)
QDisc(排隊規則)是queueing discipline的簡寫,它是理解流量控制(traffic control)的基礎。無論何時,內核如果需要通過某個網絡接口發送數據包,它都需要按照爲這個接口配置的qdisc(排隊規則)把數據包加入隊列。然後,內核會儘可能多地從qdisc裏面取出數據包,把它們交給網絡適配器驅動模塊。 
最簡單的QDisc是pfifo它不對進入的數據包做任何的處理,數據包採用先入先出的方式通過隊列。不過,它會保存網絡接口一時無法處理的數據包。 


CLASS(類)
某些QDisc(排隊規則)可以包含一些類別,不同的類別中可以包含更深入的QDisc(排隊規則),通過這些細分的QDisc還可以爲進入的隊列的數據包排隊。通過設置各種類別數據包的離隊次序,QDisc可以爲設置網絡數據流量的優先級。

FILTER(過濾器)
filter(過濾器)用於爲數據包分類,決定它們按照何種QDisc進入隊列。無論何時數據包進入一個劃分子類的類別中,都需要進行分類。分類的方法可以有多種,使用fileter(過濾器)就是其中之一。使用filter(過濾器)分類時,內核會調用附屬於這個類(class)的所有過濾器,直到返回一個判決。如果沒有判決返回,就作進一步的處理,而處理方式和QDISC有關。 
需要注意的是,filter(過濾器)是在QDisc內部,它們不能作爲主體。 


CLASSLESS QDisc(不可分類QDisc)
無類別QDISC包括: 
[p|b]fifo
使用最簡單的qdisc,純粹的先進先出。只有一個參數:limit,用來設置隊列的長度,pfifo是以數據包的個數爲單位;bfifo是以字節數爲單位。 
pfifo_fast
在編譯內核時,如果打開了高級路由器(Advanced Router)編譯選項,pfifo_fast就是系統的標準QDISC。它的隊列包括三個波段(band)。在每個波段裏面,使用先進先出規則。而三個波段(band)的優先級也不相同,band 0的優先級最高,band 2的最低。如果band裏面有數據包,系統就不會處理band 1裏面的數據包,band 1和band 2之間也是一樣。數據包是按照服務類型(Type of Service,TOS)被分配多三個波段(band)裏面的。 
red
red是Random Early Detection(隨機早期探測)的簡寫。如果使用這種QDISC,當帶寬的佔用接近於規定的帶寬時,系統會隨機地丟棄一些數據包。它非常適合高帶寬應用。 
sfq
sfq是Stochastic Fairness Queueing的簡寫。它按照會話(session--對應於每個TCP連接或者UDP流)爲流量進行排序,然後循環發送每個會話的數據包。 
tbf
tbf是Token Bucket Filter的簡寫,適合於把流速降低到某個值。 
不可分類QDisc的配置
如果沒有可分類QDisc,不可分類QDisc只能附屬於設備的根。它們的用法如下: 
tc qdisc add dev DEV root QDISC QDISC-PARAMETERS 

要刪除一個不可分類QDisc,需要使用如下命令: 

tc qdisc del dev DEV root 

一個網絡接口上如果沒有設置QDisc,pfifo_fast就作爲缺省的QDisc。 


CLASSFUL QDISC(分類QDisc)
可分類的QDisc包括: 
CBQ
CBQ是Class Based Queueing(基於類別排隊)的縮寫。它實現了一個豐富的連接共享類別結構,既有限制(shaping)帶寬的能力,也具有帶寬優先級管理的能力。帶寬限制是通過計算連接的空閒時間完成的。空閒時間的計算標準是數據包離隊事件的頻率和下層連接(數據鏈路層)的帶寬。 
HTB
HTB是Hierarchy Token Bucket的縮寫。通過在實踐基礎上的改進,它實現了一個豐富的連接共享類別體系。使用HTB可以很容易地保證每個類別的帶寬,雖然它也允許特定的類可以突破帶寬上限,佔用別的類的帶寬。HTB可以通過TBF(Token Bucket Filter)實現帶寬限制,也能夠劃分類別的優先級。 
PRIO
PRIO QDisc不能限制帶寬,因爲屬於不同類別的數據包是順序離隊的。使用PRIO QDisc可以很容易對流量進行優先級管理,只有屬於高優先級類別的數據包全部發送完畢,纔會發送屬於低優先級類別的數據包。爲了方便管理,需要使用iptables或者ipchains處理數據包的服務類型(Type Of Service,ToS)。 
操作原理
類(Class)組成一個樹,每個類都只有一個父類,而一個類可以有多個子類。某些QDisc(例如:CBQ和HTB)允許在運行時動態添加類,而其它的QDisc(例如:PRIO)不允許動態建立類。 
允許動態添加類的QDisc可以有零個或者多個子類,由它們爲數據包排隊。 

此外,每個類都有一個葉子QDisc,默認情況下,這個葉子QDisc使用pfifo的方式排隊,我們也可以使用其它類型的QDisc代替這個默認的QDisc。而且,這個葉子葉子QDisc有可以分類,不過每個子類只能有一個葉子QDisc。 

當一個數據包進入一個分類QDisc,它會被歸入某個子類。我們可以使用以下三種方式爲數據包歸類,不過不是所有的QDisc都能夠使用這三種方式。 

tc過濾器(tc filter)
如果過濾器附屬於一個類,相關的指令就會對它們進行查詢。過濾器能夠匹配數據包頭所有的域,也可以匹配由ipchains或者iptables做的標記。 
服務類型(Type of Service)
某些QDisc有基於服務類型(Type of Service,ToS)的內置的規則爲數據包分類。 
skb->priority
用戶空間的應用程序可以使用SO_PRIORITY選項在skb->priority域設置一個類的ID。 
樹的每個節點都可以有自己的過濾器,但是高層的過濾器也可以直接用於其子類。 
如果數據包沒有被成功歸類,就會被排到這個類的葉子QDisc的隊中。相關細節在各個QDisc的手冊頁中。 


命名規則
所有的QDisc、類和過濾器都有ID。ID可以手工設置,也可以有內核自動分配。 
ID由一個主序列號和一個從序列號組成,兩個數字用一個冒號分開。


QDISC
一個QDisc會被分配一個主序列號,叫做句柄(handle),然後把從序列號作爲類的命名空間。句柄採用象10:一樣的表達方式。習慣上,需要爲有子類的QDisc顯式地分配一個句柄。 

類(CLASS)
在同一個QDisc裏面的類分享這個QDisc的主序列號,但是每個類都有自己的從序列號,叫做類識別符(classid)。類識別符只與父QDisc有關,和父類無關。類的命名習慣和QDisc的相同。 

過濾器(FILTER)
過濾器的ID有三部分,只有在對過濾器進行散列組織纔會用到。詳情請參考tc-filters手冊頁。 
單位
tc命令的所有參數都可以使用浮點數,可能會涉及到以下計數單位。 
帶寬或者流速單位: 

kbps
千字節/秒 
mbps
兆字節/秒 
kbit
KBits/秒 
mbit
MBits/秒 
bps或者一個無單位數字
字節數/秒 
數據的數量單位: 

kb或者k
千字節 
mb或者m
兆字節 
mbit
兆bit 
kbit
千bit 
b或者一個無單位數字
字節數 
時間的計量單位: 
s、sec或者secs
秒 
ms、msec或者msecs
分鐘 
us、usec、usecs或者一個無單位數字
微秒 

TC命令
tc可以使用以下命令對QDisc、類和過濾器進行操作: 
add
在一個節點裏加入一個QDisc、類或者過濾器。添加時,需要傳遞一個祖先作爲參數,傳遞參數時既可以使用ID也可以直接傳遞設備的根。如果要建立一個QDisc或者過濾器,可以使用句柄(handle)來命名;如果要建立一個類,可以使用類識別符(classid)來命名。 

remove
刪除有某個句柄(handle)指定的QDisc,根QDisc(root)也可以刪除。被刪除QDisc上的所有子類以及附屬於各個類的過濾器都會被自動刪除。 

change
以替代的方式修改某些條目。除了句柄(handle)和祖先不能修改以外,change命令的語法和add命令相同。換句話說,change命令不能一定節點的位置。 

replace
對一個現有節點進行近於原子操作的刪除/添加。如果節點不存在,這個命令就會建立節點。 

link
只適用於DQisc,替代一個現有的節點。 

歷史
tc由Alexey N. Kuznetsov編寫,從Linux 2.2版開始併入Linux內核。 
SEE ALSO
tc-cbq(8)、tc-htb(8)、tc-sfq(8)、tc-red(8)、tc-tbf(8)、tc-pfifo(8)、tc-bfifo(8)、tc-pfifo_fast(8)、tc-filters(8) 


發佈了28 篇原創文章 · 獲贊 26 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章