Linux 下 TC 命令原理及詳解

畫外音》》》》原本在看 filebeat的流量控制,使用tc命令實現查了下 發現一篇文章,比較長寫的比價好 轉載過來了 原文連接:https://blog.csdn.net/pansaky/article/details/88801249html

就是這我的轉載的
linux

https://blog.csdn.net/pansakygit


衆所周知,在互聯網誕生之初都是各個高校和科研機構相互通信,並無網絡流量控制方面的考慮和設計,IP協議的原則是儘量好地爲全部數據流服務,不一樣的數據流之間是平等的。然而多年的實踐代表,這種原則並非最理想的,有些數據流應該獲得特別的照顧, 好比,遠程登陸的交互數據流應該比數據下載有更高的優先級。web

針對不一樣的數據流採起不一樣的策略,這種可能性是存在的。而且,隨着研究的發展和深刻, 人們已經提出了各類不一樣的管理模式。IETF已經發布了幾個標準, 如綜合服務(Integrated Services)、區分服務(Diferentiated Services)等。其實,Linux內核從2 2開始,就已經實現了相關的流量控制功能。本文將介紹Linux中有關流量控制的相關概念, 用於流量控制的工具TC的使用方法,並給出幾個有表明性實例。算法

  1、相關概念shell

由此能夠看出, 報文分組從輸入網卡(入口)接收進來,通過路由的查找, 以肯定是發給本機的,仍是須要轉發的。若是是發給本機的,就直接向上遞交給上層的協議,好比TCP,若是是轉發的, 則會從輸出網卡(出口)發出。網絡流量的控制一般發生在輸出網卡處。雖然在路由器的入口處也能夠進行流量控制,Linux也具備相關的功能, 但通常說來, 因爲咱們沒法控制本身網絡以外的設備, 入口處的流量控制相對較難。本文將集中介紹出口處的流量控制。流量控制的一個基本概念是隊列(Qdisc),每一個網卡都與一個隊列(Qdisc)相聯繫, 每當內核須要將報文分組從網卡發送出去, 都會首先將該報文分組添加到該網卡所配置的隊列中, 由該隊列決定報文分組的發送順序。所以能夠說,全部的流量控制都發生在隊列中,詳細流程圖見圖1。編程

clip_image001

圖1報文在Linux內部流程圖api

有些隊列的功能是很是簡單的, 它們對報文分組實行先來先走的策略。有些隊列則功能複雜,會將不一樣的報文分組進行排隊、分類,並根據不一樣的原則, 以不一樣的順序發送隊列中的報文分組。爲實現這樣的功能,這些複雜的隊列須要使用不一樣的過濾器(Filter)來把報文分組分紅不一樣的類別(Class)。這裏把這些複雜的隊列稱爲可分類(ClassfuI)的隊列。一般, 要實現功能強大的流量控制, 可分類的隊列是必不可少的。所以,類別(class)和過濾器(Filter)也是流量控制的另外兩個重要的基本概念。圖2所示的是一個可分類隊列的例子。bash

clip_image002

圖2多類別隊列網絡

由圖2能夠看出,類別(CIass)和過濾器(Filter)都是隊列的內部結構, 而且可分類的隊列能夠包含多個類別,同時,一個類別又能夠進一步包含有子隊列,或者子類別。全部進入該類別的報文分組能夠依據不一樣的原則放入不一樣的子隊列或子類別中,以此類推。而過濾器(Filter)是隊列用來對數據報文進行分類的工具, 它決定一個數據報文將被分配到哪一個類別中。

  2、使用TC

在Linux中,流量控制都是經過TC這個工具來完成的。一般, 要對網卡進行流量控制的配置,須要進行以下的步驟:

◆ 爲網卡配置一個隊列;

◆ 在該隊列上創建分類;

◆ 根據須要創建子隊列和子分類;

◆ 爲每一個分類創建過濾器。

在Linux中,能夠配置不少類型的隊列,好比CBQ、HTB等,其中CBQ 比較複雜,不容易理解。HTB(HierarchicaIToken Bucket)是一個可分類的隊列, 與其餘複雜的隊列類型相比,HTB具備功能強大、配置簡單及容易上手等優勢。在TC 中, 使用」major:minor」這樣的句柄來標識隊列和類別,其中major和minor都是數字。

對於隊列來講,minor老是爲0,即」major:0″這樣的形式,也能夠簡寫爲」major: 好比,隊列1:0能夠簡寫爲1:。須要注意的是,major在一個網卡的全部隊列中必須是唯一的。對於類別來講,其major必須和它的父類別或父隊列的major相同,而minor在一個隊列內部則必須是唯一的(由於類別確定是包含在某個隊列中的)。舉個例子,若是隊列2:包含兩個類別,則這兩個類別的句柄必須是2:x這樣的形式,而且它們的x不能相同, 好比2:1和2:2。

下面,將以HTB隊列爲主,結合需求來說述TC的使用。假設eth0出口有100mbit/s的帶寬, 分配給WWW 、E-mail和Telnet三種數據流量, 其中分配給WWW的帶寬爲40Mbit/s,分配給Email的帶寬爲40Mbit/s, 分配給Telnet的帶寬爲20Mbit/S。如圖3所示。

須要注意的是, 在TC 中使用下列的縮寫表示相應的帶寬:

◆ Kbps kiIobytes per second, 即」千字節每秒 ;

◆ Mbps megabytes per second, 即」兆字節每秒 ,

◆ Kbit kilobits per second,即」千比特每秒 ;

◆ Mbit megabits per second, 即」兆比特每秒 。

  3、建立HTB隊列

有關隊列的TC命令的通常形式爲:

#tc qdisc [add|change|replace|link] dev DEV [parent qdisk-id|root][handle qdisc-id] qdisc[qdisc specific parameters]

首先,須要爲網卡eth0配置一個HTB隊列,使用下列命令:

#tc qdisc add dev eth0 root handle 1:htb default 11

這裏,命令中的」add 表示要添加,」dev eth0 表示要操做的網卡爲eth0。」root 表示爲網卡eth0添加的是一個根隊列。」handle 1: 表示隊列的句柄爲1:。」htb 表示要添加的隊列爲HTB隊列。命令最後的」default 11 是htb特有的隊列參數,意思是全部未分類的流量都將分配給類別1:11。

  4、爲根隊列建立相應的類別

有關類別的TC 命令的通常形式爲:

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

能夠利用下面這三個命令爲根隊列1建立三個類別,分別是1:1 一、1:12和1:13,它們分別佔用40、40和20mb[t的帶寬。

#tc class add dev eth0 parent 1: classid 1:1 htb rate 40mbit ceil 40mbit

#tc class add dev eth0 parent 1: classid 1:12 htb rate 40mbit ceil 40mbit

#tc class add dev eth0 parent 1: cllassid 1:13 htb rate 20mbit ceil 20mbit

命令中,」parent 1:」表示類別的父親爲根隊列1:。」classid1:11″表示建立一個標識爲1:11的類別,」rate 40mbit」表示系統

將爲該類別確保帶寬40mbit,」ceil 40mbit」,表示該類別的最高可佔用帶寬爲40mbit。

  5、爲各個類別設置過濾器

有關過濾器的TC 命令的通常形式爲:

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

因爲須要將WWW、E-mail、Telnet三種流量分配到三個類別,即上述1:十一、1:12和1:13,所以,須要建立三個過濾器,以下面的三個命令:

#tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:11

#tc filter add dev eth0 prtocol ip parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:12

#tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 23 oxffff flowid 1:13

這裏,」protocol ip」表示該過濾器應該檢查報文分組的協議字段。」pr[o 1″ 表示它們對報文處理的優先級是相同的,對於不一樣優先級的過濾器, 系統將按照從小到大的優先級。

順序來執行過濾器, 對於相同的優先級,系統將按照命令的前後順序執行。這幾個過濾器還用到了u32選擇器(命令中u32後面的部分)來匹配不一樣的數據流。以第一個命令爲例,判斷的是dport字段,若是該字段與Oxffff進行與操做的結果是8O,則」flowid 1:11″ 表示將把該數據流分配給類別1:1 1。更加詳細的有關TC的用法能夠參考TC 的手冊頁。

  6、複雜的實例

在上面的例子中, 三種數據流(www、Email、Telnet)之間是互相排斥的。當某個數據流的流量沒有達到配額時,其剩餘的帶寬並不能被其餘兩個數據流所借用。在這裏將涉及如何使不一樣的數據流能夠共享必定的帶寬。

首先須要用到HTB的一個特性, 即對於一個類別中的全部子類別,它們將共享該父類別所擁有的帶寬,同時,又可使得各個子類別申請的各自帶寬獲得保證。這也就是說,當某個數據流的實際使用帶寬沒有達到其配額時, 其剩餘的帶寬能夠借給其餘的數據流。而在借出的過程當中,若是本數據流的數據量增大,則借出的帶寬部分將收回, 以保證本數據流的帶寬配額。

下面考慮這樣的需求, 一樣是三個數據流WWW、E-mail和Telnet, 其中的Telnet獨立分配20Mbit/s的帶寬。另外一方面,VWVW 和SMTP各自分配40Mbit/s。同時,它們又是共享的關係, 即它們能夠互相借用帶寬。如圖3所示。

clip_image003

須要的TC命令以下:

#tc qdisc add dev eth0 root handle 1: htb default 21

#tc class add dev eth0 partent 1: classid 1:1 htb rate 20mbit ceil 20mbit

#tc class add dev eth0 parent 1: classid 1:2 htb rate 80mbit ceil 80mbit

#tc class add dev eth0 parent 1: classid 1:21 htb rate 40mbit ceil 20mbit

#tc class add dev eth0 parent 1:2 classid 1:22 htb rate 40mbit ceil 80mbit

#tc filter add dev eth0 protocol parent 10 prio 1 u32 match ip dport 80 0xffff flowid 1:21

#tc filter add dev eth0 protocol parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:22

#tc filter add dev eth0 protocol parent 1:0 prio 1 u32 match ip dport 23 0xffff flowid 1:1

這裏爲根隊列1建立兩個根類別,即1:1和1:2,其中1:1對應Telnet數據流,1:2對應80Mbit的數據流。而後,在1:2中,建立兩個子類別1:21和1:22,分別對應WWW和E-mail數據流。因爲類別1:21和1:22是類別1:2的子類別,所以他們能夠共享分配的80Mbit帶寬。同時,又確保當須要時,本身的帶寬至少有40Mbit。

從這個例子能夠看出,利用HTB中類別和子類別的包含關係,能夠構建更加複雜的多層次類別樹,從而實現的更加靈活的帶寬共享和獨佔模式,達到企業級的帶寬管理目的。

QOS 無非就是使用了linux的2個工具, tc 和 iptables ,無論管理界面作的多麼垃圾仍是多麼強大,都是最終翻譯成這2個工具的script去執行,而且不管多麼NB的管理界面都有很大的侷限性(整半天界面也就是實現了命令行下的幾個參數的功能而已),因此沒法徹底發揮這2個工具的做用. 不要覺得TOMATO的QOS就很NB,其實就是對這2個工具作了比較好的封裝罷了, 都是linux,用好了,分不出什麼高下的. 若是你懂linux shell編程, 而且懂數據挖掘與機器學習的理論 ,你徹底能夠根據一些算法寫出帶有人工智能特性的QOS腳本,wayos的QOS其實就是這麼實現的而已. (美好的展望一下,很少說了,進入正題)

TC是幹什麼的呢:
TC就是創建數據通道的, 創建的通道有數據包管理方式, 通道的優先級, 通道的速率(這就是限速)

iptables又是幹什麼的呢?
是決定哪一個ip 或者 mac 或者某個應用, 走哪一個通道的.

這就是QOS+限速的原理, 大夥明白了吧?

想深刻的朋友請看
iptables權威指南1.1.9   http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html
tc命令的介紹和用法 http://wenku.baidu.com/view/324fc91a964bcf84b9d57b01.html

詳細的我就不寫了,看上面的好好學習,這裏我就貼出來個人學習成果吧,直接可用的限速腳本:
如下說的是單位是kbps, 跟普通迅雷上看到的下載速度的換算關係是 除以8    1600/8 = 200K ,迅雷上看到的就是200KB/s

本帖隱藏的內容

#如今開始用TC創建數據的上行和下行通道
TCA=」tc class add dev br0″
TFA=」tc filter add dev br0″
tc qdisc del dev br0 root
tc qdisc add dev br0 root handle 1: htb
tc class add dev br0 parent 1: classid 1:1 htb rate 1600kbit            #這個1600是下行總速度
$TCA parent 1:1 classid 1:10 htb rate 200kbit ceil 400kbit prio 2     #這個是10號通道的下行速度,最小200,最大400,優先級爲2
$TCA parent 1:1 classid 1:25 htb rate 1000kbit ceil 1600kbit prio 1   #這是我本身使用的特殊25號通道,下行速度最小1000,最大1600,優先級爲1, 呵呵,待遇就是不同
$TFA parent 1:0 prio 2 protocol ip handle 10 fw flowid 1:10
$TFA parent 1:0 prio 1 protocol ip handle 25 fw flowid 1:25
tc qdisc add dev br0 ingress
$TFA parent ffff: protocol ip handle 35 fw police rate 800kbit mtu 12k burst 10k drop      #這是我本身使用的35號上行通道,最大速度800
$TFA parent ffff: protocol ip handle 50 fw police rate 80kbit mtu 12k burst 10k drop         #這是給大夥使用的50號上行通道,最大速度80

#好了,如今用iptables來以爲哪些人走哪些通道吧,哈哈,因爲dd wrt的iptables不支持ip range,因此只能每一個IP寫一條語句,不然命令無效

iptables -t mangle -A POSTROUTING -d 192.168.1.22 -j MARK –set-mark 10     #ip爲192.168.1.22的走10號通道
iptables -t mangle -A POSTROUTING -d 192.168.1.22 -j RETURN                        #給每條規則加入RETURN,這樣效率會更高.
iptables -t mangle -A POSTROUTING -d 192.168.1.23 -j MARK –set-mark 25      #ip爲192.168.1.23的走25號特殊通道,23是個人ip,因此特殊點
iptables -t mangle -A POSTROUTING -d 192.168.1.23 -j RETURN                        #給每條規則加入RETURN,這樣效率會更高.

iptables -t mangle -A PREROUTING -s 192.168.1.22 -j MARK –set-mark 50         #ip爲22的走50號上行通道
iptables -t mangle -A PREROUTING -s 192.168.1.22 -j RETURN                        #給每條規則加入RETURN,這樣效率會更高.
iptables -t mangle -A PREROUTING -s 192.168.1.23 -j MARK –set-mark 35        #ip爲23的走35號上行通道,我本身的IP.呵呵
iptables -t mangle -A PREROUTING -s 192.168.1.23 -j RETURN                        #給每條規則加入RETURN,這樣效率會更高.

#其餘的我就不寫了,你們本身換IP吧,想讓誰走哪一個通道,就把IP改了執行,如今發發慈悲,讓你們開網頁的時候走我使用25和35號通道吧,固然你也能夠不發慈悲
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 80 -j MARK –set-mark 35    #http的端口號80,因此dport是80,這是發起http請求的時候
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 80 -j RETURN
iptables -t mangle -A POSTROUTING -p tcp -m tcp –sport 80 -j MARK –set-mark 25   #http的端口號80,因此sport是80,這是http響應回來的時候
iptables -t mangle -A POSTROUTING -p tcp -m tcp –sport 80 -j RETURN

如今來看看如何限制TCP和UDP的鏈接數吧,很NB的(不知道標準版本和簡化版是否支持,一下語句不保證可用,因我的路由器環境而定):
iptables -I FORWARD -p tcp -m connlimit –connlimit-above 100 -j DROP           #看到了吧,在FORWARD轉發鏈的時候,全部tcp鏈接大於100 的數據包就丟棄!是針對全部IP的限制
iptables -I FORWARD -p udp -m limit –limit 5/sec -j DROP   #UDP是沒法控制鏈接數的, 只能控制每秒多少個UDP包, 這裏設置爲每秒5個,5個已經很多了,10個就算很高了,這個是封殺P2P的利器,通常設置爲每秒3~5個比較合理.
如何查看命令是否生效呢?:
執行  iptables -L FORWARD 就能夠看到以下結果:
DROP       tcp  –  anywhere             anywhere            #conn/32 > 100
DROP       udp  –  anywhere             anywhere            limit: avg 5/sec bu
若是出現了這2個結果,說明限制鏈接數的語句確實生效了, 若是沒有這2個出現,則說明你的dd-wrt不支持connlimit限制鏈接數模塊.

如今我想給本身開個後門,不受鏈接數的限制該怎麼作呢?看下面的:
iptables -I FORWARD -s 192.168.1.23 -j RETURN          #意思是向iptables的FORWARD鏈的最頭插入這個規則,這個規則如今成爲第一個規則了,23是個人IP,就是說,只要是個人IP的就不在執行下面的鏈接數限制的規則語句了,利用了iptables鏈的執行順序規則,個人IP被例外了.

告訴你們一個查看全部人的鏈接數的語句:
sed -n ‘s%.* src=192.168.[0−9.]∗192.168.[0−9.]∗.*%\1%p’ /proc/net/ip_conntrack | sort | uniq -c    #執行這個就能夠看到全部IP當前所佔用的鏈接數

對於上面的腳本,有一些比較疑惑人的地方,如今來說講:
br0 : 這個是一個dd wrt的網橋, 這個網橋橋接了無線和有線的接口, 因此在這上面卡流量,就至關於卡了全部無線和有線的用戶.具體信息能夠輸入ifconfig命令進行查看.
規則鏈順序問題 : 在br0上iptables規則鏈的順序是比較奇怪的, 正常的順序 入站的數據包先過 PERROUTING鏈, 出站數據包先過POSTROUTING鏈,可是 dd wrt的br0網橋順序與正常的順序正好相反!
在ddwrt上入站的數據包被當成出站的,出站的數據包被當成入站的,因此上面的腳本會那麼寫.

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)
Linux從kernel 2.1.105開始支持QOS,不過,須要從新編譯內核。運行make config時將EXPERIMENTAL _OPTIONS設置成y,而且將Class Based Queueing (CBQ), Token Bucket Flow, Traffic Shapers 設置爲 y ,運行 make dep; make clean; make bzilo,生成新的內核。

在Linux操做系統中流量控制器(TC)主要是在輸出端口處創建一個隊列進行流量控制,控制的方式是基於路由,亦即基於目的IP地址或目的子網的網絡號的流量控制。流量控制器TC,其基本的功能模塊爲隊列、分類和過濾器。Linux內核中支持的隊列有,Class Based Queue ,Token Bucket Flow ,CSZ ,First In First Out ,Priority ,TEQL ,SFQ ,ATM ,RED。這裏咱們討論的隊列與分類都是基於CBQ(Class Based Queue)的,而過濾器是基於路由(Route)的。

配置和使用流量控制器TC,主要分如下幾個方面:分別爲創建隊列、創建分類、創建過濾器和創建路由,另外還須要對現有的隊列、分類、過濾器和路由進行監視。

其基本使用步驟爲:

1) 針對網絡物理設備(如以太網卡eth0)綁定一個CBQ隊列;

2) 在該隊列上創建分類;

3) 爲每一分類創建一個基於路由的過濾器;

4) 最後與過濾器相配合,創建特定的路由表。

先假設一個簡單的環境

流量控制器上的以太網卡(eth0) 的IP地址爲192.168.1.66,在其上創建一個CBQ隊列。假設包的平均大小爲1000字節,包間隔發送單元的大小爲8字節,可接收衝突的發送最長包數目爲20字節。

假若有三種類型的流量須要控制:

1) 是發往主機1的,其IP地址爲192.168.1.24。其流量帶寬控制在8Mbit,優先級爲2;

2) 是發往主機2的,其IP地址爲192.168.1.26。其流量帶寬控制在1Mbit,優先級爲1;

3) 是發往子網1的,其子網號爲192.168.1.0,子網掩碼爲255.255.255.0。流量帶寬控制在1Mbit,優先級爲6。

1. 創建隊列

通常狀況下,針對一個網卡只需創建一個隊列。

將一個cbq隊列綁定到網絡物理設備eth0上,其編號爲1:0;網絡物理設備eth0的實際帶寬爲10 Mbit,包的平均大小爲1000字節;包間隔發送單元的大小爲8字節,最小傳輸包大小爲字節。

tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu

2. 創建分類

分類創建在隊列之上。通常狀況下,針對一個隊列需創建一個根分類,而後再在其上創建子分類。對於分類,按其分類的編號順序起做用,編號小的優先;一旦符合某個分類匹配規則,經過該分類發送數據包,則其後的分類再也不起做用。

1) 建立根分類1:1;分配帶寬爲10Mbit,優先級別爲8。

tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 1Mbit

該隊列的最大可用帶寬爲10Mbit,實際分配的帶寬爲10Mbit,可接收衝突的發送最長包數目爲20字節;最大傳輸單元加MAC頭的大小爲1514字節,優先級別爲8,包的平均大小爲1000字節,包間隔發送單元的大小爲8字節,相應於實際帶寬的加權速率爲1Mbit。

2)建立分類1:2,其父分類爲1:1,分配帶寬爲8Mbit,優先級別爲2。

tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 8Mbit maxburst 20 allot 1514 prio 2 avpkt 1000 cell 8 weight 800Kbit split 1:0 bounded

該隊列的最大可用帶寬爲10Mbit,實際分配的帶寬爲 8Mbit,可接收衝突的發送最長包數目爲20字節;最大傳輸單元加MAC頭的大小爲1514字節,優先級別爲1,包的平均大小爲1000字節,包間隔發送單元的大小爲8字節,相應於實際帶寬的加權速率爲800Kbit,分類的分離點爲1:0,且不可借用未使用帶寬。

3)建立分類1:3,其父分類爲1:1,分配帶寬爲1Mbit,優先級別爲1。

tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 1Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 100Kbit split 1:0

該隊列的最大可用帶寬爲10Mbit,實際分配的帶寬爲 1Mbit,可接收衝突的發送最長包數目爲20字節;最大傳輸單元加MAC頭的大小爲1514字節,優先級別爲2,包的平均大小爲1000字節,包間隔發送單元的大小爲8字節,相應於實際帶寬的加權速率爲100Kbit,分類的分離點爲1:0。

4)建立分類1:4,其父分類爲1:1,分配帶寬爲1Mbit,優先級別爲6。

tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 10Mbit rate 1Mbit maxburst 20 allot 1514 prio 6 avpkt 1000 cell 8 weight 100Kbit split 1:0

該隊列的最大可用帶寬爲10Mbit,實際分配的帶寬爲 Kbit,可接收衝突的發送最長包數目爲20字節;最大傳輸單元加MAC頭的大小爲1514字節,優先級別爲1,包的平均大小爲1000字節,包間隔發送單元的大小爲8字節,相應於實際帶寬的加權速率爲100Kbit,分類的分離點爲1:0。

3. 創建過濾器

過濾器主要服務於分類。通常只需針對根分類提供一個過濾器,而後爲每一個子分類提供路由映射。

1) 應用路由分類器到cbq隊列的根,父分類編號爲1:0;過濾協議爲ip,優先級別爲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.創建路由

該路由是與前面所創建的路由映射一一對應。

1) 發往主機192.168.1.24的數據包經過分類2轉發(分類2的速率8Mbit)

ip route add 192.168.1.24 dev eth0 via 192.168.1.66 realm 2

2) 發往主機192.168.1.30的數據包經過分類3轉發(分類3的速率1Mbit)

ip route add 192.168.1.30 dev eth0 via 192.168.1.66 realm 3

3)發往子網192.168.1.0/24的數據包經過分類4轉發(分類4的速率1Mbit)

ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4

注:通常對於流量控制器所直接鏈接的網段建議使用IP主機地址流量控制限制,不要使用子網流量控制限制。如必定須要對直連子網使用子網流量控制限制,則在創建該子網的路由映射前,需將原先由系統創建的路由刪除,纔可完成相應步驟。

5. 監視

主要包括對現有隊列、分類、過濾器和路由的情況進行監視。

1)顯示隊列的情況

簡單顯示指定設備(這裏爲eth0)的隊列情況

tc qdisc ls dev eth0
qdisc cbq 1: rate 10Mbit (bounded,isolated) prio no-transmit

詳細顯示指定設備(這裏爲eth0)的隊列情況

tc -s qdisc ls dev eth0
qdisc cbq 1: rate 10Mbit (bounded,isolated) prio no-transmit
Sent 76731 bytes 13232 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 31 undertime 0

這裏主要顯示了經過該隊列發送了13232個數據包,數據流量爲76731個字節,丟棄的包數目爲0,超過速率限制的包數目爲0。

2)顯示分類的情況

簡單顯示指定設備(這裏爲eth0)的分類情況

tc class ls dev eth0
class cbq 1: root rate 10Mbit (bounded,isolated) prio no-transmit
class cbq 1:1 parent 1: rate 10Mbit prio no-transmit #no-transmit表示優先級爲8
class cbq 1:2 parent 1:1 rate 8Mbit prio 2
class cbq 1:3 parent 1:1 rate 1Mbit prio 1
class cbq 1:4 parent 1:1 rate 1Mbit prio 6

詳細顯示指定設備(這裏爲eth0)的分類情況

tc -s class ls dev eth0
class cbq 1: root rate 10Mbit (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 10Mbit 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 8Mbit 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 1Mbit 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 1Mbit prio 6
Sent 5552879 bytes 8076 pkts (dropped 0, overlimits 0)
borrowed 3797 overactions 0 avgidle 159557 undertime 0

這裏主要顯示了經過不一樣分類發送的數據包,數據流量,丟棄的包數目,超過速率限制的包數目等等。其中根分類(class cbq 1:0)的情況應與隊列的情況相似。

例如,分類class cbq 1:4發送了8076個數據包,數據流量爲5552879個字節,丟棄的包數目爲0,超過速率限制的包數目爲0。

顯示過濾器的情況

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發送。

顯示現有路由的情況

ip route
192.168.1.66 dev eth0 scope link
192.168.1.24 via 192.168.1.66 dev eth0 realm 2
202.102.24.216 dev ppp0 proto kernel scope link src 202.102.76.5
192.168.1.30 via 192.168.1.66 dev eth0 realm 3
192.168.1.0/24 via 192.168.1.66 dev eth0 realm 4
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.66
172.16.1.0/24 via 192.168.1.66 dev eth0 scope link
127.0.0.0/8 dev lo scope link
default via 202.102.24.216 dev ppp0
default via 192.168.1.254 dev eth0

如上所示,結尾包含有realm的顯示行是起做用的路由過濾器。

6. 維護

主要包括對隊列、分類、過濾器和路由的增添、修改和刪除。

增添動做通常依照」隊列->分類->過濾器->路由」的順序進行;修改動做則沒有什麼要求;刪除則依照」路由->過濾器->分類->隊列」的順序進行。

1)隊列的維護

通常對於一臺流量控制器來講,出廠時針對每一個以太網卡均已配置好一個隊列了,一般狀況下對隊列無需進行增添、修改和刪除動做了。

2)分類的維護

增添

增添動做經過tc class add命令實現,如前面所示。

修改

修改動做經過tc class change命令實現,以下所示:

tc class change dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 7Mbit maxburst 20 allot 1514 prio 2 avpkt 1000 cell 8 weight 700Kbit split 1:0 bounded

對於bounded命令應慎用,一旦添加後就進行修改,只可經過刪除後再添加來實現。

刪除

刪除動做只在該分類沒有工做前纔可進行,一旦經過該分類發送過數據,則沒法刪除它了。所以,須要經過shell文件方式來修改,經過從新啓動來完成刪除動做。

3)過濾器的維護

增添

增添動做經過tc filter add命令實現,如前面所示。

修改

修改動做經過tc filter change命令實現,以下所示:

tc filter change dev eth0 parent 1:0 protocol ip prio 100 route to 10 flowid 1:8

刪除

刪除動做經過tc filter del命令實現,以下所示:

tc filter del dev eth0 parent 1:0 protocol ip prio 100 route to 10

4)與過濾器一一映射路由的維護

增添

增添動做經過ip route add命令實現,如前面所示。

修改

修改動做經過ip route change命令實現,以下所示:

ip route change 192.168.1.30 dev eth0 via 192.168.1.66 realm 8

刪除

刪除動做經過ip route del命令實現,以下所示:

ip route del 192.168.1.30 dev eth0 via 192.168.1.66 realm 8
ip route del 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4

 

C規則涉及到 隊列(QUEUE) 分類器(CLASS) 過濾器(FILTER),filter劃分的標誌位可用U32或iptables的set-mark來實現 ) 通常是」控發」不控收 linux下有兩塊網卡,一個eth1是外網,另外一塊eth0是內網.在eth0上作HTB。(注 意:filter劃分標誌位可用u32打標功能或iptables的set-mark功能,若是用iptables來打標記的話,下行速LV在eth0處 控制,但打標應在進入eth0以前進行,因此,「-i eth1″;例子:

主要命令就下面三句:建立一個HTB的根

1.tc qdisc add dev eth0 root handle 1: htb default 20建立一個HTB的類,流量的限制就是在這裏限制的,並設置突發.

2.tc class add dev eth0 parent 1: classid 1:1 htb rate 200kbit(速率) ceil 200kbit burst 20k(突發流量)

建立一個過濾規則把要限制流量的數據過濾出來,併發給上面的類來限制速度3.tc filter add dev eth0 parent 1: prio 1(優先級) protocol ip u32 match ip sport 80 0xfff flowid 1:1

說明:讓交互數據包保持較低的延遲時間,並最早取得空閒帶寬,好比:

ssh telnet dns quake3 irc ftp控制 smtp命令和帶有SYN標記的數據包,都應屬於這一類。爲了保證上行數據流不會傷害下行流,還要把ACK數據包排在隊列前面,由於下行數據的ACK必須同上行流進行竟爭。

TC+IPTABLES+HTB+SFQ

1 tcp/ip 協議規定,每一個封包,都須要有ACKNOWLEDGE訊息的回傳,也就是說,傳輸的資料須要有一個收到資料的訊息回覆,才能決定後面的傳輸速度,並決定是 否從新傳輸遺失的資料,上行的帶寬一部分就是用來傳輸這些ACK資料的.上行帶寬點用大的時候,就會影響ACK資料的傳送速度,並進而影響到下載速度,

2 試驗證實,當上傳滿載時,下載速度變爲原來速度的40%,甚至更低,,由於上載文件(包括ftp上傳,發郵件SMTP),若是較大,一個的通信量令帶寬超 向包和,那麼全部的數據包按照先進先出的原則進行排隊和等待,這就能夠解釋爲何網內其中有人用ftp上載文件或發送大郵件的時候,整個網速變得很慢的原 因.

解決速度之道:

1 爲了解決這些速度問題,對通過線路的數據進行了有規則的分流.把原本在寬帶上的瓶頸轉移到咱們的LINUX路由器上,能夠把帶寬控制的比咱們購買的帶寬小一點. 這樣,咱們就能夠方便的用tc技術對通過的數據進行分流與控制.

咱們的想像就像馬路上的車道同樣,有高速道,還有小車道,大車道,須要高速的syn ack icmp ssh等走高速道,須要大量傳輸的ftp-data,smtp等走大車道,不能讓它堵塞整條馬路,各行其道.

linux下的TC(traffic control)就有這樣的做用,只要控制得當,必定會有明顯的效果.tc 和iptables結合是最好的簡單運用的結合方法.

我 們設置過濾器以便用iptables對數據包進行分類,由於iptables更靈活,並且還能夠爲每一個規則設置計數器,iptables用mangle鏈 來mark數據包,告訴了內核,數據包會有一個特定的FWMARK標記值(handle x fw) 代表它應該送給那個類(classid x:x),而prio是優先值,代表那些重要數據應該優先經過那個通道,首先選擇隊列(選擇htb),

通常系統默認的是fifo的先進先出隊列,就是說包是按照先來先處理的原則,若是有一個大的數據包在前面,那麼後面的包只能等前面的發完後才能接着發了,這樣就算後面既使是一個小小的ack包,也要等待了,這樣上傳就影響了下載,就算你有很大的下載帶寬也無能爲力.

HTB(Hierarchical token bucket,分層的令牌桶),就像CBQ同樣工做,可是並不靠計算閒置時間來整形,它是一個分類的令牌桶過濾器.,它只有不多的參數.

結構簡圖:             1:

~~~~~~~~~~~~~~~~`~~~~~

~~~~~~~_________1:1~~~~~~~~~1:2________

|~~~|~~~~|~~~~|~~~~~|~~~~~~~~|~~~~~~~~|~~~~~~~|

1:11~~~1:12~~~~~~~~~~~~1:21~~~1:22~~~1:23~~1:24

優先順序: 1:11 1:12 1:21 1:22 1:23 1:24

根據上面的例子,開始腳本:

關於參數的說明:

rate:是一個類保證獲得的帶寬值,若是有不僅一個類,請保證全部子類總和是小於或等於父類,

ceil: ceil是一個類最大能獲得帶寬值.

prio: 是優先權的設置,數值越大,優先權越小,若是是分配剩餘帶寬,就是數值小的會最優先取得剩餘的空閒的帶寬權.

通常大數據的話,控制在50%-80%左右吧,而ceil最大建議不超過85%,以避免某一個會話佔用過多的帶寬.

rate可按各種所須要分配:

1:11是很小並且最重要的數據包通道,固然要多分點,甚至必要時先所有佔用,不過通常不會的,因此給全速.

1:12是很重要的數據道,給多點,最少給一半,但須要時能夠再多一點

rate規劃 1:2=1:21 +1:22 +1:23 +1:24 通常總在50%-80%左右.

1:21 http,pop是最經常使用的啦,爲了太多人用,而致使堵塞,咱們不能給得太多,也不能太少.

1:22 我打算給smtp用,優先低於1:21,以防發大的附件大量佔用帶寬.

1:23 我打算給ftp-data,和1:22同樣,極可能大量上傳文件,因此,rate不能給的太多,而當其餘有剩時能夠給大些,ceil設置大些.

1:24 是無所謂通道,就是通常不是咱們平時工做上須要的通道,給小點防止這些人妨礙有正常工做須要的人.

上行uplink 320K,設置銷低於理論值.

DEV=」PPP0″

UPLINK=300

下行downlink 3200K大概一半左右,以便可以獲得更多的關發鏈接.

DOWNLINK=1500

1 曾加一個根隊列,沒有進行分類的數據包都走這個1:24是缺省類:

tc qdisc add dev $DEV parent 1: htb default 24

1.1 增長一個根隊下面主幹類1: 速率爲$UPLINK k

tc cladd add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0

1.1.1 在主幹類1下創建第一葉子類,這是一個最高優先權的類,須要高優先和高速的包走這條通道,好比SYN ACK ICMP等.

tc class add dev $DEV parent 1:1 classid 1:11 htb rate ${$uplink}kbit ceil ${uplink}kbit prio 1

1.1.2 在主類1下創建第二葉子類,這是一個次高優先權的類,好比咱們重要的CRM數據。

tc class add dev $DEV parent 1:1 classid 1:12 htb rate ${$uplink-150}kbit ceil ${uplink-50}kbit prio 2

1.2 在根類下創建次幹類 classid 1:2 ,這次幹類的下面所有優先權低於主幹類,以防重要數據堵塞。

tc class add dev $DEV parent 1: classid 1:2 htb rate ${$UPLINK -150]kbit prio 3

1.2.1 在次幹類下創建第一葉子類,能夠跑例如http ,pop等。

tc class add dev $DEV parent 1:2 classid 1:21 htb rate 100kbit ceil ${$uplink -150}kbit prio 4

1.2.2 在次幹類下創建第二葉子類,不要過高的速度,以防發大的附件大量佔用帶寬,便如smtp等。

tc class add dev $DEV parent 1:2 classid 1:22 htb rate 30kbit ceil ${uplink-160}kbit prio 5

1.2.3 在次幹類下創建第三葉子類,不要過高的帶寬,以防大量的數據堵塞網絡,例如:ftp-data.

tc class add dev $DEV parent 1:2 classid 1:23 htb rate 15kbit ceil ${UPLINK-170}kbit prio 6

1.2.4 在次幹類下創建第四葉子類。無所謂的數據通道,無須要太多的帶寬,以防無所謂的人在阻礙正務。

tc class add dev $DEV parent 1:2 classid 1:24 htb rate 5kbit ceil ${UPLINK -250}kbit prio 7

在每一個類下面再附加上另外一個隊列規定,隨機公平隊列(SFQ),不被某個鏈接不停佔用帶寬,以保證帶寬的平均公平使用。

#SFQ(stochastic fairness queueing 隨機公平隊列),SFQ的關鍵詞是「會話」(或稱做流),主要針對一個TCP會話或者UDP流,流量被分紅至關多數量的FIFO隊列中,每一個隊列對應一個會話。

數據按照簡單輪轉的方式發送,每一個會話都按順序獲得發送機會。這種方式很是公平,保證了每一個會話都不會被其它會話所淹沒,SFQ之因此被稱爲「隨機」,是由於它並非真的爲每一個會話建立一個隊列,而是使用一個散列算法,把全部的會話映射到有限的幾個隊列中去。

#參數perturb是多少秒後從新配置一次散列算法,默認爲10秒.

tc qdisc add dev $DEV parent 1:11 handle 111: sfq perturb 5

tc qidsc add dev $DEV parent 1:12 handle 112: sfq perturb 5

tc qdisc add dev $DEV parent 1:21 handle 121: sfq perturb 10

tc qidsc add dev $DEV parent 1:22 handle 122: sfq perturb 10

tc qidsc add dev $DEV parent 1:23 handle 123: sfq perturb 10

tc qidsc add dev $DEV parent 1:24 handle 124: sfq perturb 10

設置過濾器,handle是iptables做mark的值,讓被iptables在mangle鏈作了mark的不一樣的值選擇不一樣的通道classid,而prio是過濾器的優先級別

tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11

tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12

tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21

tc filter add dev $DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22

tc filter add dev $DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23

tc filter add dev $DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24

##################################################

##################################

下行的限制:

# 設置入隊的規則,是由於把一些常常會形成下載大文件的端口進行控制,不讓他們來得太快,致使堵塞,來得太快,就直接drop,就不會浪費和佔用機器時間和力量去處理了.

1 把下行速率控制在大概1000-1500K(大約爲帶寬的50%),由於這個速度已經夠用了,以便可以獲得更多的併發下載鏈接.

tc qdisc add dev $DEV handle ffff: ingress

tc filter add dev $DEV parent ffff: protocol ip prio 50 handle 8 fw police rate ${downlink}kbit burst 10k drop flowid :8

若是內部網數據流不是很瘋狂的話,就不用作下載的限制了,用#符號屏蔽上面兩行既可.

若是要對任何進來的數據進行限速的話,能夠用下面這句.

tc filter add dev $DEV parent ffff : protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate ${downlink}kbit burst 10k drop flowid :1

################################

開始給數據包打標記

把出去的不一樣類數據包(爲dport)給mark上標記1—6,讓它走不一樣的通道.

把進來的數據包(爲sport)給mark上標記8,讓它受到下行的限制,以避免速度太快而影響全局.

每條規則下跟着return的意思是能夠經過RETURN方法避免遍歷全部的規則,加快了處理速度.

設置TOS的處理:

iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j MARK –set-mark 1

iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j RETURN

iptables -t mangle -A PREROUTING -m tos –tos Minimize-Cost -j MARK –set-mark 4

iptables -t mangle -A PREROUTING –m tos –tos Minimize-Cost -j RETURN

iptables -t mangle -A PREROUTING -m tos –tos Maximize-Throughput -j MARK –set-mark 5

iptables -t mangle -A PREROUTING -m tos –tos Maximize-Througput -j RETURN

##提升TCP初始鏈接(也就是帶有SYN的數據包)的優先權是很是明智的.

iptables -t mangle -A PREROUTING -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -j MARK –set-mark 1

iptables -t mangle -A PREROUTING -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -j RETURN

#想ICMP 想ping有良好的反應,放在第一類。

iptables -t mangle -A PREROUTING -p icmp -j MARK –set-mark 1

iptables -t mangle -A PREROUTING -P icmp -j RETURN

#small packets (probably just ACKS)長度小於64的小包一般是須要快些的,通常是用來確認tcp的鏈接的,讓它跟快些的通道吧。

iptables -t mangle -A PREROUTING -p tcp -m length –length :64 -j MARK –set-mark 2

iptables -t mangle -A PREROUTING -p tcp -m length –length:64 -j RETURN

#ftp放第二類,由於通常是小包,ftp-data放在第5類,由於通常是大時數據的傳送。

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport ftp -j MARK –set-mark 2

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport ftp -j RETURN

iptables -t mangle -A PRETOUTING -p tcp -m tcp –dport ftp-data -j MARK –set-mark 5

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport ftp -j MARK –set-mark 8

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport ftp -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport ftp-data -j MARK –set-mark 8

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport ftp-data -j RETURN

###提升SSH數據包的優先權:放在第1類,要知道SSH是交互式的和重要的,不容待慢:

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 22 -j MARK –set-mark 1

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport -j RETURN

##SMTP郵件,放在第4類,由於有時有人發送很大的郵件,爲避免它堵塞,讓它跑第4道吧

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 25 -j MARK –st-mark 4

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 25 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 25 -j MARK –set-mark 8

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 25 -j RETURN

##name-domain server:放在第1類,這樣鏈接帶有域名的鏈接才能快速找到對應有的地址,提升速度

iptables -t mangle -A PREROUTING -p udp -m udp –dport 53 -j MARK –set-mark 1

iptables -t mangle -A PREROUTING -P udp -m udp –dport 53 -j RETURN

###HTTP: 放在第3類,是最經常使用的,最多人用的

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 80 -j MARK –set-mark 3

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 80 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 80 -j MARK –set-mark 8

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 80 -j RETURN

###pop郵件放在第3類:

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 110 -j MARK –set-mark 3

iptables -t mangle -A PREROUTING -p tcp -m tcp –dprot 110 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 110 -j MARK –set-mark 8

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 110 -j RETURN

###MICSOSOFT-SQL-SERVE:放在第2類,我這裏認爲較重要,必定保證速度和優先的

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 1433 -j MARK –set-mark 3

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 1433 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 1433 -j MARK –set-mark 8

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 1433 -j RETURN

##https:放在第3類

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 443 -j MARK –set-mark 3

iptables -t mangle -A PREROUTING -p tcpm -m tcp –dport 443 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 443 -j MAKR –set-mark 8

iptables -t mangle -A PREROUTING -P tcp -m tcp –sport 443 -j RETURN

###voip用,提升,語音要保持高速纔不會斷續

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 1720 -j MARK–SET-MARK 1

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 1720 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 1720 -j MAKR –set-mark 8

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 1720 -j RETURN

###*** 用做voip的,也要走高速路,纔不會斷續

iptables -t mangle -A PREROUTING -p udp -m udp –dport 7707 -j MARK –set-mark 1

iptables -t mangle -A PREROUTING -p udp -m udp –dport 7707 -j RETURN

###放在第1類,由於我以爲客觀存在要我心中很重要,優行:

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 7070 -j MARK –set-mark 1

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport -j RETURN

##提升本地數據包的優先權:放在第1類

iptables -t mangle -A OUTPUT -p tcp -m tcp –dport 22 -j MARK –set-mark 1

iptables -t mangle -A OUTPUT -p tcp -m tcp –dport 22 -j RETURN

iptables -t mangle -A OUTPUT -p icmp -j MARK –set-mark 1

iptables -t mangle -A OUTPUT -p icmp -j RETURN

###本地small packet (probably just ACKS)

iptables -t mangle -A OUTPUT -p tcp -m length –length :64 –set-mark 2

iptables -t mangle -A OUTPUT -p tcp -m length –length :64 -j RETURN

#################################################

## 向PRETOUTRIN中添加完mangle規則後,用這條規則結束prerouting表:也就是說前面沒有打過標記的數據包就交給1:24來處理實際 上是沒必要要的,由於1:24是缺省類,但仍然打上標記是爲了保持整個設置 的協調一致,並且這樣,還能看到規則的數據包計數:

iptables -t mangle -A PREROUTING -i $DEV -j MARK –set-mark 6

###對某人限制:iptables -t mangle -I PREROUTING 1 -s 192.168.xx.xx -j MAKR –set-mark 6

###iptables -t mangle -I PREROUTING 2 -s 192.168.xx.xx -j RETURN

###################################################

u32的應用:

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 …… 這就是所謂的u32匹配,能夠匹配數據包的任意部分.

根據源/目的地址: match ip src 0.0.0.0/0

match ip dst 1.2.3.0/24

單個IP地址能夠用/32來表示

根據源/目的端口能夠這樣表示: match ip sport 80 0xffff

match ip dport 80 0xffff

根據IP協議: match ip protocol (udp tcp icmp gre ipsec)

好比icmp協議是1 match ip protocol 1 0xff

舉例:

tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1

tc filter add dev $DEV parent 1:0 protocol ip prio 1

u32 match ip src 4.3.2.1/32 match ip sport 80 0xffff flowid 10:1

#!/bin/bash
#腳本文件名: tc2
#########################################################################################
#用TC(Traffic Control)解決ADSL寬帶速度技術 Ver. 1.0 by KindGeorge 2004.12.27 #
#########################################################################################
#此腳本通過實驗經過,更多的信息請參閱http://lartc.org
#tc+iptables+HTB+SFQ
#
#一.什麼是ADSL? ADSL(Asymmetric Digital Subscriber Loop,非對稱數字用戶環路)
#用最簡單的話的講,就是採用上行和下行不對等帶寬的基於ATM的技術.
#舉例,咱們最快的其中一條ADSL帶寬是下行3200Kbit,上行只有320Kbit.帶寬一般用bit表示.
#
#一、下行3200K 意味着什麼?
#由於 1Byte=8Bit ,一個字節由8個位(bit)組成,通常用大寫B表示Byte,小寫b表示Bit.
#因此 3200K=3200Kbps=3200K bits/s=400K bytes/s.
#二、 上行320K 意味着什麼?
# 320K=320Kbps=320K bits/s=40K bytes/s.
#就是說,我的所能獨享的最大下載和上傳速度,整條線路在沒任何損耗,最理想的時候,
#下載只有400K bytes/s,上傳只有最大40K bytes/s的上傳網速.
#這些都是理想值,但現實老是殘酷的,永遠沒有理想中那麼好.至少也有損耗,況且內部網有幾十臺
#電腦一塊兒瘋狂上網.
#
#3.ADSL上傳速度對下載的影響
#(1)TCP/IP協議規定,每一個封包,都須要有acknowledge訊息的回傳,也就是說,傳輸的資料,
#須要有一個收到資料的訊息回覆,才能決定後面的傳輸速度,並決定是否從新傳輸遺失
#的資料。上行的帶寬一部分就是用來傳輸這些acknowledge(確認)資料模鄙閒懈涸毓?
#大的時候,就會影響acknowledge資料的傳送速度,並進而影響到下載速度。這對非對稱
#數字環路也就是ADSL這種上行帶寬遠小於下載帶寬的鏈接來講影響尤其明顯。
#(2)試驗證實,當上傳滿載時,下載速度變爲原來速度的40%,甚至更低.由於上載文件(包括ftp
#上傳,發郵件smtp),若是較大,一我的的通信量已經令整條adsl變得趨向飽和,那麼全部的數據
#包只有按照先進先出的原則進行排隊和等待.這就能夠解釋爲何網內其中有人用ftp上載文件,
#或發送大郵件的時候,整個網速變得很慢的緣由。
#
#二.解決ADSL速度之道
#1. 爲解決這些速度問題,咱們按照數據流和adsl的特色,對通過線路的數據進行了有規則的分流.
#把原本在adsl modem上的瓶頸轉移到咱們linux路由器上,能夠把帶寬控制的比adsl modem上的小一點,
#這樣咱們就能夠方便的用tc技術對通過的數據進行分流和控制.
#咱們的想象就象馬路上的車道同樣,有高速道,還有小車道,大車道.須要高速的syn,ack,icmp等走
#高速道,須要大量傳輸的ftp-data,smtp等走大車道,不能讓它堵塞整條馬路.各行其道.
#2. linux下的TC(Traffic Control)就有這樣的做用.只要控制得當,必定會有明顯的效果.
#tc和iptables結合是最好的簡單運用的結合方法.
#咱們設置過濾器以便用iptables對數據包進行分類,由於iptables更靈活,並且你還能夠爲每一個規則設
#置計數器. iptables用mangle鏈來mark數據包,告訴了內核,數據包會有一個特定的FWMARK標記值(hanlde x fw),
#代表它應該送給哪一個類( classid x : x),而prio是優先值,代表哪些重要數據應該優先經過哪一個通道.
#首先選擇隊列,cbq和htb是不錯的選擇,通過實驗,htb更爲好用,因此如下腳本採用htb來處理
#3. 通常系統默認的是fifo的先進先出隊列,就是說數據包按照先來先處理的原則,若是有一個大的數
#據包在前面,#那麼後面的包只能等前面的發完後才能接着發了,這樣就算後面即便是一個小小的ack包,
#也要等待了,這樣上傳就影響了下載,就算你有很大的下載帶寬也無能爲力.
#HTB(Hierarchical Token Bucket, 分層的令牌桶)
#更詳細的htb參考 http://luxik.cdi.cz/~devik/qos/htb/
#HTB就象CBQ同樣工做,可是並不靠計算閒置時間來整形。它是一個分類的令牌桶過濾器。它只有不多的參數
#他的分層(Hierarchical)可以很好地知足這樣一種狀況:你有一個固定速率的鏈路,但願分割給多種不一樣的
#用途使用,爲每種用途作出帶寬承諾並實現定量的帶寬借用。
#4. 結構簡圖:
#~~~~~~ |
#~~~~~ __1:__
#~~~~ |~~~~~ |
#~ _ _ _1:1~~~ 1:2_ _ _ _ _ _ _ _
# | ~ ~ | ~ ~ ~ | ~ ~ | ~ ~ | ~ ~ |
#1:11~1:12~~1:21~1:22~1:23~1:24
#優先順序是1:11 1:12 1:21 1:22 1:23 1:24
#

#——————————————————————————————–
#5.根據上面的例子,開始腳本
#一般adsl用pppoe鏈接,的獲得的是ppp0,因此公網網卡上綁了ppp0
#關於參數的說明
#(1)rate: 是一個類保證獲得的帶寬值.若是有不僅一個類,請保證全部子類總和是小於或等於父類.
#(2)ceil: ceil是一個類最大能獲得的帶寬值.
#(3)prio: 是優先權的設置,數值越大,優先權越小.若是是分配剩餘帶寬,就是數值小的會最優先取得剩餘
#的空閒的帶寬權.
#具體每一個類要分配多少rate,要根據實際使用測試得出結果.
#通常大數據的話,控制在50%-80%左右吧,而ceil最大建議不超過85%,以避免某一個會話佔用過多的帶寬.
#rate可按各種所需分配,
#1:11 是很小並且最重要的數據包通道,固然要分多點.甚至必要時先所有佔用,不過通常不會的.因此給全速.
#1:12 是很重要的數據道,給多點,最少給一半,但須要時能夠再多一點.
#rate 規劃 1:2 = 1:21 + 1:22 + 1:23 + 1:24 通常總數在50%-80%左右
#1:21 http,pop是最經常使用的啦,爲了太多人用,而致使堵塞,咱們不能給得太多,也不能太少.
#1:22 我打算給smtp用,優先低於1:21 以防發大的附件大量佔用帶寬,
#1:23 我打算給ftp-data,和1:22同樣,極可能大量上傳文件,因此rate不能給得太多,而當其餘有剩時能夠給大些,ceil設置大些
#1:24 是無所謂通道,就是通常不是咱們平時工做上須要的通道了,給小點,防止這些人在妨礙有正常工做須要的人
#上行 uplink 320K,設置稍低於理論值
DEV=」ppp0″
UPLINK=300
#下行downlink 3200 k 大概一半左右,以便可以獲得更多的併發鏈接
DOWNLINK=1500
echo 「==================== Packetfilter and Traffic Control 流量控制 By 網絡技術部 Ver. 1.0====================」
start_routing() {
echo -n 「隊列設置開始start……」
#1.增長一個根隊列,沒有進行分類的數據包都走這個1:24是缺省類:
tc qdisc add dev $DEV root handle 1: htb default 24
#1.1增長一個根隊下面主幹類1: 速率爲$UPLINK k
tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0
#1.1.1 在主幹類1下創建第一葉子類,這是一個最高優先權的類.須要高優先和高速的包走這條通道,好比SYN,ACK,ICMP等
tc class add dev $DEV parent 1:1 classid 1:11 htb rate $[$UPLINK]kbit ceil ${UPLINK}kbit prio 1
#1.1.2 在主類1下創建第二葉子類 ,這是一個次高優先權的類。好比咱們重要的crm數據.
tc class add dev $DEV parent 1:1 classid 1:12 htb rate $[$UPLINK-150]kbit ceil ${UPLINK-50}kbit prio 2
#1.2 在根類下創建次幹類 classid 1:2 。這次幹類的下面所有優先權低於主幹類,以防重要數據堵塞.
tc class add dev $DEV parent 1: classid 1:2 htb rate $[$UPLINK-150]kbit prio 3
#1.2.1 在次幹類下創建第一葉子類,能夠跑例如http,pop等.
tc class add dev $DEV parent 1:2 classid 1:21 htb rate 100kbit ceil $[$UPLINK-150]kbit prio 4
#1.2.2 在次幹類下創建第二葉子類。不要過高的速度,以防發大的附件大量佔用帶寬,例如smtp等
tc class add dev $DEV parent 1:2 classid 1:22 htb rate 30kbit ceil $[$UPLINK-160]kbit prio 5
#1.2.3 在次幹類下創建第三葉子類。不要太多的帶寬,以防大量的數據堵塞網絡,例如ftp-data等,
tc class add dev $DEV parent 1:2 classid 1:23 htb rate 15kbit ceil $[$UPLINK-170]kbit prio 6
#1.2.4 在次幹類下創建第四葉子類。無所謂的數據通道,無須要太多的帶寬,以防無所謂的人在阻礙正務.
tc class add dev $DEV parent 1:2 classid 1:24 htb rate 5kbit ceil $[$UPLINK-250]kbit prio 7
#在每一個類下面再附加上另外一個隊列規定,隨機公平隊列(SFQ),不被某個鏈接不停佔用帶寬,以保證帶寬的平均公平使用:
#SFQ(Stochastic Fairness Queueing,隨機公平隊列),SFQ的關鍵詞是「會話」(或稱做「流」) ,
#主要針對一個TCP會話或者UDP流。流量被分紅至關多數量的FIFO隊列中,每一個隊列對應一個會話。
#數據按照簡單輪轉的方式發送, 每一個會話都按順序獲得發送機會。這種方式很是公平,保證了每一
#個會話都不會沒其它會話所淹沒。SFQ之因此被稱爲「隨機」,是由於它並非真的爲每個會話建立
#一個隊列,而是使用一個散列算法,把全部的會話映射到有限的幾個隊列中去。
#參數perturb是多少秒後從新配置一次散列算法。默認爲10
tc qdisc add dev $DEV parent 1:11 handle 111: sfq perturb 5
tc qdisc add dev $DEV parent 1:12 handle 112: sfq perturb 5
tc qdisc add dev $DEV parent 1:21 handle 121: sfq perturb 10
tc qdisc add dev $DEV parent 1:22 handle 122: sfq perturb 10
tc qdisc add dev $DEV parent 1:23 handle 133: sfq perturb 10
tc qdisc add dev $DEV parent 1:24 handle 124: sfq perturb 10
echo 「隊列設置成功.done.」
echo -n 「設置包過濾 Setting up Filters……」
#這裏設置過濾器,handle 是iptables做mark的值,讓被iptables 在mangle鏈作了mark的不一樣的值選擇不一樣的通
#道classid,而prio 是過濾器的優先級別.
tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
tc filter add dev $DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22
tc filter add dev $DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23
tc filter add dev $DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24
echo 「設置過濾器成功.done.」
########## downlink ##########################################################################
#6. 下行的限制:
#設置入隊的規則,是由於把一些常常會形成下載大文件的端口進行控制,不讓它們來得太快,致使堵塞.來得太快
#的就直接drop,就不會浪費和佔用機器時間和力量去處理了.
#(1). 把下行速率控制在大概1000-1500k左右,由於這個速度已經足夠用了,以便可以獲得更多的併發下載鏈接
tc qdisc add dev $DEV handle ffff: ingress
tc filter add dev $DEV parent ffff: protocol ip prio 50 handle 8 fw police rate ${DOWNLINK}kbit burst 10k drop flowid :8
}
#(2).若是內部網數據流不是很瘋狂的話,就不用作下載的限制了,用#符號屏蔽上面兩行便可.
#(3).若是要對任何進來數據的數據進行限速的話,能夠用下面這句:
#tc filter add dev $DEV parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
###############################################################################################

#7. 開始給數據包打標記,往PREROUTING鏈中添加mangle規則:
start_mangle() {
echo -n 「開始給數據包打標記……start mangle mark……」
#(1)把出去的不一樣類數據包(爲dport)給mark上標記1–6.讓它走不一樣的通道
#(2)把進來的數據包(爲sport)給mark上標記8,讓它受到下行的限制,以避免速度太過快而影響全局.
#(3)每條規則下根着return的意思是能夠經過RETURN方法避免遍歷全部的規則,加快了處理速度
##設置TOS的處理:
#iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j MARK –set-mark 1
#iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j RETURN
#iptables -t mangle -A PREROUTING -m tos –tos Minimize-Cost -j MARK –set-mark 4
#iptables -t mangle -A PREROUTING -m tos –tos Minimize-Cost -j RETURN
#iptables -t mangle -A PREROUTING -m tos –tos Maximize-Throughput -j MARK –set-mark 5
#iptables -t mangle -A PREROUTING -m tos –tos Maximize-Throughput -j RETURN
##提升tcp初始鏈接(也就是帶有SYN的數據包)的優先權是很是明智的:
iptables -t mangle -A PREROUTING -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -j RETURN
######icmp,想ping有良好的反應,放在第一類吧.
iptables -t mangle -A PREROUTING -p icmp -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -p icmp -j RETURN
# small packets (probably just ACKs)長度小於64的小包一般是須要快些的,通常是用來確認tcp的鏈接的,
#讓它跑快些的通道吧.也能夠把下面兩行屏蔽,由於再下面有更多更明細的端口分類.
iptables -t mangle -A PREROUTING -p tcp -m length –length :64 -j MARK –set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m length –length :64 -j RETURN
#ftp放第2類,由於通常是小包, ftp-data放在第5類,由於通常是大量數據的傳送.
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport ftp -j MARK –set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport ftp-data -j MARK –set-mark 5
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport ftp -j MARK –set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport ftp-data -j MARK –set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport ftp-data -j RETURN
##提升ssh數據包的優先權:放在第1類,要知道ssh是交互式的和重要的,不容待慢哦
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 22 -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 22 -j RETURN
#
##smtp郵件:放在第4類,由於有時有人發送很大的郵件,爲避免它堵塞,讓它跑4道吧
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 25 -j MARK –set-mark 4
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 25 -j RETURN
#iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 25 -j MARK –set-mark 8
#iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 25 -j RETURN
## name-domain server:放在第1類,這樣鏈接帶有域名的鏈接才能快速找到對應的地址,提升速度的一法
iptables -t mangle -A PREROUTING -p udp -m udp –dport 53 -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp –dport 53 -j RETURN
#
## http:放在第3類,是最經常使用的,最多人用的,
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 80 -j MARK –set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 80 -j MARK –set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 80 -j RETURN
##pop郵件:放在第3類
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 110 -j MARK –set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 110 -j MARK –set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 110 -j RETURN
## https:放在第3類
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 443 -j MARK –set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 443 -j MARK –set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 443 -j RETURN
## Microsoft-SQL-Server:放在第2類,我這裏認爲較重要,必定要保證速度的和優先的.
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 1433 -j MARK –set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 1433 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 1433 -j MARK –set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 1433 -j RETURN
## voip用, 提升,語音通道要保持高速,纔不會斷續.
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 1720 -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 1720 -j RETURN
iptables -t mangle -A PREROUTING -p udp -m udp –dport 1720 -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp –dport 1720 -j RETURN
## *** ,用做voip的,也要走高速路,纔不會斷續.
iptables -t mangle -A PREROUTING -p udp -m udp –dport 7707 -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp –dport 7707 -j RETURN
## 放在第1類,由於我以爲它在我心中很重要,優先.
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 7070 -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 7070 -j RETURN
## WWW caching service:放在第3類
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 8080 -j MARK –set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 8080 -j MARK –set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 8080 -j RETURN
##提升本地數據包的優先權:放在第1
iptables -t mangle -A OUTPUT -p tcp -m tcp –dport 22 -j MARK –set-mark 1
iptables -t mangle -A OUTPUT -p tcp -m tcp –dport 22 -j RETURN
iptables -t mangle -A OUTPUT -p icmp -j MARK –set-mark 1
iptables -t mangle -A OUTPUT -p icmp -j RETURN
#本地small packets (probably just ACKs)
iptables -t mangle -A OUTPUT -p tcp -m length –length :64 -j MARK –set-mark 2
iptables -t mangle -A OUTPUT -p tcp -m length –length :64 -j RETURN
#(4). 向PREROUTING中添加完mangle規則後,用這條規則結束PREROUTING表:
##也就是說前面沒有打過標記的數據包將交給1:24處理。
##其實是沒必要要的,由於1:24是缺省類,但仍然打上標記是爲了保持整個設置的協調一致,並且這樣
#還能看到規則的包計數。
iptables -t mangle -A PREROUTING -i $DEV -j MARK –set-mark 6
echo 「標記完畢! mangle mark done!」
}

#—————————————————————————————————–#8.取消mangle標記用的自定義函數stop_mangle() {echo -n 「中止數據標記 stop mangle table……」( iptables -t mangle -F && echo 「ok.」 ) || echo 「error.」}#9.取消隊列用的stop_routing() {echo -n 「(刪除全部隊列……)」( tc qdisc del dev $DEV root && tc qdisc del dev $DEV ingress && echo 「ok.刪除成功!」 ) || echo 「error.」}#10.顯示狀態status() {echo 「1.show qdisc $DEV (顯示上行隊列):———————————————-」tc -s qdisc show dev $DEVecho 「2.show class $DEV (顯示上行分類):———————————————-」tc class show dev $DEVecho 「3. tc -s class show dev $DEV (顯示上行隊列和分類流量詳細信息):——————」tc -s class show dev $DEVecho 「說明:設置總隊列上行帶寬 $UPLINK k.」echo 「1. classid 1:11 ssh、dns、和帶有SYN標記的數據包。這是最高優先權的類包並最早類 」echo 「2. classid 1:12 重要數據,這是較高優先權的類。」echo 「3. classid 1:21 web,pop 服務 」echo 「4. classid 1:22 smtp服務 」echo 「5. classid 1:23 ftp-data服務 」echo 「6. classid 1:24 其餘服務 」}#11.顯示幫助usage() {echo 「使用方法(usage): `basename $0` [start | stop | restart | status | mangle ]」echo 「參數做用:」echo 「start 開始流量控制」echo 「stop 中止流量控制」echo 「restart 重啓流量控制」echo 「status 顯示隊列流量」echo 「mangle 顯示mark標記」}#———————————————————————————————-#12. 下面是腳本運行參數的選擇的控制#kernel=`eval kernelversion`case 「$kernel」 in2.2)echo 」 (!) Error: won’t do anything with 2.2.x 不支持內核2.2.x」exit 1;;2.4|2.6)case 「$1」 instart)( start_routing && start_mangle && echo 「開始流量控制! TC started!」 ) || echo 「error.」exit 0;;stop)( stop_routing && stop_mangle && echo 「中止流量控制! TC stopped!」 ) || echo 「error.」exit 0;;restart)stop_routingstop_manglestart_routingstart_mangleecho 「流量控制規則從新裝載!」;;status)status;;mangle)echo 「iptables -t mangle -L (顯示目前mangle表表標記詳細):」iptables -t mangle -nL;;*) usageexit 1;;esac;;*)echo 」 (!) Error: Unknown kernel version. check it !」exit 1;;esac

相關文章
相關標籤/搜索