![使用 iptables-restore 恢复规则忽略错误](https://linux22.com/image/119164/%E4%BD%BF%E7%94%A8%20iptables-restore%20%E6%81%A2%E5%A4%8D%E8%A7%84%E5%88%99%E5%BF%BD%E7%95%A5%E9%94%99%E8%AF%AF.png)
我想知道是否可以忽略恢复过程中的错误。
我的规则中有很多行,例如:
-A mychain -s somehost.com -j DROP
我的规则来自动态列表,如果 somehost.com 暂时离线、不可路由或类似的情况,iptables-restore 可能会拒绝恢复规则并抛出如下错误:
iptables-restore v1.6.0: host/network 'somehost.com' not found
Error occurred at line: 342
Try 'iptables-restore -h' or 'iptables-restore --help' for more information.
好吧,我希望如果无法访问主机,iptables
则可以忽略该行。somehost.com
可以添加一些标志来完成此操作iptables-restore
吗?
答案1
可以在 iptables 规则中使用 DNS 名称,但是这不是最佳实践出于更多原因。主要原因是 iptables 在规则加载期间执行一次解析。将来 DNS 名称可能会更改,而您的主机将不知道。
正如你所知,iptables 只需要DNS 名称解析成功。因此,如果 DNS 名称不存在,规则加载将以错误结束。
您可以创建脚本并检查其中的名称解析:
#!/bin/bash
host_check=$( dig -t A somehost.com +short 2>/dev/null | wc -l )
if (( $host_check > 0 ))
then sed -i '/.*somehost\.com/s/^#//' file
else sed -i 's/.*somehost\.com/#&/' file
fi
该脚本检查名称解析。如果名称已解析(输出将是一行或多行),则脚本删除每一行中具有特定 DNS 名称的注释。如果不是 - scipt 将注释添加到包含 DNS 名称的每一行。
file
- 这是来自iptables-save > file
命令的iptables 脚本
检查之后,您可以使用以下命令加载规则iptables-restore < file
我强烈建议不要使用这种方法。您需要找到一种方法来拒绝 iptables 规则中的 DNS 名称。