iptables 通过注释删除特定规则

Iptables remove specific rules by comment

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

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

sudo iptables -t nat -L | grep 'test it'

但是我怎样才能删除所有带有注释 'test it' 的 PREROUTING 规则?

更新: 正如@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

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

您可以使用以下命令:

iptables-save | sed -r '/PREROUTING.*comment.*test it/s/-A/iptables -D/e'

iptables-save 将 return iptables 命令执行到 return 重启后防火墙的当前状态。

意味着它将包含如下行:

...
-A PREROUTING -p tcp -m tcp --dport 25 -j ACCEPT -m comment --comment "test it"
...

sed 命令搜索包含 PREROUTING.*comment.*test it 的行(应该足够好)并在前面添加术语 iptablesplus 将 -A 替换为 -D 因为-D 删除一条规则。然后使用 e 命令执行替换操作的结果。 e 命令是 sed.

的 GNU 扩展

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

另一种通过评论删除的方法:

NOWRULES=$(iptables --line-number -nL INPUT | grep comment_here | awk '{print }' | tac)
for rul in $NOWRULES; do     /sbin/iptables -D INPUT $rul; sleep 0.1; done

从 iptables 中删除基于评论的规则的最佳方法是:

iptables-save | grep -v COMMENT | iptables-restore

它会清除所有具有匹配评论的规则。至于我,我用这个方法来添加规则集,以后需要完全删除。

如果您只需要触及 PREROUTING 链,请在您的评论中添加一些前缀或后缀,例如 preroute_COMMENT 在创建规则时在 COMMENT 标识的规则集内产生差异