關(guān)于iptables和tc的限速理解

關(guān)于iptables

iptables是包過(guò)濾軟件,包過(guò)濾的順序如下:

鳥哥的iptables圖
鳥哥的iptables圖

每一個(gè)包都會(huì)匹配rule策略,而每一個(gè)rule策略會(huì)有一個(gè)action,觸發(fā)了其中一個(gè)rule就不會(huì)觸發(fā)另外一個(gè)rule,但如果要觸發(fā)的rule放在最后面,那么可以想象,包過(guò)濾的效率就會(huì)大大降低,所以設(shè)計(jì)策略的時(shí)候要盡量將常用的策略放在最前面,策略的順序可以通過(guò)不斷的調(diào)整 -A 和-I策略,甚至還有return的動(dòng)作,設(shè)計(jì)iptables的人真的很厲害。

這是iptables內(nèi)部的table表和chain鏈,可以理解為iptables是一個(gè)大網(wǎng),table就是小網(wǎng),里面的chain就是他的網(wǎng)線,當(dāng)數(shù)據(jù)包經(jīng)過(guò)這個(gè)小網(wǎng)的時(shí)候必然會(huì)觸碰這些網(wǎng)線,這樣“看不順眼”的數(shù)據(jù)包就會(huì)被攔住。鳥哥的圖畫的真好。這里需要理解的是數(shù)據(jù)包的流行會(huì)分2個(gè)地方,就是進(jìn)入本機(jī)或者不進(jìn)入本機(jī),進(jìn)入本機(jī)的包就會(huì)走input的chain鏈,不進(jìn)入本機(jī)的包就會(huì)去FORWARD,什么是進(jìn)入或者不進(jìn)入呢?

舉個(gè)例子就是這是一臺(tái)路由器服務(wù)器,服務(wù)器上面假設(shè)了web服務(wù)器,然后這個(gè)路由器負(fù)責(zé)的內(nèi)部網(wǎng)絡(luò)還有一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,不過(guò)這臺(tái)服務(wù)器是獨(dú)立于路由器的另外一臺(tái)機(jī)器,不過(guò)上網(wǎng)也是要經(jīng)過(guò)路由器,那么一個(gè)外網(wǎng)用戶訪問(wèn)這個(gè)web服務(wù)器和訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)器的行為就是進(jìn)入本機(jī)和不進(jìn)入本機(jī)的行為,因?yàn)閣eb服務(wù)器是跟路由器在同一臺(tái)機(jī)器上的,所以要進(jìn)入本機(jī),因?yàn)閿?shù)據(jù)庫(kù)服務(wù)器是另外一臺(tái)機(jī)器上的,所以不進(jìn)入本機(jī)。解釋得好渣,還是看鳥哥吧。鳥哥乃神人。回歸主題,看下圖的結(jié)構(gòu),可以看出如果我們要在iptables上操刀的話可以在任何表上操刀,例如可以在PREROUTING,F(xiàn)ORWARD,POSTROUTING表上做限速是完全沒(méi)有問(wèn)題的,前提是要注意不能沖突,每個(gè)表都有各自的作用。所以一般來(lái)說(shuō),要寫iptables策略的時(shí)候都要跟著這個(gè)圖來(lái)筆畫一下,這樣才能知道有沒(méi)有寫錯(cuò)。

filter (過(guò)濾器):主要跟進(jìn)入 Linux 本機(jī)的封包有關(guān),這個(gè)是預(yù)設(shè)的 table 喔!
INPUT:主要與想要進(jìn)入我們 Linux 本機(jī)的封包有關(guān);
OUTPUT:主要與我們 Linux 本機(jī)所要送出的封包有關(guān);
FORWARD:這個(gè)咚咚與 Linux 本機(jī)比較沒(méi)有關(guān)係, 他可以『轉(zhuǎn)遞封包』到後端的電腦中,與下列 nat table 相關(guān)性較高。

nat (位址轉(zhuǎn)換):是 Network Address Translation 的縮寫, 這個(gè)表格主要在進(jìn)行來(lái)源與目的之 IP 或 port 的轉(zhuǎn)換,與 Linux 本機(jī)較無(wú)關(guān),主要與 Linux 主機(jī)後的區(qū)域網(wǎng)路內(nèi)電腦較有相關(guān)。
PREROUTING:在進(jìn)行路由判斷之前所要進(jìn)行的規(guī)則(DNAT/REDIRECT)
POSTROUTING:在進(jìn)行路由判斷之後所要進(jìn)行的規(guī)則(SNAT/MASQUERADE)
OUTPUT:與發(fā)送出去的封包有關(guān)

mangle (破壞者):這個(gè)表格主要是與特殊的封包的路由旗標(biāo)有關(guān), 早期僅有 PREROUTING 及 OUTPUT 鏈,不過(guò)從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD 鏈。 由於這個(gè)表格與特殊旗標(biāo)相關(guān)性較高,所以像咱們這種單純的環(huán)境當(dāng)中,較少使用 mangle 這個(gè)表格。
Table (表名) Explanation (注釋)
nat nat表的主要用處是網(wǎng)絡(luò)地址轉(zhuǎn)換,即Network Address Translation,縮寫為NAT。做過(guò)NAT操作的數(shù)據(jù)包的地址就被改變了,當(dāng)然這種改變是根據(jù)我們的規(guī)則進(jìn)行 的。屬于一個(gè)流的包只會(huì)經(jīng)過(guò)這個(gè)表一次。如果第一個(gè)包被允許做NAT或Masqueraded,那么余下的包都會(huì)自 動(dòng)地被做相同的操作。也就是說(shuō),余下的包不會(huì)再通過(guò)這個(gè)表,一個(gè)一個(gè)的被NAT,而是自動(dòng)地完成。這就 是我們?yōu)槭裁床粦?yīng)該在這個(gè)表中做任何過(guò)濾的主要原因,對(duì)這一點(diǎn),后面會(huì)有更加詳細(xì)的討論。PREROUTING 鏈的作用是在包剛剛到達(dá)防火墻時(shí)改變它的目的地址,如果需要的話。OUTPUT鏈改變本地產(chǎn)生的包的目的地 址。POSTROUTING鏈在包就要離開防火墻之前改變其源地址。
mangle 這個(gè)表主要用來(lái)mangle數(shù)據(jù)包。我們可以改變不同的包及包 頭的內(nèi)容,比如 TTL,TOS或MARK。 注意MARK并沒(méi)有真正地改動(dòng)數(shù)據(jù)包,它只是在內(nèi)核空間為包設(shè)了一個(gè)標(biāo)記。防火墻 內(nèi)的其他的規(guī)則或程序(如tc)可以使用這種標(biāo)記對(duì)包進(jìn)行過(guò)濾或高級(jí)路由。這個(gè)表有五個(gè)內(nèi)建的鏈: PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。PREROUTING在包進(jìn)入防火墻之后、路由判斷之前改變 包,POSTROUTING是在所有路由判斷之后。 OUTPUT在確定包的目的之前更改數(shù)據(jù)包。INPUT在包被路由到本地 之后,但在用戶空間的程序看到它之前改變包。FORWARD在最初的路由判 斷之后、最后一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改變數(shù)據(jù)包的 TTL,TOS或MARK,而不是其源目地 址。NAT是在nat表中操作的。
filter filter表是專門過(guò)濾包 的,內(nèi)建三個(gè)鏈,可以毫無(wú)問(wèn)題地對(duì)包進(jìn)行DROP、LOG、ACCEPT和REJECT等操作。FORWARD 鏈過(guò)濾所有不是本地產(chǎn)生的并且目的地不是本地(所謂本地就是防火墻了)的包,而 INPUT恰恰針對(duì)那些目的地是本地的包。OUTPUT 是用來(lái)過(guò)濾所有本地生成的包的
鳥哥的iptables圖
鳥哥的iptables圖
  • iptables是主要工作在第三,四層的,即主要處理ip、tcp,偶爾能夠在第七層工作是因?yàn)榇蛄藀atch。

  • 什么是數(shù)據(jù)包:其實(shí)就是只ip數(shù)據(jù)包和tcp數(shù)據(jù)包

包(Packet)是TCP/IP協(xié)議通信傳輸中的數(shù)據(jù)單位,一般也稱“數(shù)據(jù)包”。有人說(shuō),局域網(wǎng)中傳輸?shù)牟皇恰皫?Frame)嗎?沒(méi)錯(cuò),但是TCP/IP協(xié)議是工作在OSI模型第三層(網(wǎng)絡(luò)層)、第四層(傳輸層)上的,而幀是工作在第二層(數(shù)據(jù)鏈路層)。上一層的內(nèi)容由下一層的內(nèi)容來(lái)傳輸,所以在局域網(wǎng)中,“包”是包含在“幀”里的。

舉例來(lái)說(shuō)tcp包的包頭含有以下這些信息(等等):

信息|解釋|iptables關(guān)鍵字
------------- | -------------
源ip地址|發(fā)送包的IP地址。|src
目的IP地址|接收包的IP地址。|dst
源端口|源系統(tǒng)上的連接的端口。|sport
目的端口|目的系統(tǒng)上的連接的端口。|dport

osi7層圖
osi7層圖

關(guān)于tc

TC--Traffic Control

TC是linux中的流量控制模塊,利用隊(duì)列規(guī)定建立起數(shù)據(jù)包隊(duì)列,并定義了隊(duì)列中數(shù)據(jù)包的發(fā)送方式,從而實(shí)現(xiàn)對(duì)流量的控制。關(guān)鍵字:隊(duì)列系統(tǒng),包接收和傳輸。

Traffic control is the name given to the sets of queuing systems and mechanisms by which packets are received and transmitted on a router. This includes deciding which (and whether) packets to accept at what rate on the input of an interface and determining which packets to transmit in what order at what rate on the output of an interface.

這里是官方翻譯:http://my.oschina.net/guol/blog/82453?p=1

原版:http://www.tldp.org/HOWTO/Traffic-Control-HOWTO/

tc工作位置圖:

tc工作位置圖
tc工作位置圖

在我使用的過(guò)程中,對(duì)于他的理解是有一些加深了:

  1. tc就是看門的,like as a dog,所以這就可以解釋了為什么要iptables+tc了,tc能夠和iptables合作,因?yàn)榭梢詮膱D上看到各自工作的位置是不一樣的,各施其職。

  2. tc對(duì)于包一視同仁,專門負(fù)責(zé)包的排隊(duì)分發(fā),官方里面提到一個(gè)很經(jīng)典的說(shuō)法就是他是一個(gè)接收和傳輸?shù)年?duì)列系統(tǒng),tc翻譯為交通管制是很巧妙的,有鑒于此,我認(rèn)為他的限速效果最好,無(wú)論你是p2p包還是什么加密包,只要是包就要受到約束,這樣就可以避免了那些日新月異的封裝加密之類的包被逃掉了。

  3. tc主要是以mark的形式來(lái)匹配,所以使用的時(shí)候mark標(biāo)記需要注意不要沖突,mark標(biāo)記是iptables里面提到的一個(gè)東西:

    6.5.5. MARK target

    用來(lái)設(shè)置mark值,這個(gè)值只能在本地的mangle表里使用,不能用在其他任何地方,就更不用說(shuō)路由器或 另一臺(tái)機(jī)子了。因?yàn)閙ark比較特殊,它不是包本身的一部分,而是在包穿越計(jì)算機(jī)的過(guò)程中由內(nèi)核分配的和 它相關(guān)聯(lián)的一個(gè)字段。它可以和本地的高級(jí)路由功能聯(lián)用,以使不同的包能使用不同的隊(duì)列要求,等等。如 果你想在傳輸過(guò)程中也有這種功能,還是用TOS target吧。有關(guān)高級(jí)路由的更多信息,可以查看Linux Advanced Routing and Traffic Control HOW-TO。

    mark只能存在于內(nèi)核之中,不受三界法則影響,所以mark值我覺(jué)得是配置tc的特別需要注意的地方,尤其是如果你使用了wifidog之類的要玩mark的時(shí)候。

  4. tc的類是樹架構(gòu),有主干和葉這樣很分明的區(qū)分的,這種層次是很容易理解的,不過(guò)文檔的解釋是相當(dāng)?shù)碾y理解,難理解的是怎么做,命令寫法簡(jiǎn)直坑爹。

  5. 涉及很多相當(dāng)高深的隊(duì)列算法,流控制模式其實(shí)略懂就行了,諸葛先生不也就略懂么。所以不是那種極端情況其實(shí)無(wú)須特別考慮這個(gè)。

  6. 對(duì)于tc來(lái)說(shuō),上傳和下載行為是這樣區(qū)分的,上傳,就是用戶端發(fā)送數(shù)據(jù)包給服務(wù)器,假設(shè)路由器是雙網(wǎng)卡,所以負(fù)責(zé)發(fā)送數(shù)據(jù)包給服務(wù)器的是外網(wǎng)網(wǎng)卡,所以限制上傳速度在外網(wǎng)網(wǎng)卡處, 下載,就是服務(wù)器發(fā)送數(shù)據(jù)包給用戶,因?yàn)槁酚善魇请p網(wǎng)卡的關(guān)系,所以負(fù)責(zé)發(fā)送數(shù)據(jù)包給用戶的是內(nèi)網(wǎng)網(wǎng)卡,所以限制下載速度是在內(nèi)網(wǎng)網(wǎng)卡,因?yàn)閠c是一個(gè)能夠負(fù)責(zé)接收數(shù)據(jù)包的工具,所以限制上傳速度其實(shí)就是限制外網(wǎng)網(wǎng)卡接收用戶發(fā)送的數(shù)據(jù)包的速度,而限制下載速度其實(shí)就是限制內(nèi)網(wǎng)網(wǎng)卡接收到要發(fā)送給用戶的數(shù)據(jù)包的速度。


測(cè)試流程介紹

  1. 首先需要建立tc策略
  2. 然后由iptables 來(lái)進(jìn)行調(diào)用,主要通過(guò)set mark,根據(jù)不同的mark標(biāo)記來(lái)進(jìn)行不同的tc策略調(diào)用

備注:

  1. 測(cè)試環(huán)境是eth0負(fù)責(zé)外網(wǎng),p3p1是負(fù)責(zé)內(nèi)網(wǎng)
  2. 考慮到特殊需求,tc限制的是所有的包,所以需要iptables將發(fā)到內(nèi)網(wǎng)服務(wù)器的包分開處理,以便實(shí)現(xiàn)訪問(wèn)外網(wǎng)能夠限制網(wǎng)速,訪問(wèn)內(nèi)網(wǎng)沒(méi)有限制

上傳:

清除 eth0 所有隊(duì)列規(guī)則
tc qdisc del dev eth0 root 2>/dev/null

定義最頂層(根)隊(duì)列規(guī)則,并指定 default 類別編號(hào),為網(wǎng)絡(luò)接口eth1 綁定一個(gè)隊(duì)列,類型為htb,并指定了一個(gè)handle句柄1:0用于標(biāo)識(shí)它下面的子類,沒(méi)有標(biāo)識(shí)的會(huì)被分配到默認(rèn)子類123(默認(rèn)值只是設(shè)置而已,可以不用)
tc qdisc add dev eth0 root handle 1:0 htb default 123

用于為隊(duì)列建一個(gè)主干類,帶寬為100Mbit,最大速率為100Mbit,(這里是bit,所以實(shí)際速度需要除以8)優(yōu)先級(jí)為0,htb的主干類不能互相借用帶寬,但是一個(gè)父類的所有子類之間可以借用帶寬,這里parent 1:0是剛才建立的handle1:0 ,classid是他的子類,分類號(hào)為1:1,冒號(hào)前面是父類號(hào)
后面是子類號(hào)
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0

為主干類建立第一個(gè)葉分類,帶寬為10Mbit,最大速為10Mbit,優(yōu)先級(jí)為1,所有葉分類的全部子類優(yōu)先級(jí)低于主干類,
以防止重要數(shù)據(jù)堵塞,主要還是避免邏輯混亂,10Mbit必須要有96kbit的burst速度
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10Mbit ceil 10Mbit prio 1 burst 96kbit

設(shè)置調(diào)度,sfq隨機(jī)公平算法,這里的parent是指隸屬于之前的子分類,你需要對(duì)哪一個(gè)子分類的條目做隊(duì)列分配控制就需要在這里寫對(duì)應(yīng)的子分類id
在每個(gè)類下面再附加上另一個(gè)隊(duì)列規(guī)定,隨機(jī)公平隊(duì)列(SFQ),不被某個(gè)連接不停占用帶寬,以保證帶寬的平均公平使用:
        #SFQ(Stochastic Fairness Queueing,隨機(jī)公平隊(duì)列),SFQ的關(guān)鍵詞是“會(huì)話”(或稱作“流”) ,
        #主要針對(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ì)沒(méi)其它會(huì)話所淹沒(méi)。SFQ之所以被稱為“隨機(jī)”,是因?yàn)樗⒉皇钦娴臑槊恳粋€(gè)會(huì)話創(chuàng)建
        #一個(gè)隊(duì)列,而是使用一個(gè)散列算法,把所有的會(huì)話映射到有限的幾個(gè)隊(duì)列中去。
        #參數(shù)perturb是多少秒后重新配置一次散列算法。默認(rèn)為10
tc qdisc add dev eth0 parent 1:11 handle 111:0 sfq perturb 10

設(shè)置過(guò)濾器filter,對(duì)應(yīng)之前配置的哪一個(gè)父類和子類,然后設(shè)置控制編號(hào)handle,這里是跟iptables的mark相對(duì)應(yīng)的,并且多個(gè)不同的filter注意prio不要相同。
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1001 fw classid 1:11

設(shè)置iptables規(guī)則,在mangle表的postroutingchain上配置,源地址是172.16.1.138并且目標(biāo)地址不是192.168.0.10,從網(wǎng)卡eth0發(fā)出的包進(jìn)行mark,mark號(hào)是1001
iptables -t mangle -A POSTROUTING -s 172.16.1.138/32 ! -d 192.168.0.10 -o eth0 -j MARK --set-xmark 1001
設(shè)置return是為了加快包檢查,return的順序是:子鏈——>父鏈——>缺省的策略,檢查到源地址是172.16.1.138并且目標(biāo)地址不是192.168.0.10的包就會(huì)跳到postrouting層,然后會(huì)繼續(xù)檢查其他這層的chain,這樣不用每個(gè)包都要檢查一次這條chain的內(nèi)容了,加快了一倍的速度,
iptables -t mangle -A POSTROUTING -o eth0 -s 172.16.1.138 ! -d 192.168.0.10 -j RETURN

下載:

tc qdisc del dev p3p1 root 2>/dev/null

tc qdisc add dev p3p1 root handle 1:0 htb default 123

tc class add dev p3p1 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0

tc class add dev p3p1 parent 1:1 classid 1:11 htb rate 10Mbit ceil 10Mbit prio 1

tc qdisc add dev p3p1 parent 1:11 handle 111:0 sfq perturb 10

tc filter add dev p3p1 parent 1:0 protocol ip prio 1 handle 1000 fw classid 1:11

這里用I的是insert一條配置,這樣排序會(huì)放在前面,因?yàn)閕ptables是按順序匹配的,并且為了跟wifidog的策略避免沖突
iptables -t mangle -I POSTROUTING -o p3p1 -d 172.16.1.138 ! -s 192.168.0.10 -j MARK --set-mark 1000
iptables -t mangle -I POSTROUTING -o p3p1 -d 172.16.1.138 ! -s 192.168.0.10 -j RETURN

EOF完


引用:

  1. http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html
  2. http://linux.vbird.org/linux_server/0250simple_firewall.php
  3. http://www.tldp.org/HOWTO/Traffic-Control-HOWTO/
  4. http://my.oschina.net/guol/blog/82453?p=1
  5. http://www.lartc.org/howto/
  6. http://chuansongme.com/n/403831
  7. http://blog.sina.com.cn/s/blog_4b9633a6010007l7.html
  8. http://blog.sina.com.cn/s/blog_60244a2e0100d4t8.html
  9. http://wenku.baidu.com/view/cd450e82e53a580216fcfe59.html

原文出處:http://www.godblessyuan.com/2015/01/18/iptables_tc_bandwidth_limiting/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容