我们在 RHEL 6.3 系统上遇到了 iptables 问题,重启后,当服务启动时,规则不会加载。我们得到空的规则集:
[msnyder@matt-test ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
尽管我们已经定义了规则,并且服务确实正在运行,但情况仍然如此。我知道这一点,因为当我运行它时service iptables start
,它只是返回到提示符。如果我运行service iptables restart
它,它实际上会停止,然后重新启动服务。当然,如果我运行service iptables stop
它,它表明 iptables 实际上正在停止。
我知道我需要重启服务,所以我重启了,规则也加载正常。重启后它们根本就加载不了。除非在重启过程中它们的加载方式不同,否则我看不出我们的规则怎么会出错。如果出错了,它们甚至在服务重启时都不会加载。
还有其他人遇到过这种情况吗?
编辑:规则已保存在 /etc/sysconfig/iptables 中。它们不是从命令行动态添加的,因此service iptables save
没有必要。
答案1
首先,应该在启动时使用 chkconfig 启用 iptables,但我猜这已经是事实了,因为你得到了一个空表。
iptables 在启动时无法加载的原因可能是您的配置中有使用主机名的规则,如果是这样,请用 IP 替换它们并重试。如果您在 iptables 配置中确实需要主机名,请确保首先从您的主机启用(并提交)DNS 查询,但我不确定这在任何情况下是否有效。
答案2
我相信您需要执行“service iptables save”,如上所述,以便在重启后规则生效。但我还会检查 /etc/sysconfig/iptables-config 中的以下参数,以确保它保存了正在运行的配置,这样您就不会丢失运行时插入的任何内容。
IPTABLES_SAVE_ON_STOP="no"
IPTABLES_SAVE_ON_RESTART="no"
答案3
我们发现问题并不出在 iptables 本身。我们在这些服务器上运行了 TrendMicro 的 Deep Security 代理,它破坏了 iptables。他们已经承认了这个问题,我们的解决方法是将 dsagent 和 iptables 启动脚本设置为相同的启动序列号 (S08),而不是让 dsagent 脚本在 iptables 之后启动(这是默认的)。