Iptables通过注释删除特定规则

4
我需要删除一些具有相同注释的规则。
例如,我有一些带有注释“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

但在保存和恢复之间可能会发生iptables的更改,因此在恢复后可能会出现问题 = /


这是程序设计相关内容的翻译,请仅返回翻译后的文本:a) 如果注释只有一行,是否安全? b) 如果注释位于规则前面一行,是否安全? - hek2mgl
3个回答

5
您可以使用以下命令:
iptables-save | sed -r '/PREROUTING.*comment.*test it/s/-A/iptables -D/e'

iptables-save命令会返回一些iptables命令,这些命令可以在重启后执行,用于恢复防火墙的当前状态。

意思是它将包含以下行:

...
-A PREROUTING -p tcp -m tcp --dport 25 -j ACCEPT -m comment --comment "test it"
...
sed命令搜索包含PREROUTING.*comment.*test it(应该足够好)的行,并在术语iptables前面添加,同时将-A替换为-D,因为-D删除一条规则。然后使用e命令执行替换操作的结果。e命令是sed的GNU扩展。


注意:如果您想要打印命令并执行它,可以使用s/-A/iptables -D/pe


内部规则,类似于: tcp dpt:8555 /* 测试 */ to:127.0.0.1:8080 - Suvitruf - Andrei Apanasik
Shell脚本中不允许使用/* */样式的注释。你是用哪种语言定义的iptables.rules的含义? - hek2mgl
还有,我该如何使用您的grep来删除规则? - Suvitruf - Andrei Apanasik
-v 选项只输出不匹配模式的行。当然,您需要将输出重定向到临时文件,然后将其重命名为 iptables.rules(或其他名称)。如果您喜欢 sed,它可以是一个单一的命令:sed -i '/PREROUTING.*--comment.* test it/d' iptables.rules。但在使用 -i 前,请务必测试命令! - hek2mgl
就像我之前所说的,如果你使用 sed -i 命令,那么这只是一个单一的命令:sed -i '/PREROUTING.*--comment.* test it/d' iptables.rule - hek2mgl
显示剩余7条评论

3

通过注释的另一种删除方式:

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

2
从iptables中删除基于注释的规则的最佳方法是:
iptables-save | grep -v COMMENT | iptables-restore

它会清除所有与匹配注释相符的规则。对我而言,我使用此方法添加需要完全删除的规则集。

如果您仅需要操作PREROUTING链,请在创建规则时添加一些前缀或后缀到您的注释中,例如preroute_COMMENT,以便在识别COMMENT规则时进行区分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接