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