小心iptables規則順序的坑

需求:

一臺服務器上原來已經配置防火牆信息,只允許22和7000端口能夠訪問,其他端口禁用掉,現在需要放開node-exporter的9100端口供prometheus採集服務器主機信息。

現狀:

原來的規則添加在開機啟動配置文件/etc/rc.local裡,規則如下

# iptables

/sbin/iptables -A INPUT -i eth1 -p tcp --syn --dport 22 -j ACCEPT

/sbin/iptables -A INPUT -i eth1 -p tcp --syn --dport 7000 -j ACCEPT

/sbin/iptables -A INPUT -i eth1 -p tcp --syn -j DROP

操作:

如果想放開9100端口,所以執行了如下命令:

/sbin/iptables -A INPUT -i eth1 -p tcp --dport 9100 -j ACCEPT

現象:

執行完該命令後,9100端口依然不能訪問,也就是該條策略沒有生效

原因:

其實iptables執行規則時,是從從規則表中從上至下順序執行的,如果沒遇到匹配的規則,就一條一條往下執行,如果遇到匹配的規則後,那麼就執行本規則。比如按照上面的規則,一個訪問9100的數據包過來後,第一條規則不匹配,接著第二條規則也不匹配,第三條規則匹配,直接把數據包drop掉,所以請求包就過不來了。

方案:重新flush iptables規則後把規則改為如下順序重新執行就ok了:

/sbin/iptables -A INPUT -i eth1 -p tcp --syn --dport 22 -j ACCEPT

/sbin/iptables -A INPUT -i eth1 -p tcp --syn --dport 7000 -j ACCEPT

/sbin/iptables -A INPUT -i eth1 -p tcp --dport 9100 -j ACCEPT

/sbin/iptables -A INPUT -i eth1 -p tcp --syn -j DROP

注意:此處用的是-A選擇,也就是--append追加到規則鏈表的最後一行,如果使用-I,也就是插入規則鏈表的第一行,規則正好和上面相反。


分享到:


相關文章: