iptables 通过注释删除特定规则

Suv*_*ica 4 linux firewall iptables coreos

我需要删除一些具有相同评论的规则。

例如,我有带有 comment = "test it" 的规则,所以我可以像这样获得它们的列表:

sudo iptables -t nat -L | grep 'test it'
Run Code Online (Sandbox Code Playgroud)

但是如何删除所有带有注释“test it”的 PREROUTING 规则?

UPD: 正如@hek2mgl 所说,我可以这样做:

sudo bash -c "iptables-save > iptables.backup"
sed -i '/PREROUTING.*--comment.* "test it"/d' iptables.backup
sudo iptables-restore < iptables.backup
sudo rm iptables.backup
Run Code Online (Sandbox Code Playgroud)

但是save和restore之间可能是iptables的变化,所以restore之后会有问题=/

hek*_*mgl 5

您可以使用以下命令:

iptables-save | sed -r '/PREROUTING.*comment.*test it/s/-A/iptables -D/e'
Run Code Online (Sandbox Code Playgroud)

iptables-save 将返回 iptables 命令,可以执行这些命令以在重新启动或其他情况后返回防火墙的当前状态。

这意味着它将包含以下行:

...
-A PREROUTING -p tcp -m tcp --dport 25 -j ACCEPT -m comment --comment "test it"
...
Run Code Online (Sandbox Code Playgroud)

sed命令搜索包含PREROUTING.*comment.*test it(应该足够好)的行,并在术语之前iptables加上替换为-A-D因为-D删除了规则。然后使用该e命令执行替换操作 get 的结果。该e命令是 GNU 对sed.


注意:如果除了简单地执行命令之外还想打印命令,您可以使用s/-A/iptables -D/pe.