需求:
一台服务器上原来已经配置防火墙信息,只允许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,也就是插入规则链表的第一行,规则正好和上面相反。
閱讀更多 天天曆史故事 的文章