Linux 高級(jí)流量控制本篇主要講用 TC 對(duì) Linux 進(jìn)行高級(jí)流量控制 通過大量實(shí)踐結(jié)合 TC 流控 HOWTO 文檔整理而得 如果你對(duì) Linux 流控感興趣,如果你需要搭建高性能的 Linux 網(wǎng)關(guān) , 本文將會(huì)使你受益頗多。 注:至少具備 Linux OS 的中級(jí)水平知識(shí),熟悉 TCP/IP, Linux 網(wǎng)卡工作原理,以及配置 Linux 網(wǎng)關(guān)的經(jīng)驗(yàn),將有助于對(duì)本文的理解。 本文參考文檔: Tc 流控 HOWTO 文檔 http://www./HOWTO/html_single/Traffic-Control-HOWTO/ Linux TC 流量控制工具 http://wenku.baidu.com/view/f02078db50e2524de5187e45.html 一 . Linux 流控簡(jiǎn)介Linux 流控的意義 : 有效的控制 Linux 網(wǎng)卡進(jìn)出流量 , 了解網(wǎng)卡工作原理 , 搭建高性能的 Linux 網(wǎng)關(guān) , 對(duì) Linux 高級(jí)系統(tǒng)流控有進(jìn)一步的認(rèn)識(shí)。 Linux 流量控制方法 : 控發(fā)不控收 , 所以只能對(duì)產(chǎn)生瓶頸網(wǎng)卡處的發(fā)包速率進(jìn)行控制 , 而網(wǎng)絡(luò)瓶頸分析亦為 Linux 網(wǎng)絡(luò)流控的第一步 . Linux 流量控制過程分二種:
Linux 流控實(shí)現(xiàn)工具 TC: Linux 下流量控制工具 , 從 Linux2.2 版開始已并入內(nèi)核,功能非常強(qiáng)大, 詳見參考文檔。 二 . 以下文章將以二種算法的不同流控分別介紹:1. 無類算法 SFQa. 隊(duì)列控制的無類算法 SFQ SFQ(Stochastic Fairness Queueing 隨機(jī)公平隊(duì)列 ) 是公平隊(duì)列算法家族中的一個(gè)簡(jiǎn)單實(shí)現(xiàn) . 它的精確性不如其它的方法 , 但實(shí)現(xiàn)了高度的公平 , 需要的計(jì)算量亦很少 . SFQ 算法主要針對(duì)一個(gè) TCP 會(huì)話或者 UDP 流 . 流量被分成相當(dāng)多數(shù)量的 FIFO 隊(duì)列中 , 每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)會(huì)話 . 數(shù)據(jù)按照簡(jiǎn)單輪轉(zhuǎn)的方式發(fā)送 , 每個(gè)會(huì)話都按順序得到發(fā)送機(jī)會(huì) . 這種方式非常公平 , 保證了每一個(gè)會(huì)話都不會(huì)沒其它會(huì)話所淹沒 . SFQ 之所以被稱為"隨機(jī)", 是因?yàn)樗⒉皇钦娴臑槊恳粋€(gè)會(huì)話創(chuàng)建一個(gè)隊(duì)列 , 而是使用一個(gè)散列算法 , 把所有的會(huì)話映射到有限的幾個(gè)隊(duì)列中去 . 因?yàn)槭褂昧松⒘?, 所以可能多個(gè)會(huì)話分配在同一個(gè)隊(duì)列里 , 從而需要共享發(fā)包的機(jī)會(huì) , 也就是共享帶寬 . 為了不讓這種效應(yīng)太明顯 ,SFQ 會(huì)頻繁地改變散列算法 , 以便把這種效應(yīng)控制在幾秒鐘之內(nèi) ( 時(shí)間由參數(shù)設(shè)定 ). 注 :SFQ 只會(huì)發(fā)生在數(shù)據(jù)發(fā)生擁堵 , 產(chǎn)生等待隊(duì)列的網(wǎng)卡上 .. 出口網(wǎng)卡若無等待隊(duì)列 ,SFQ 亦不起作用 ... 清單 1. 在網(wǎng)卡上建立 SFQ#tc qdisc add dev eth0 root handle 1: sfq SFQ 參數(shù)有 perturb( 重新調(diào)整算法間隔 ) quantum 基本上不需要手工調(diào)整 : handle 1: 規(guī)定算法編號(hào) .. 可以不用設(shè)置由系統(tǒng)指定 .. #tc qdisc sh dev eth0 顯示算法 #tc qd del dev eth0 root 刪除 注 : 默認(rèn) eht0 支持 TOS SFQ 隊(duì)列一般用在樹葉級(jí) , 配合其它流量整形算法一并使用…… b. 流量控制的無類算法 TBF 令牌桶過濾器 (TBF) 是一個(gè)簡(jiǎn)單的隊(duì)列規(guī)定 : 只允許以不超過事先設(shè)定的速率到來的數(shù)據(jù)包通過 , 但可能允許短暫突發(fā)流量朝過設(shè)定值 . TBF 很精確 , 對(duì)于網(wǎng)絡(luò)和處理器的影響都很小 , 實(shí)現(xiàn)是針對(duì)數(shù)據(jù)的字節(jié)數(shù)進(jìn)行的 , 而不是針對(duì)數(shù)據(jù)包進(jìn)行 , 常用于網(wǎng)關(guān)限速 . TBF 的實(shí)現(xiàn)在于一個(gè)緩沖器 ( 桶 ), 不斷地被一些叫做"令牌"的虛擬數(shù)據(jù)以特定速率填充著 . (token rate). 桶最重要的參數(shù)就是它的大小 , 也就是它能夠存儲(chǔ)令牌的數(shù)量 . 每個(gè)到來的令牌從數(shù)據(jù)隊(duì)列中收集一個(gè)數(shù)據(jù)包 , 然后從桶中被刪除 . 這個(gè)算法關(guān)聯(lián)到兩個(gè)流上——令牌流和數(shù)據(jù)流 , 于是我們得到 3 種情景 : A. 數(shù)據(jù)流以等于令牌流的速率到達(dá) TBF. 這種情況下 , 每個(gè)到來的數(shù)據(jù)包都能對(duì)應(yīng)一個(gè)令牌 , 然后無延遲地通過隊(duì)列 . B. 數(shù)據(jù)流以小于令牌流的速度到達(dá) TBF. 通過隊(duì)列的數(shù)據(jù)包只消耗了一部分令牌 , 剩下的令牌會(huì)在桶里積累下來 , 直到桶被裝滿 . 剩下的令牌可以在需要以高于令牌流速率發(fā)送數(shù)據(jù)流的時(shí)候消耗掉 , 這種情況下會(huì)發(fā)生突發(fā)傳輸 . C. 數(shù)據(jù)流以大于令牌流的速率到達(dá) TBF. 這意味著桶里的令牌很快就會(huì)被耗盡 . 導(dǎo)致 TBF 中斷一段時(shí)間 , 稱為"越限". 如果數(shù)據(jù)包持續(xù)到來 , 將發(fā)生丟包 . 此種情況最重要 , 因?yàn)樗梢杂脕韺?duì)數(shù)據(jù)通過過濾器的速率進(jìn)行整形 . 令牌的積累可以導(dǎo)致越限的數(shù)據(jù)進(jìn)行短時(shí)間的突發(fā)傳輸而不必丟包 , 但是持續(xù)越限的話會(huì)導(dǎo)致傳輸延遲直至丟包 . 清單 2. 在網(wǎng)卡建立 TBF#tc qd add dev eth1 root handle 1: tbf rate 256kbit burst 10000 latency 50ms
速率 256kbit 突發(fā)傳輸 10k 最大延遲 50ms
#tc -s qd sh dev eth1 統(tǒng)計(jì)
#tc qd del dev eth1 root 刪除rate 限制的傳輸速率 用位來計(jì)算 latency 確定了一個(gè)包在 TBF 中等待傳輸?shù)淖铋L(zhǎng)等待時(shí)間 . burst 桶的大小 , 以字節(jié)計(jì) . 指定了最多可以有多少個(gè)令牌能夠即刻被使用 . 注 : 管理的帶寬越大 , 需要的緩沖器就越大 . 在 Intel 體系上 ,10 兆 bit/s 的速率需要至少 10k 字節(jié)的緩沖區(qū) 才能達(dá)到期望的速率 . 緩沖區(qū)太小導(dǎo)致潛在的丟包 . c. 無類算法除這二種隊(duì)列以外 , 另有 pfifo_fast( 網(wǎng)卡出口默認(rèn)根隊(duì)列規(guī)定 ) 經(jīng)常使用的也就是 SFQ/TBF …… 這二種用法如下: 單純地降低出口速率 , 使用令牌桶過濾器 . 調(diào)整桶的配置后可用于控制很高的帶寬 . 鏈路已經(jīng)塞滿 , 保證不會(huì)有某一個(gè)會(huì)話獨(dú)占出口帶寬 , 使用隨機(jī)公平隊(duì)列 . 當(dāng)然最要的還是工作中得來的經(jīng)驗(yàn) , 就其應(yīng)用方面只要能滿足需求即可 .. 要做到靈活應(yīng)用還得大量的實(shí)踐 .. 2. 分類算法 —— PRIO/CBQ/HTB分類算法主要作用是可以對(duì)多種數(shù)據(jù)流區(qū)別對(duì)待 . 一旦數(shù)據(jù)包進(jìn)入一個(gè)分類的隊(duì)列規(guī)定 , 它就得被送到某一個(gè)類中分類 , 對(duì)數(shù)據(jù)包進(jìn)行分類的工具是過濾器 . 過濾器會(huì)返回一個(gè)決定 , 隊(duì)列規(guī)定就根據(jù)這個(gè)決定把數(shù)據(jù)包送入相應(yīng)的類進(jìn)行排隊(duì) . 每個(gè)子類都可以再次使用它們的過濾器進(jìn)行進(jìn)一步的分類 . 直到不需要進(jìn)一步分類時(shí) , 數(shù)據(jù)包才進(jìn)入該類包含的隊(duì)列規(guī)定排隊(duì) . 除了能夠包含其它隊(duì)列規(guī)定之外 , 絕大多數(shù)分類的隊(duì)列規(guī)定能夠流量整形 注 : 過濾器對(duì)數(shù)據(jù)包進(jìn)行分類的工具 , 是從隊(duì)列規(guī)定內(nèi)部調(diào)用的 , 而不是從別處 .( 用在分叉的分支上 ) 列規(guī)定家族 : 根 , 句柄 , 兄弟和父輩 每塊網(wǎng)卡都有一個(gè)出口"根隊(duì)列規(guī)定", 缺省情況下是前面提到的 pfifo_fast 隊(duì)列規(guī)定 . 每個(gè)隊(duì)列規(guī)定都指定一個(gè)句柄 , 以便以后的配置語句能夠引用這個(gè)隊(duì)列規(guī)定 . 除了出口隊(duì)列規(guī)定之外 , 每塊網(wǎng)卡還有一個(gè)入口 , 以便 policies 進(jìn)入的數(shù)據(jù)流 . 隊(duì)列規(guī)定的句柄有兩個(gè)部分 : 一個(gè)主號(hào)碼和一個(gè)次號(hào)碼 . 習(xí)慣上把根隊(duì)列規(guī)定稱為"1:", 等價(jià)于"1:0". 隊(duì)列規(guī)定的次號(hào)碼永遠(yuǎn)是 0. 類的主號(hào)碼必須與它們父輩的主號(hào)碼一致 . 數(shù)據(jù)包如何出隊(duì)并交給硬件 當(dāng)內(nèi)核決定把一個(gè)數(shù)據(jù)包發(fā)給網(wǎng)卡的時(shí)候 , 根隊(duì)列規(guī)定 1: 會(huì)得到一個(gè)出隊(duì)請(qǐng)求 , 然后把它傳給 1:1, 然后依次傳給 10:,12: 和 13:( 子類自定義 ), 然后試圖從它們中進(jìn)行 dequeue() 操作 . 也就是說 , 內(nèi)核需要遍歷整顆樹 , 換句話說 , 類及其兄弟僅僅與其"父隊(duì)列規(guī)定"進(jìn)行交談 , 而不會(huì)與網(wǎng)卡進(jìn)行交談 . 只有根隊(duì)列規(guī)定才能由內(nèi)核進(jìn)行出隊(duì)操作 ! 更進(jìn)一步 , 任何類的出隊(duì)操作都不會(huì)比它們的父類更快 . 我們可以把 SFQ 作為一個(gè)子類 , 放到一個(gè)可以進(jìn)行流量整形的父類中 , 從而能夠同時(shí)得到 SFQ 的調(diào)度功能和其父類的流量整形功能 . a. 隊(duì)列控制的分類算法 PRIO PRIO 分類優(yōu)先算法 ( 從左至右優(yōu)先發(fā)包 ), 隊(duì)列規(guī)定并不進(jìn)行整形 , 它僅僅根據(jù)你配置的過濾器把流量進(jìn)一步細(xì)分 . 你可以認(rèn)為 PRIO 隊(duì)列規(guī)定是 pfifo_fast 的一種衍生物 , 區(qū)別在每個(gè)頻道都是一個(gè)單獨(dú)的類 , 而非簡(jiǎn)單的 FIFO. 當(dāng)數(shù)據(jù)包進(jìn)入 PRIO 隊(duì)列規(guī)定后 , 將根據(jù)你給定的過濾器設(shè)置選擇一個(gè)類 . 缺省情況下有三個(gè)類 , 這些類僅包含純 FIFO 隊(duì)列規(guī)定而沒有更多的內(nèi)部結(jié)構(gòu) . 你可以把它們替換成你需要的任何隊(duì)列規(guī)定 . 每當(dāng)有一個(gè)數(shù)據(jù)包需要出隊(duì)時(shí) , 首先處理 :1 類 . 只有當(dāng)標(biāo)號(hào)更小的類中沒有需要處理的包時(shí) , 才會(huì)標(biāo)號(hào)大的類 . PRIO 配置范例示意圖:![]() 大批量數(shù)據(jù)使用 30:, 交互數(shù)據(jù)使用 20: 或 10:. 清單 3. 在網(wǎng)卡建立 PRIO #tc qdisc add dev eth0 root handle 1: prio
# 此命令立即創(chuàng)建了類 : 1:1, 1:2, 1:3 ( 缺省三個(gè)子類 )
#tc qdisc add dev eth0 parent 1:1 handle 10: sfq
#tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
注 : 此為 TBF 限速的另一寫法 , 前文有講解 .
#tc qdisc add dev eth0 parent 1:3 handle 30: sfq主要參數(shù)有 :( 后續(xù)有實(shí)例 ) bands 創(chuàng)建頻道的數(shù)目 . 每個(gè)頻道實(shí)際上就是一個(gè)類 跟 priomap 參數(shù)配合使用 注 : 頻道是類 , 缺省情況下命名為主標(biāo)號(hào) :1 到主標(biāo)號(hào) :3. 如果你的 PRIO 隊(duì)列規(guī)定是 12:, 把數(shù)據(jù)包過濾到 12:1 將得到最高優(yōu)先級(jí) . 0 頻道的次標(biāo)號(hào)是 1!1 頻道的次標(biāo)號(hào)是 2, 以此類推 . priomap 給 tc 提供過濾器 , 如不提供 PRIO 隊(duì)列規(guī)定將參考 TC_PRIO 的優(yōu)先級(jí)來決定如何給數(shù)據(jù)包入隊(duì) . b. 流量整形的分類算法 CBQ CBQ 的工作機(jī)制是確認(rèn)鏈路的閑置時(shí)間足夠長(zhǎng) , 以達(dá)到降低鏈路實(shí)際帶寬的目的 . 為此 , 它要計(jì)算兩個(gè)數(shù)據(jù)包的平均發(fā)送間隔 . 操作期間 , 有效閑置時(shí)間的測(cè)量使用 EWMA(exponential weighted moving average, 指數(shù)加權(quán)移動(dòng)均值 ) 算法 , 也就是說最近處理的數(shù)據(jù)包的權(quán)值比以前的數(shù)據(jù)包按指數(shù)增加 .UNIX 的平均負(fù)載也是這樣算出來的 . 計(jì)算出來的平均時(shí)間值減去 EWMA 測(cè)量值 , 得出的結(jié)果叫做"avgidle". 最佳的鏈路負(fù)載情況下 , 這個(gè)值應(yīng)當(dāng)是 0: 數(shù)據(jù)包嚴(yán)格按照計(jì)算出來的時(shí)間間隔到來 . 在一個(gè)過載的鏈路上 ,avgidle 值應(yīng)當(dāng)是負(fù)的 . 如果這個(gè)負(fù)值太嚴(yán)重 ,CBQ 就會(huì)暫時(shí)禁止發(fā)包 , 稱為"overlimit"( 越限 ). 相反地 , 一個(gè)閑置的鏈路應(yīng)該有很大 avgidle 值 , 這樣閑置幾個(gè)小時(shí)后 , 會(huì)造成鏈路允許非常大的帶寬通過 . 為了避免這種局面 , 我們用 maxidle 來限 avgidle 的值不能太大 . 理論上講 , 如果發(fā)生越限 ,CBQ 就會(huì)禁止發(fā)包一段時(shí)間 ( 長(zhǎng)度就是事先計(jì)算出來的傳輸數(shù)據(jù)包之間的時(shí)間間隔 ), 然后通過一個(gè)數(shù)據(jù)包后再次禁止發(fā)包 . 清單 4. WEB 服務(wù)器的流量控制為 5Mbps,SMTP 流量控制在 3Mbps 上 . 而且二者一共不得超過 6Mbps, 互相之間允許借用帶寬 #tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8
#tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 6Mbit weight
0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
這部分按慣例設(shè)置了根為 1:0, 并且綁定了類 1:1. 也就是說整個(gè)帶寬不能超過 6Mbps.
#tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 5Mbit weight
0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000
#tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 3Mbit weight
0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000
建立了 2 個(gè)類 . 注意我們?nèi)绾胃鶕?jù)帶寬來調(diào)整 weight 參數(shù)的 . 兩個(gè)類都沒有配置成"bounded", 但它們都連
接到了類 1:1 上 , 而 1:1 設(shè)置了"bounded". 所以兩個(gè)類的總帶寬不會(huì)超過 6Mbps. 別忘了 , 同一個(gè) CBQ 下面的子
類的主號(hào)碼都必須與 CBQ 自己的號(hào)碼相一致 !
#tc qdisc add dev eth0 parent 1:3 handle 30: sfq
#tc qdisc add dev eth0 parent 1:4 handle 40: sfq
缺省情況下 , 兩個(gè)類都有一個(gè) FIFO 隊(duì)列規(guī)定 . 但是我們把它換成 SFQ 隊(duì)列 , 以保證每個(gè)數(shù)據(jù)流都公平對(duì)待 .
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid
1:3
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 25 0xffff flowid
1:4CBQ 流量整形算法相對(duì)比較復(fù)雜 , 工作中還常用 ... 示例中的各參數(shù)請(qǐng)參閱 :HOWTO 中文文檔 ..Linux 流量控制 II--- 分類算法 PRIO/CBQ/HTB c. 流量整形的分類算法 HTB HTB(Hierarchical Token Bucket) 分層的令牌桶一個(gè)分類的令牌桶過濾器 , 工作原理和相關(guān)配置同于 TBF.. 擁有 TBF 的各項(xiàng)性能 , 可參閱 TBF 的工作細(xì)節(jié) ... 清單 5. 環(huán)境與要求同上述 CBQ 的例子#tc qdisc add dev eth0 root handle 1: htb default 30 #tc class add dev eth0 parent 1: classid 1:1 htb rate 6mbit burst 15k #tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k #tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 6mbit burst 15k #tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k #tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10 #tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10 #tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10 # 添加過濾器 , 直接把流量導(dǎo)向相應(yīng)的類 : #U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32" #$U32 match ip dport 80 0xffff flowid 1:10 #$U32 match ip sport 25 0xffff flowid 1:20 三 . Linux 流量控制之 U32 過濾規(guī)則過濾器是對(duì)數(shù)據(jù)包進(jìn)行分類工具 , 過濾器用與把數(shù)據(jù)包分類并放入相應(yīng)的子隊(duì)列 , 這些過濾器在分類的隊(duì)列規(guī)定內(nèi)部被調(diào)用 . 為了決定用哪個(gè)類處理數(shù)據(jù)包 , 必須調(diào)用所謂的"分類器鏈" 進(jìn)行選擇 . 這個(gè)鏈中包含了這個(gè)分類隊(duì)列規(guī)定所需的所有過濾器 . 常用到的為 U32 過濾器 分類的一示例圖:![]() 當(dāng)一個(gè)數(shù)據(jù)包入隊(duì)的時(shí)候 , 每一個(gè)分支處都會(huì)咨詢過濾器鏈如何進(jìn)行下一步 . 典型的配置是在 1:1 處有一個(gè)過濾器把數(shù)據(jù)包交給 12:, 然后 12: 處的過濾器在把包交給 12:2. 你可以把后一個(gè)過濾器同時(shí)放在 1:1 處 , 而得到效率的提高 . 另外 , 你不能用過濾器把數(shù)據(jù)包向"上"送 . 而且 , 使用 HTB 的時(shí)候應(yīng)該把所有的規(guī)則放到根上 .. 注 : 數(shù)據(jù)包只能向"下"進(jìn)行入隊(duì)操作 ! 只有處隊(duì)的時(shí)候才會(huì)上到網(wǎng)卡所在的位置來 . 他們不會(huì)落到樹的最 底層后送到網(wǎng)卡 ... 清單 6. 過濾器過濾示例 #tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip dport 22 0xffff flowid 10:1
在 10: 節(jié)點(diǎn)添加一個(gè)過濾規(guī)則 , 優(yōu)先權(quán) 1: 凡是去往 22 口 ( 精確匹配 ) 的 IP 數(shù)據(jù)包 , 發(fā)送到頻道 10:1..
#tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip sport 80 0xffff flowid 10:1
在 10: 節(jié)點(diǎn)添加一個(gè)過濾規(guī)則 , 優(yōu)先權(quán) 1: 凡是來自 80 口 ( 精確匹配 ) 的 IP 數(shù)據(jù)包 , 發(fā)送到頻道 10:1..
#tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
在 eth0 上的 10: 節(jié)點(diǎn)添加一個(gè)過濾規(guī)則 , 它的優(yōu)先權(quán)是 2: 凡是上二句未匹配的 IP 數(shù)據(jù)包 , 發(fā)送到頻道 10:2..
#tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1
去往 4.3.2.1 的包發(fā)送到頻道 10:1 其它參數(shù)同上例
#tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1
來自 1.2.3.4 的包發(fā)到頻道 10:1
#tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
凡上二句未匹配的包送往 10:2
#tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match
ip sport 80 0xffff flowid 10:1
可連續(xù)使用 match, 匹配來自 1.2.3.4 的 80 口的數(shù)據(jù)包常用到的過濾命令一覽 #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 ------- 根據(jù)源 / 目的地址 源地址段 'match ip src 1.2.3.0/24' 目的地址段 'match ip dst 4.3.2.0/24' 單個(gè) IP 地址 'match ip 1.2.3.4/32' 根據(jù)源 / 目的端口 , 所有 IP 協(xié)議 源 'match ip sport 80 0xffff' 0xffff 表所有數(shù)據(jù)包 目的 'match ip dport 80 0xffff' 根據(jù) IP 協(xié)議 (tcp, udp, icmp, gre, ipsec) icmp 是 1:'match ip protocol 1 0xff' 1 是根據(jù) /etc/protocols 協(xié)議號(hào)來定 根據(jù) fwmark #iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6
#tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1注 :handle 根據(jù)過濾器的不同 , 含義也不同 按 TOS 字段 #tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:4 選擇交互和最小延遲的數(shù)據(jù)流 匹配大量傳輸 , 使用"0x08 0xff". #tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 match u32 00100000 00ff0000 at 0 flowid 1:10 匹配那些 TOS 字段帶有'最小延遲'屬性的數(shù)據(jù)包 四 . Linux 流量控制 --- 實(shí)例解析以下實(shí)例由實(shí)際工作環(huán)境要求編寫而得: 1. PRIO 分類優(yōu)先算法 ( 從左至右優(yōu)先發(fā)包 )網(wǎng)卡工作示例圖:![]() 清單 7. PRIO 分類優(yōu)先算法示例 ( 從左至右優(yōu)先發(fā)包 ) #tc ad add dev eth0 root handle 1: prio hands 3 priomap 1---1 16 個(gè) 1(tos 比特 ) 表示所有數(shù)據(jù)包
注 : 此命令自動(dòng)在 1: 下創(chuàng)建三子類 1:1 1:2 1:3 此例中只用到 1:1
#tc qd add dev eth0 parent 1:1 handle 11:sfq
#tc qdisc add dev eth0 parent 1:1 handle 12: tbf rate 20kbit
buffer 1600 limit 3000
#tc qd add dev eth0 parent 1:1 handle 13:sfq
#tc filter add dev eth0 parent 1:1 prio 1003 protocol ip
u32 match ip src 192.168.1.0/24 flowid 1:13
#tc filter add dev eth0 parent 1:1 prio 1001 protocol ip
u32 match ip src 10.0.0.0/8 flowid 1:12
#tc filter add dev eth0 parent 1:1 protocol ip prio 1001
u32 match ip tos 0x10 0xff flowid 1:11 交互和最小延遲的數(shù)據(jù)流2. HTB 分層令牌桶網(wǎng)卡工作示例圖:![]() 清單 8. HTB 分層令牌桶示例 #tc qd del dev eth1 root
#tc qdisc add dev eth1 root handle 1: htb default 12
#tc class add dev eth1 parent 1: classid 1:1 htb rate 2Mbit burst 1500000 在 1: 下定義子類 1:1
#tc class add dev eth1 parent 1:1 classid 1:11 htb rate 512kbit burst 150000 ceil 1Mbit
#tc qd add dev eth1 parent 1:11 handle 111: sfq
#tc class add dev eth1 parent 1:1 classid 1:12 htb rate 1Mbit burst 150000 ceil 1Mbit
#tc qd add dev eth1 parent 1:12 handle 122: sfq 注 : 亦可不在 1:12 class 下定義 122: qd
#tc class add dev eth1 parent 1:1 classid 1:13 htb rate 2Mbit burst 150000 ceil 2Mbit
#tc qd add dev eth1 parent 1:13 handle 133: sfq
#tc filter add dev eth1 parent 1: prio 10001 protocol ip
u32 match ip src 192.168.1.0/24 flowid 1:12 其它二類亦如此 ..3. ADSL 上網(wǎng)流量限控腳本ADSL 帶寬是下行 3200Kbit, 上行只有 320Kbit 網(wǎng)卡工作示例圖:![]() 清單 9. 上網(wǎng)流量限控腳本示例tc qdisc add dev eth0 root handle 1: htb default 24 tc class add dev eth0 parent 1: classid 1:1 htb rate 300kbit ceil 300kbit prio 0 tc class add dev eth0 parent 1: classid 1:2 htb rate 150kbit prio 3 tc class add dev eth0 parent 1:1 classid 1:11 htb rate 300kbit ceil 300kbit prio 1 tc class add dev eth0 parent 1:1 classid 1:12 htb rate 150kbit ceil 250kbit prio 2 tc class add dev eth0 parent 1:2 classid 1:21 htb rate 100kbit ceil 150kbit prio 4 tc class add dev eth0 parent 1:2 classid 1:22 htb rate 30kbit ceil 140kbit prio 5 tc class add dev eth0 parent 1:2 classid 1:23 htb rate 15kbit ceil 130kbit prio 6 tc class add dev eth0 parent 1:2 classid 1:24 htb rate 5kbit ceil 50kbit prio 7 tc qdisc add dev eth0 parent 1:11 handle 111: sfq perturb 5 tc qdisc add dev eth0 parent 1:12 handle 112: sfq perturb 5 tc qdisc add dev eth0 parent 1:21 handle 121: sfq perturb 10 tc qdisc add dev eth0 parent 1:22 handle 122: sfq perturb 10 tc qdisc add dev eth0 parent 1:23 handle 133: sfq perturb 10 tc qdisc add dev eth0 parent 1:24 handle 124: sfq perturb 10 tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11 tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12 tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21 tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22 tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23 tc filter add dev eth0 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24 1:11 最高優(yōu)先級(jí)的數(shù)據(jù)包通道優(yōu)先通過 , 主要為一些 ACK SYN 確認(rèn)包 .. 必要時(shí)全部占用 .. 全速 1:12 是很重要的數(shù)據(jù)道 , 給多點(diǎn) , 最少給一半 , 但需要時(shí)可以再多一點(diǎn) . rate 規(guī)劃 1:2 = 1:21 + 1:22 + 1:23 + 1:24 一般總數(shù)在 50%-80% 左右 1:21 http,pop 最常用 , 人數(shù)較多 , 易導(dǎo)致堵塞 , 不能給得太多 , 但不益太少 . 1:22 smtp 通道 , 優(yōu)先低于 1:21 以防發(fā)大的附件大量占用帶寬 1:23 ftp-data 數(shù)據(jù)通道可能大量上傳文件 ,rate 不能給得太多 ,ceil 設(shè)置大些 ( 其它通道剩余帶寬應(yīng)用 ) 1:24 無所謂通道 , 就是一般不是平時(shí)工作上需要的通道了 , 給小點(diǎn) , 防止這些人在妨礙有正常工作需要的人 其次的工作即在 iptables 端對(duì)相應(yīng)數(shù)據(jù)包打上標(biāo)記 ... 4. Linux+NAT+TC腳本是 Linux NAT 網(wǎng)關(guān)實(shí)例 , 根據(jù)此腳本思路 , 可進(jìn)一步細(xì)致的進(jìn)行針對(duì)于數(shù)據(jù)包的限制 .. 清單 10. Linux Nat 網(wǎng)關(guān)實(shí)例 echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT
--to-source 124.42.97.36
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT
--to-source 124.42.97.36
iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.0/24 -j MARK
--set-mark 1
iptables -I PREROUTING -t mangle -p tcp -s 192.168.1.0/24 -j MARK
--set-mark 2
注 : 可分?jǐn)?shù)據(jù)包類型標(biāo)記
tc qdisc del dev eth0 root
# 加一個(gè)根隊(duì)列 , 速率用網(wǎng)卡的速率 10Mbit,也可用上傳的速率
tc qdisc add dev eth0 root handle 100: cbq bandwidth 10Mbit avpkt 1000
# 加一個(gè)根類
tc class add dev eth0 parent 100:0 classid 100:1 cbq bandwidth 10Mbit
rate 10Mbit allot 1514 weight 1Mbit prio 8 maxburst
8 avpkt 1000 bounded
# 加一個(gè)子類用于內(nèi)網(wǎng) 1 速率限制為 300Kbit
tc class add dev eth0 parent 100:1 classid 100:2 cbq bandwidth 10Mbit
rate 300Kbit allot 1513 weight 30Kbit prio 5 maxburst
8 avpkt 1000 bounded
# 加一個(gè)子類用于內(nèi)網(wǎng) 2 速率限制為 320Kbit
tc class add dev eth0 parent 100:1 classid 100:3 cbq bandwidth 10Mbit
rate 320Kbit allot 1513 weight 32Kbit prio 6 maxburst
8 avpkt 1000 bounded
# 設(shè)置隊(duì)列規(guī)則
tc qdisc add dev eth0 parent 100:2 sfq quantum 1514b perturb 15
tc qdisc add dev eth0 parent 100:3 sfq quantum 1514b perturb 15
# 將隊(duì)列和 fw 過濾器映射起來 其中 hand 1 的 1 是開始用 iptables 做的標(biāo)記 hand 2 的 2 也是開始用
iptables 做的標(biāo)記
tc filter add dev eth0 parent 100:0 protocol ip prio 1 handle
1 fw classid 100:2
tc filter add dev eth0 parent 100:0 protocol ip prio 2 handle
2 fw classid 100:3
流量監(jiān)測(cè)相關(guān)命令 :
tc -s qdisc/class ls dev eth0
tc -s qdisc/class ls dev eth15. Linux 網(wǎng)關(guān) / 服務(wù)器限速 ---HTB清單 11. Linux 網(wǎng)關(guān) / 服務(wù)器 HTB 限速 #!/bin/sh
PWD=/home/huaying/net
TC=/sbin/tc
$TC class ls dev eth0
$TC qdisc del dev eth0 root
$TC qdisc add dev eth0 root handle 1: htb r2q 1
U32="$TC filter add dev eth0 parent 1: protocol ip prio 16 u32"
while read line
do
ip=`echo $line | awk '{print $1}'`
limit=`echo $line | awk '{print $2}'`
$TC class add dev eth0 parent 1: classid 1:$ip htb rate
"$limit"kbit burst 1k
$U32 match ip dst 192.168.1.$ip/32 flowid 1:$ip
done < $PWD/ip_limit
注 :ip_limit 分行記錄 , 第一列為 ip, 第二列為限制的帶寬 , 二列以 tables 分開 ..
服務(wù)器限速
#!/bin/sh
/sbin/tc qdisc del dev eth0 root
/sbin/tc qdisc add dev eth0 root handle 1:0 htb r2q 1
/sbin/tc class add dev eth0 parent 1:0 classid 1:1 htb rate
75mbit burst 10k
/sbin/tc filter add dev eth0 parent 1: protocol ip prio 16
u32 match ip dst 0.0.0.0/0 flowid 1:1
/sbin/tc class ls dev eth0
最大限制服務(wù)器 eth0 流量在 75Mbit/s |
|
|