iptables實(shí)戰(zhàn):用hashlimit來(lái)限速
iptables是用來(lái)設(shè)置、維護(hù)和檢查L(zhǎng)inux內(nèi)核的IP包過(guò)濾規(guī)則的,iptables可以定義不同的表,每個(gè)表都包含幾個(gè)內(nèi)部的鏈,也能包含用戶定義的鏈。hashlimit是iptables的一個(gè)匹配模塊,用它結(jié)合iptables的其它命令可以實(shí)現(xiàn)限速的功能(注意,單獨(dú)hashlimit模塊是無(wú)法限速的)。
不過(guò)首先必須明確,hashlimit本身只是一個(gè)“匹配”模塊。我們知道,iptables的基本原理是“匹配--處理”,hashlimit在這個(gè)工作過(guò)程中只能起到匹配的作用,它本身是無(wú)法對(duì)網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行任何處理的。我看到網(wǎng)上有些hashlimit的例子里面說(shuō)只 用一條包含hashlimit匹配規(guī)則的iptables語(yǔ)句就可以實(shí)現(xiàn)限速,那是錯(cuò)誤的。
實(shí)際上,利用hashlimit來(lái)限速需要包括兩個(gè)步驟:
1.對(duì)符合hashlimit匹配規(guī)則包放行
2.丟棄/拒絕未放行的包
下面是一個(gè)簡(jiǎn)單的例子:
- iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit-name ssh
- --hashlimit 5/sec
- --hashlimit-burst 10
- --hashlimit-mode srcip
- --hashlimit-htable-expire 90000 -j ACCEPT
- iptables -A INPUT -p tcp --dport 22 -j DROP
然后,我們來(lái)著重講講hashlimit模塊具體是如何工作的。
hashlimit的匹配是基于令牌桶 (Token bucket)模型的。令牌桶是一種網(wǎng)絡(luò)通訊中常見(jiàn)的緩沖區(qū)工作原理,它有兩個(gè)重要的參數(shù),令牌桶容量n和令牌產(chǎn)生速率s。我們可以把令牌當(dāng)成是門(mén)票,而令牌桶則是負(fù)責(zé)制作和發(fā)放門(mén)票的管理員,它手里最多有n張令牌。
一開(kāi)始,管理員開(kāi)始手里有n張令牌。每當(dāng)一個(gè)數(shù)據(jù)包到達(dá)后,管理員就看看手里是否還有可用的令牌。如果有,就把令牌發(fā)給這個(gè)數(shù)據(jù)包,hashlimit就告訴iptables,這個(gè)數(shù)據(jù)包被匹配了。而當(dāng)管理員把手上所有的令牌都發(fā)完了,再來(lái)的數(shù)據(jù)包就拿不到令牌了。這時(shí),hashlimit模塊就告訴iptables,這個(gè)數(shù)據(jù)包不能被匹配。除了發(fā)放令牌之外,只要令牌桶中的令牌數(shù)量少于n,它就會(huì)以速率s來(lái)產(chǎn)生新的令牌,直到令牌數(shù)量到達(dá)n為止。通過(guò)令牌桶機(jī)制,即可以有效的控制單位時(shí)間內(nèi)通過(guò)(匹配)的數(shù)據(jù)包數(shù)量,又可以容許短時(shí)間內(nèi)突發(fā)的大量數(shù)據(jù)包的通過(guò)(只要數(shù)據(jù)包數(shù)量不超過(guò)令牌桶n)。
hashlimit模塊提供了兩個(gè)參數(shù)--hashlimit和--hashlimit-burst,分別對(duì)應(yīng)于令牌產(chǎn)生速率和令牌桶容量。除了令牌桶模型外,hashlimit匹配的另外一個(gè)重要概念是匹配項(xiàng)。在hashlimit中,每個(gè)匹配項(xiàng)擁有一個(gè)單獨(dú)的令牌桶,執(zhí)行獨(dú)立的匹配計(jì)算。通過(guò)hashlimit的--hashlimit-mode參數(shù),你可以指定四種匹配項(xiàng)及其組合,即:srcip(每個(gè)源地址IP為一個(gè)匹配項(xiàng)),dstip(每個(gè)目的地址IP為一個(gè)匹配項(xiàng)),srcport(每個(gè)源端口為一個(gè)匹配項(xiàng)),dstport(每個(gè)目的端口為一個(gè)匹配項(xiàng))
除了前面介紹的三個(gè)參數(shù)外,hashlimit還有一個(gè)必須要用的參數(shù),即--hashlimit-name。 hashlimit會(huì)在/proc/net/ipt_hashlimit目錄中,為每個(gè)調(diào)用了hashlimit模塊的iptables 命令建立一個(gè)文件,其中保存著各匹配項(xiàng)的信息。--hashlimit-name參數(shù)即用來(lái)指定該文件的文件名。
好了,以上我們已經(jīng)介紹了hashlimit的工作原理和相應(yīng)的參數(shù),下面我們來(lái)看幾個(gè)例子。
首先是前面的那個(gè)例子:
- iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit-name ssh --hashlimit 5/sec --hashlimit-burst 10 --hashlimit-mode srcip -j ACCEPT
- iptables -A INPUT -p tcp --dport 22 -j DROP
在了解了hashlimit各參數(shù)的含義之后,我們現(xiàn)在就可以知道這兩條iptables命令的作用。
第一條的作用是,為所有訪問(wèn)本機(jī)22端口的不同IP建立一個(gè)匹配項(xiàng),匹配項(xiàng)對(duì)應(yīng)的令牌桶容量為10,令牌產(chǎn)生速率為5個(gè)每秒。放行通過(guò)匹配的數(shù)據(jù)包。
第二條的作用是,丟棄所有其它訪問(wèn)本機(jī)22端口的數(shù)據(jù)包。
通過(guò)這兩條命令,我們就實(shí)現(xiàn)了限制其它機(jī)器對(duì)本機(jī)22端口(ssh服務(wù))頻繁訪問(wèn)的功能.
再來(lái)我們看一個(gè)復(fù)雜點(diǎn)的限速。假設(shè)我們現(xiàn)在在一臺(tái)NAT網(wǎng)關(guān)上,想限制內(nèi)部網(wǎng)某個(gè)網(wǎng)段 192.168.1.2/24對(duì)外的訪問(wèn)頻率。(這個(gè)的主要作用是限制內(nèi)部中毒主機(jī)對(duì)外的flood攻擊)
那我們可以這么做:
- iptables -N DEFLOOD
- iptables -A FORWARD -s 192.168.1.2/24 -m state --state NEW -j DEFLOOD
- iptables -A DEFLOOD -m hashlimit --hashlimit-name deflood --hashlimit 10/sec --hashlimit-burst 10 --hashlimit-mode srcip -j ACCEPT
- iptables -P DEFLOOD -j DROP
第一條命令建立了一個(gè)自定義的處理鏈
第二條命令,所有來(lái)自192.168.1.2/24網(wǎng)段,并且打算新建網(wǎng)絡(luò)連接的數(shù)據(jù)包,都進(jìn)入DEFLOOD鏈處理
第三條命令,在DEFLOOD鏈中,為每個(gè)IP建立一個(gè)匹配項(xiàng),對(duì)應(yīng)令牌桶容量為10,產(chǎn)生速率為10個(gè)每秒。放行通過(guò)匹配的數(shù)據(jù)包。
第四條命令,在DEFLOOD鏈中丟棄所有其它的數(shù)據(jù)包
當(dāng)然,hashlimit還有一些其他的參數(shù),比如
- --hashlimit-htable-expire
- --hashlimit-htable-size
- --hashlimit-htable-max
具體可以man iptables。
iptables實(shí)戰(zhàn)中關(guān)于用hashlimit來(lái)限速的內(nèi)容介紹完了,希望通過(guò)本文iptables實(shí)戰(zhàn)內(nèi)容的學(xué)習(xí)能對(duì)你有所幫助。