Linux下使用TrafficControl對流量進行控制
1 模擬延遲傳輸簡介
netem 與 tc: netem 是 Linux 2.6 及以上核心版本提供的一個網路模擬功能模組。該功能模組可以用來在效能良好的區域網中,模擬出複雜的網際網路傳輸效能,諸如低頻寬、傳輸延遲、丟包等等情況。使用 Linux 2.6 (或以上) 版本核心的很多發行版 Linux 都開啟了該核心功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系統中的一個工具,全名為 traffic control(流量控制)。tc 可以用來控制 netem 的工作模式,也就是說,如果想使用 netem ,需要至少兩個條件,一個是核心中的 netem 功能被包含,另一個是要有 tc 。
需要注意的是:本文介紹的流控只能控制發包動作,不能控制收包動作,同時,它直接對物理介面生效,如果控制了物理的 eth0,那麼邏輯網絡卡(比如 eth0:1)也會受到影響,反之,如果您在邏輯網絡卡上做控制,該控制可能是無效的。(注:虛擬機器中的多個網絡卡可以在虛擬機器中視為多個物理網絡卡)。
# tc qdisc add dev eth0 root netem delay 100ms
該命令將 eth0 網絡卡的傳輸設定為延遲 100 毫秒傳送。易寶支付有限公司
更真實的情況下,延遲值不會這麼精確,會有一定的波動,我們可以用下面的情況來模擬出
帶有波動性的延遲值:
# tc qdisc add dev eth0 root netem delay 100ms 10ms
該命令將 eth0 網絡卡的傳輸設定為延遲 100ms ± 10ms (90 ~ 110 ms 之間的任意值)傳送。
還可以更進一步加強這種波動的隨機性: # tc qdisc add dev eth0 root netem delay 100ms 10ms 30%
該命令將 eth0 網絡卡的傳輸設定為 100ms ,同時,大約有 30% 的包會延遲 ± 10ms 傳送。示例:現在 ping 一下 216 機器:
易寶支付有限公司
可以看出資料明顯的波動性。 3 模擬網路丟包: # tc qdisc add dev eth0 root netem loss 1%
該命令將 eth0 網絡卡的傳輸設定為隨機丟掉 1% 的資料包。示例:在 216 上執行
#tc qdisc add dev eth0 root netem loss 10%
顯示 16 個包只有 13 個收到了。也可以設定丟包的成功率:
# tc qdisc add dev eth0 root netem loss 1% 30%
該命令將 eth0 網絡卡的傳輸設定為隨機丟掉 1% 的資料包,成功率為 30% 。
4.刪除網絡卡上面的相關配置:將之前命令中的 add 改為 del 即可刪除配置:
# tc qdisc del dev eth0 XXXXXXXXXXX(自己加的配置)該命令將 刪除 eth0 網絡卡的相關傳輸配置
至此,我們已經可以通過 TC 在測試環境中模擬一定的網路延時和丟包的情況。下面是關於tc 更多的應用和介紹
5 模擬包重複: # tc qdisc add dev eth0 root netem duplicate 1%
該命令將 eth0 網絡卡的傳輸設定為隨機產生 1% 的重複資料包 。6 模擬資料包損壞:
# tc qdisc add dev eth0 root netem corrupt 0.2%
該命令將 eth0 網絡卡的傳輸設定為隨機產生 0.2% 的損壞的資料包 。 (核心版本需在 2.6.16 以上)
7 模擬資料包亂序: # tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
該命令將 eth0 網絡卡的傳輸設定為:有 25% 的資料包(50%相關)會被立即傳送,其他的延遲10 秒。
新版本中,如下命令也會在一定程度上打亂髮包的次序:# tc qdisc add dev eth0 root netem delay 100ms 10ms
8 檢視已經配置的網路條件:# tc qdisc show dev eth0
該命令將 檢視並顯示 eth0 網絡卡的相關傳輸配置9 附錄:TC 流量控制
TC 是一個流量控制的工具,下面轉了一篇關於 TC 流量控制的文章。TC 介紹
在 linux 中,TC 有二種控制方法 CBQ 和 HTB.HTB 是設計用來替換 CBQ 的。它是一個層次式的過濾框架.
TC 包括三個基本的構成塊:
佇列規定 qdisc(queueing discipline )、類(class)和分類器(Classifiers)
TC 中的佇列(queueing discipline): 用來實現控制網路的收發速度.通過佇列,linux 可以將網路資料包快取起來,然後根據使用者的
設定,在儘量不中斷連線(如 TCP)的前提下來平滑網路流量.需要注意的是,linux 對接收佇列的控制不夠好,所以我們一般只用傳送佇列,即“控發不控收”.它封裝了其他兩個主要 TC 元件(類和分類器)。核心如果需要通過某個網路介面傳送資料包,它都需要按照為這個介面配置的 qdisc(排隊規則)把資料包加入佇列。然後,核心會 儘可能多地從 qdisc 裡面取出資料包,把它們交給網路介面卡驅動模組。
最簡單的 QDisc 是 pfifo 它不對進入的資料包做任何的處理,資料包採用先入先出的方式通過佇列。不過,它會儲存網路介面一時無法處理的資料包。 佇列規則包括 FIFO(先進先出),RED(隨機早期探測),SFQ(隨機公平佇列)和令牌桶(Token Bucket),類基佇列(CBQ),CBQ 是一種超級佇列,即它能夠包含其它佇列(甚至其它 CBQ)。
TC 中的 Class 類 class 用來表示控制策略.很顯然,很多時候,我們很可能要對不同的 IP 實行不同的流量控制策略,這時候我們就得用不同的 class 來表示不同的控制策略了.
TC 中的 Filter 規則 filter 用來將使用者劃入到具體的控制策略中(即不同的 class 中).比如,現在,我們想對 xxa,xxb兩個 IP 實行不同的控制策略(A,B),這時,我們可用 filter 將 xxa 劃入到控制策略 A,將 xxb 劃入到控制策略 B,filter 劃分的標誌位可用 u32 打標功能或 IPtables 的 set-mark (大多使用iptables 來做標記)功能來實現。 目前,TC 可以使用的過濾器有:fwmark 分類器,u32 分類器,基於路由的分類器和 RSVP分類器(分別用於 IPV6、IPV4)等;其中,fwmark 分類器允許我們使用 Linux netfilter 程式碼選擇流量,而 u32 分類器允許我們選擇基於 ANY 頭的流量 .需要注意的是,filter (過濾器)是在 QDisc 內部,它們不能作為主體。
TC 的應用流程 資料包->iptables(在通過 iptables 時,iptables 根據不同的 ip 來設定不同的 mark)->TC(class)-
>TC(queue)
應用
假設 eth0 位是伺服器的外網網路介面。開始之前,先要清除 eth0 所有佇列規則
tc qdisc del dev eth0 root 2> /dev/null > /dev/null1) 定義最頂層(根)佇列規則,並指定 default 類別編號
tc qdisc add dev eth0 root handle 1: htb default 2易寶支付有限公司
2) 定義第一層的 1:1 類別 (速度)本來是要多定義第二層葉類別,但目前來看,這個應用中就可以了.
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 98mbit ceil 100mbit prio 2 tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1mbit ceil 2mbit prio 2 注:以上就是我們控制輸出伺服器的速度,一個為 98M,一個為 2M. rate: 是一個類保證得到的頻寬值.如果有不只一個類,請保證所有子類總和是小於或等於父類.prio:用來指示借用頻寬時的競爭力,prio 越小,優先順序越高,競爭力越強. ceil: ceil 是一個類最大能得到的頻寬值.
同時為了不使一個會話永佔頻寬,新增隨即公平佇列 sfq. tc qdisc add dev eth0 parent 1:2 handle 2: sfq perturb 10 tc qdisc
add dev eth0 parent 1:3 handle 3: sfq perturb 10 3) 設定過濾器 過濾器可以使用本身的 u32 也可以使用 iptables 來打上標記 指定在 root 類 1:0 中,對 192..168.0.2 的過濾,使用 1:2 的規則,來給他 98M 的速度,寫法就如下
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.2 flowid 1:2 tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.1 flowid 1:3 如果是所有 ip 寫法就如 tc filter add dev eth0 protocol ip parent 1: prio 50 u32 match ip
dst 0.0.0.0/0 flowid 1:10使用 Iptables 來配合過濾器
還可以使用這個方法,但需要藉助下面的 iptables 的命令來做標記了
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:2 tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:3 iptables 只要打上記號就行了
iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j MARK --set- mark 10 iptables -t mangle -A POSTROUTING -d 192.168.0.3 -j MARK --set-mark 20 TC 對最對高速度的控制 Rate ceiling 速率限度 引數 ceil 指定了一個類可以用的最大頻寬, 用來限制類可以借用多少頻寬.預設的 ceil 是和速率一樣 這個特性對於 ISP 是很有用的, 因為他們一般限制被服務的使用者的總量即使其他使用者沒有請求服務.(ISPS 很想使用者付更多的錢得到更好的服務) ,注根類是不允許被借用的, 所以沒有指定 ceil
易寶支付有限公司
注: ceil 的數值應該至少和它所在的類的速率一樣高, 也就是說 ceil 應該至少和它的任何一個子類一樣高
Burst 突發 網路硬體只能在一個時間傳送一個包這僅僅取決於一個硬體的速率. 鏈路共享軟體可以利用這個能力動態產生多個連線執行在不同的速度. 所以速率和 ceil 不是一個即時度量只是一個在一個時間裡傳送包的平均值. 實際的情況是怎樣使一個流量很小的類在某個時間類以最大的速率提供給其他類. burst 和 cburst 引數控制多少資料可以以硬體最大的速度不費力的傳送給需要的其他類. 如果 cburst 小於一個理論上的資料包他形成的突發不會超過 ceil 速率, 同樣的方法 TBF 的最高速率也是這樣. 你可能會問, 為什麼需要 bursts . 因為它可以很容易的提高嚮應速度在一個很擁擠的鏈路上.比如 WWW 流量是突發的. 你訪問主頁. 突發的獲得並閱讀. 在空閒的時間 burst 將再"charge"一次. 注: burst 和 cburst 至少要和其子類的值一樣大.
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 specificparameters ]
tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priorityfiltertype [ 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 的狀態 tc -s -d qdisc show dev eth0tc -s -d class show dev eth0
刪除tc規則 tc qdisc del dev eth0 root
例項 使用 TC 下載限制單個 IP 進行速度控制
tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev eth0 parent 1: classid 1:1 htb rate 30mbit ceil 60mbit tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.2 flowid 1:1 就可以限制 192.168.1.2 的下載速度為 30Mbit 最高可以 60Mbit ,其中 r2q,是指沒有 default 的root,使整個網路的頻寬沒有限制
使用 TC 對整段 IP 進行速度控制 tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev
易寶支付有限公司
eth0 parent 1: classid 1:1 htb rate 50mbit ceil 1000mbit tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.0/24 flowid 1:1 就可以限制 192.168.111.0 到 255 的頻寬為 3000k 了,實際下載速度為 200k 左右。這種情況下,這個網段所有機器共享這 200k 的頻寬。 還可以加入一個 sfq(隨機公平佇列)
tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev eth0 parent 1: classid 1:1 htb rate 3000kbit burst 10k tc qdisc add dev eth0 parent 1:1 handle 10: sfq perturb 10 tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.168 flowid 1:1 sfq,他可以防止一個段內的一個 ip 佔用整個頻寬。使用 TC 控制伺服器對外的速度為 10M
如下,我要管理一臺伺服器,只能向外發 10M 的資料
tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1:htb tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbitceil 100mbit tc class add dev eth0 parent 1:1 classid 1:10 htbrate 10mbit ceil 10mbit tc qdisc add dev eth0 parent 1:10 sfqperturb 10 tc filter add dev eth0 protocol ip parent 1: prio 2u32 match ip dst 220.181.xxx.xx/32 flowid 1:1 # 上面這臺,讓220.181.xxx.xx/32 這臺跑預設的,主要是為了讓這個 ip 連線進來不被控制 tcfilter add dev eth0 protocol ip parent 1: prio 50 u32 match ip dst0.0.0.0/0 flowid 1:10 # 預設讓所有的流量都從這個通過 --------------------- 原文:https://blog.csdn.net/weiweicao0429/article/details/17578011