头图

在 CentOS 7 上使用 iptables -A 添加规则后,规则没有在重启虚拟机后保存,这个问题经常困扰许多用户。

iptables-save 是一个用于保存当前 iptables 规则的命令,执行后,它会将这些规则输出到标准输出。一般来说,我们可以将输出重定向到一个文件,如 /etc/sysconfig/iptables,这个文件通常用于存储 iptables 规则。
iptables 调用链

让我们来看一下典型的步骤:

  1. 添加规则
    当你使用 iptables -A 添加规则时,该规则会立即生效。例如,你可能输入以下命令:
   iptables -A INPUT -p tcp --dport 80 -j ACCEPT
   

这条命令允许所有 TCP 端口 80 的流量(通常用于 HTTP)。执行后,你可以用 iptables -L 查看规则已成功添加到 INPUT 链中。

  1. 保存规则
    规则已经生效,但为了在系统重启后保留,你需要保存它们。iptables-save 可以输出规则的状态,通常保存的规则格式是机器可读的。例如:
   iptables-save > /etc/sysconfig/iptables
   

这一步将当前的 iptables 规则保存到 /etc/sysconfig/iptables 文件中。

  1. 为什么重启后规则消失?

    虽然你执行了 iptables-save,并将输出保存到文件中,但这个文件并不会自动在系统启动时被加载。重启时,系统并不会自动应用保存的规则。因此,重启后规则消失的现象可能是因为系统没有在启动时从 /etc/sysconfig/iptables 文件中加载规则。

    真实场景中的案例:某企业在部署一套 Web 服务器时,发现即使在防火墙上设置了正确的 iptables 规则,服务器每次重启后,所有的规则都会丢失。尽管管理员使用了 iptables-save,但并没有设置让系统在启动时加载这些规则,导致重启后规则无法恢复,服务器对外暴露了非预期端口,存在安全隐患。

  2. 解决方案:确保规则在重启后生效
    要确保 iptables 规则在系统重启后仍然有效,你需要做两件事情:

    • 使用 iptables-save 保存规则
      正如前面提到的,使用 iptables-save 将当前的规则保存到文件中。例如:
     iptables-save > /etc/sysconfig/iptables
     
 这一步保证了规则被正确保存到文件中。
  • 使用 iptables-restore 自动恢复规则
    系统启动时,需要确保这些规则被自动恢复。你可以通过启用 iptables 服务来自动加载规则。在 CentOS 7 中,你需要执行以下命令:

     systemctl enable iptables
    
 这个命令会确保系统启动时,`iptables` 服务会自动从 `/etc/sysconfig/iptables` 文件中加载规则。确认服务已经启动后,可以使用以下命令手动加载保存的规则:
     iptables-restore < /etc/sysconfig/iptables
 这一步可以立即应用保存的规则,而无需等待重启。

  1. 更多示例
    假设你添加了一条规则,拒绝所有的 ICMP 包(通常用于 ping 命令),规则如下:

    iptables -A INPUT -p icmp -j REJECT
    

    你确认这条规则已经生效了,并且希望在重启后仍然存在。此时,可以使用 iptables-save 命令将规则保存到 /etc/sysconfig/iptables 文件中。

    重启系统后,系统不会自动应用这个规则,如果没有执行 systemctl enable iptables,规则仍然会丢失。因此,关键的步骤是确保 iptables 服务在启动时自动加载保存的规则。

    现实中的案例研究:一家云服务提供商在其服务器上应用了复杂的防火墙规则,以防止未经授权的访问。然而,由于运维团队未能正确启用 iptables 服务,每次服务器重启后,这些规则都会消失。该问题导致多次系统漏洞曝光,迫使公司重新审查其系统配置。通过启用 iptables 服务并定期检查规则保存情况,团队确保了系统防火墙规则的持久性。

  2. 总结解决方案步骤

    • 使用 iptables -A 添加规则,并确认规则已经生效。
    • 使用 iptables-save > /etc/sysconfig/iptables 保存规则到文件中。
    • 确保 iptables 服务在系统启动时被启用:
     systemctl enable iptables
     
  • 可选地,手动恢复规则,使用以下命令:
     iptables-restore < /etc/sysconfig/iptables
     
  1. 其他注意事项
    虽然在 CentOS 7 中 iptables 仍然广泛使用,但对于较新的发行版,可能会使用 firewalld 作为替代。如果你发现系统已经启用了 firewalld,它可能会覆盖你的 iptables 配置。你可以通过以下命令检查 firewalld 是否运行:
   systemctl status firewalld
   

如果你只想使用 iptables,你可以禁用 firewalld

   systemctl stop firewalld
   systemctl disable firewalld
  

现实中的经验:有些团队为了简化防火墙管理,转而使用了 firewalld,因为它提供了更高级别的抽象。尽管如此,许多传统用户仍然偏好 iptables,特别是在处理大规模数据中心和特定的网络安全规则时。无论选择哪种工具,都需要确保相关服务在系统启动时正确加载配置,以避免规则丢失问题。

这种情况下,重点不仅在于保存规则,更在于系统的启动过程能正确加载这些规则。通过使用 iptables-save 保存并启用 iptables 服务,可以确保每次重启后规则仍然有效。


注销
1k 声望1.6k 粉丝

invalid