hashlimit是iptables的一個匹配模塊,用它結合iptables的其它命令可以實現限速的功能(注意,單獨hashlimit模塊是無法限速的)。
不過首先必須明確,hashlimit本身只是一個“匹配”模塊。我們知道,iptables的基本原理是“匹配–處理”,hashlimit在這個工作過程中只能起到匹配的作用,它本身是無法對網絡數據包進行任何處理的。
我看到網上有些hashlimit的例子裡面說只 用一條包含hashlimit匹配規則的iptables語句就可以實現限速,那是錯誤的。
實際上,利用hashlimit來限速需要包括兩個步驟:
下面是一個簡單的例子:
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
然後,我們來著重講講hashlimit模塊具體是如何工作的。
hashlimit的匹配是基於令牌桶 (Token bucket)模型的。令牌桶是一種網絡通訊中常見的緩沖區工作原理,它有兩個重要的參數,令牌桶容量n和令牌產生速率s。
我們可以把令牌當成是門票,而令牌桶則是負責制作和發放門票的管理員,它手裡最多有n張令牌。一開始,管理員開始手裡有n張令牌。
每當一個數據包到達後,管理員就看看手裡是否還有可用的令牌。
如果有,就把令牌發給這個數據包,hashlimit就告訴iptables,這個數據包被匹配了。
而當管理員把手上所有的令牌都發完了,再來的數據包就拿不到令牌了。
這時,hashlimit模塊就告訴iptables,這個數據包不能被匹配。
除了發放令牌之外,只要令牌桶中的令牌數量少於n,它就會以速率s來產生新的令牌,直到令牌數量到達n為止。
通過令牌桶機制,即可以有效的控制單位時間內通過(匹配)的數據包數量,又可以容許短時間內突發的大量數據包的通過(只要數據包數量不超過令牌桶n)。
hashlimit模塊提供了兩個參數–hashlimit和–hashlimit-burst,分別對應於令牌產生速率和令牌桶容量。除了令牌桶模型外,hashlimit匹配的另外一個重要概念是匹配項。
在hashlimit中,每個匹配項擁有一個單獨的令牌桶,執行獨立的匹配計算。
通過hashlimit的–hashlimit-mode參數,你可以指定四種匹配項及其組合,即:
除了前面介紹的三個參數外,hashlimit還有一個必須要用的參數,即–hashlimit-name。 hashlimit會在/proc/net/ipt_hashlimit目錄中,為每個調用了hashlimit模塊的iptables 命令建立一個文件,其中保存著各匹配項的信息。–hashlimit-name參數即用來指定該文件的文件名。
好了,以上我們已經介紹了hashlimit的工作原理和相應的參數,下面我們來看幾個例子。
首先是前面的那個例子:
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各參數的含義之後,我們現在就可以知道這兩條iptables命令的作用。
第一條的作用是,為所有訪問本機22端口的不同IP建立一個匹配項,匹配項對應的令牌桶容量為10,令牌產生速率為5個每秒。放行通過匹配的數據包。
第二條的作用是,丟棄所有其它訪問本機22端口的數據包。
通過這兩條命令,我們就實現了限制其它機器對本機22端口(ssh服務)頻繁訪問的功能.
再來我們看一個復雜點的限速。假設我們現在在一台NAT網關上,想限制內部網某個網段 192.168.1.2/24對外的訪問頻率。(這個的主要作用是限制內部中毒主機對外的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
第一條命令建立了一個自定義的處理鏈
第二條命令,所有來自192.168.1.2/24網段,並且打算新建網絡連接的數據包,都進入DEFLOOD鏈處理
第三條命令,在DEFLOOD鏈中,為每個IP建立一個匹配項,對應令牌桶容量為10,產生速率為10個每秒。放行通過匹配的數據包。
第四條命令,在DEFLOOD鏈中丟棄所有其它的數據包
當然,hashlimit還有一些其他的參數,比如
–hashlimit-htable-expire
–hashlimit-htable-size
–hashlimit-htable-max
具體可以man iptables
以上我們介紹了hashlimit模塊的原理和使用。