我如何使用 iptables-restore 来维护一些动态链?

我如何使用 iptables-restore 来维护一些动态链?

使用iptables-save和时iptables-restore,无论如何,所有链都会被保存和恢复。我想知道是否有可能恢复某些特定链的例外情况。例如,当使用 Docker 和 Fail2ban 时,您将拥有由应用程序管理的链,其中包含您不想擦除和覆盖的动态条目。

但是,我发现--noflushiptables-restore命令的选项仍然会刷新用户定义的链。

假设它看起来iptables-save > /path/to/rules-v4像这样:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
# -A DOCKER <- commented, dynamic chain
[...]

我将使用 恢复此操作iptables-restore -n < /path/to/rules-v4,包括 在内的所有链DOCKER仍会被刷新。令人困惑,但解决了该部分:

现在,如果我注释掉该:DOCKER - [0:0]行,DOCKER链将保持完整。但是,现在当 Docker 服务尚未创建链时,命令会在重启时失败DOCKER,因为链中存在对它的引用PREROUTING

iptables-restore那么……嗯。你们是如何解决这个先有鸡还是先有蛋的问题的?是否有可能在不触碰条目的情况下确保链的存在?

(请不要建议在 netfilter-persistent 服务之前启动 Docker,这太丑陋了。)

答案1

那么,如何包装命令并从结果文件中删除您不想要的规则,生成一个仅包含您想要的链的iptables-save新结果文件并立即使用呢?iptables-restore

相关内容