什么是规范的方式来存储iptables规则

标准的Linux防火墙iptables不会在重启之间保存规则。 你必须自己照顾这个。 有很多方法可以做到这一点。 什么是规范的方式来做到这一点? 什么是最佳实践?

我会用我自己的解决scheme回答,但我对其他/更好的解决scheme感兴趣。

以下是一些示例规则。 将它们保存到/etc/iptables.rules

# Generated by iptables-save v1.3.6 on Wed Oct 24 17:07:29 2007 *filter :INPUT ACCEPT [89458:132056082] :FORWARD DROP [0:0] :OUTPUT ACCEPT [263904:15667452] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 -A INPUT -j DROP COMMIT # Completed on Wed Oct 24 17:07:29 2007 

在/ etc / network / interfaces的最后加上这一行

 pre-up iptables-restore < /etc/iptables.rules 

我们使用了很多的iptables规则 ,所以为了简化pipe理,我们做了以下工作:

  • 规则都是从脚本调用的 – 从/etc/init.d/firewall调用脚本(自定义脚本)
  • 一个服务器名称/networking名称(IP地址variables)的文件被保留,并包含在每个iptables脚本中以保持一致性。
  • 为每个子网(即私人/ DMZ / VPN等)保留单独的脚本,以便更容易find。 属于两个脚本的规则(例如那些限制private / DMZ通信的规则)被放在更安全的networking脚本中
  • 尽可能使用循环和嵌套循环来尽可能缩短脚本。
  • 每个新规则或更改都logging在脚本的相应部分之前。

我不知道这是否是这样做的最好方法,但对我们来说运作良好。

虽然这是事实,这是依赖于环境和平台,我已经看到了两个很好的方法,取决于平台:

  • RHEL / CentOS:将所有规则存储在由iptables启动脚本读入的单个/ etc / sysconfig / iptables文件中。

  • Debian / Ubuntu:将所有规则存储在/etc/iptables.d/目录中独立的服务特定文件中。 例如,/etc/iptables.d/port_http,/etc/iptables.d/port_dns,其中port_service映射到/ etc / services中的服务名称。

在任何一种情况下,文件或文件都由像Chef或Puppet这样的configuration工具进行pipe理,并通过“主”启动脚本读入在启动时运行的iptables。

除了iptables-save (和iptables-restore ),复杂的防火墙scheme可以更好地处理专用程序。 例如,我们使用了shorewall (“iptables made easy”)来configurationiptables。

还有更简单的工具,比如firestarter和kmyfirewall 。

这取决于您使用的分配。 有些发行版,尤其是基于Red Hat发行版的发行版,会自动保留iptables规则,但在自己的专用目录中。 我对RHEL最熟悉,iptables规则可以在/ etc / sysconfig / iptables中find。 熟悉iptables规则的语法起初可能比较棘手,但是一旦掌握了它就很容易了。

netfilter网站有很多关于iptables的文档,包括一些介绍。 如果你想阅读一下,你可以在这里find很多很好的信息: http : //www.netfilter.org/documentation/

这个问题非常接近于4934的重复 ,与397有关。

我使用firehol结合我开发的Web界面来pipe理configuration文件。

我真的很喜欢firehol,它提供了一个简单的语法,然后直接使用iptables。

  • 您可以使用firehol debug命令精确地生成iptables命令
  • 如果您的configuration中有错误,并启动防火墙,firehol会检测到错误并恢复到之前的状态。
  • Firehol有一个“try”命令,你可以用它来远程启动防火墙,如果你的修改终止了你的连接,firehol将恢复到以前的状态,如果你没有连接,那么它会要求你确认修改。
  • Firehol拥有大量预先定义的服务,因此您不必确切地记得您需要在哪些端口上打开某些难以理解的协议。

当然,我们使用一个自定义的init脚本。 我可以使用for-loops迭代一个端口列表,parsing其他configuration文件,如vpn-users等。非常好!

而iptables-restore无疑是最“保守”的挽救方式。

我想补充的是:

请注意,当前版本的iptables会针对每一个调用请求内核将其链接完整列表。 那么它会使你要求做的一个改变。 然后它会再次上传列表。

这很慢(O(n ^ 2)),对我们来说需要5秒,这太长了;-)

如果你使用iptables-restore,这一切都可以通过一个快速的操作来完成。