小心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,也就是插入规则链表的第一行,规则正好和上面相反。


分享到:


相關文章: