iptables 是 Linux 的标准防火墙,它在重启之间不会保存规则。您必须自己处理这个问题。有很多方法可以做到这一点。什么是规范的方法?最佳实践是什么?
我会用我自己的解决方案来回答,但我对其他/更好的解决方案感兴趣。
答案1
以下是一些示例规则。将它们保存到 /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
答案2
我们使用了很多iptables 规则,因此为了简化管理,我们采取以下措施:
- 所有规则均从脚本调用 - 脚本从 /etc/init.d/firewall 调用(自定义脚本)
- 保留一个服务器名称/网络名称(ip 地址变量)的文件,并将其包含在每个 iptables 脚本中以保持一致性。
- 每个子网(即私有/DMZ/VPN 等)都保留单独的脚本,以便于查找。属于 2 个脚本的规则(例如限制私有和 DMZ 之间通信的规则)放在更“安全”的网络脚本中
- 只要有可能,就会使用循环和嵌套循环来使脚本尽可能简短。
- 每条新规则或变化都会在脚本相应部分前面附上注释。
我不知道这是否是最好的这种方法,但对我们来说效果很好。
答案3
虽然这确实取决于环境和平台,但我已经看到了两种很好的方法,具体取决于平台:
RHEL / CentOS:将所有规则存储在单个 /etc/sysconfig/iptables 文件中,该文件由 iptables 启动脚本读取。
Debian/Ubuntu:将所有规则存储在 /etc/iptables.d/ 目录中单独的服务特定文件中。例如,/etc/iptables.d/port_http、/etc/iptables.d/port_dns,其中 port_service 映射到 /etc/services 中的服务名称。
无论哪种情况,文件都由 Chef 或 Puppet 等配置工具进行管理,并由启动时运行的 iptables“主”启动脚本读取。
答案4
这取决于您使用的发行版。某些发行版,尤其是基于 Red Hat 发行版的发行版,会自动保留 iptables 规则,但保留在自己的特殊目录中。我最熟悉的是 RHEL,iptables 规则可以在 /etc/sysconfig/iptables 中找到。熟悉 iptables 规则语法一开始可能比较棘手,但一旦掌握了它,就很容易了。
netfilter 网站上有很多关于 iptables 的文档,包括一些介绍。如果你愿意阅读,你可以在这里找到很多有用的信息:http://www.netfilter.org/documentation/