Ubuntu系統開啟 ufw 防火牆之後,iptables -A 和 -I的差異

今天在用 iptables 設定每個IP限制幾個連線時,來回好幾次怎麼設定都不能正常運作,正在納悶到底是怎麼一回事時,我把 -A 的參數改成 -I 之後竟然正常了。所以打算追根究柢看看到底哪裡出了什麼問題了。我們先說說這個命令好了,

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT

一個簡單的 iptables 命令,限制每個 IP 只能 10 個 HTTP 連線,超過就丟棄封包不理它。無奈怎麼都不會正常運作,索性改成

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT

嘿,竟然正常了。根據 iptables 語法,-A代表是Append附加在既有規則上,-I則是代表Insert添加在最前面,所以我就把整個 iptables 規則 dump 出來看看

# iptables-save > ~/rules

一看規則,明白了,雖然兩行的命令是一樣的,但順序不一樣。一個在 ufw 前面,一個在 ufw 後面。

-A INPUT -p tcp -m tcp --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-sa
(上面的規則是 -I添加進來的)
...
...
...
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A INPUT -p tcp -m tcp --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-sa
(上面的規則是 -A附加進來的)
...
...

我們知道 iptables 運作規定是由上往下執行,很顯然的,如果採用 -I,因為是添加在最前面,所以運作規則會在 ufw 之前。反之如果採用 -A,那麼附加的規則會在 ufw 之後。但是 ufw 之前已經設定

# ufw allow 80

所以按照 iptables 執行順序,只要是 80 port 的都會被 ufw 允許,所以 -A 添加的規則根本不會執行到,那當然運作就不正常了。而 -I 的命令則在 ufw 之前,所以才能先過濾掉,然後才交給 ufw 判斷,唉,浪費了不少時間。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *