我需要删除一些带有相同注释的规则。
例如我有注释的规则="测试它",所以我可以得到这样的列表:
sudo iptables -t nat -L | grep '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
但是在保存和恢复之间可能会有iptables的变化,所以在恢复之后会出现问题= /
答案 0 :(得分:3)
您可以使用以下命令:
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
,因为{{ 1}}删除规则。然后使用-D
命令执行替换操作的结果。 e
命令是e
的GNU扩展。
注意:如果您想要打印命令,只需执行它,您就可以使用sed
。
答案 1 :(得分:1)
通过评论删除的另一种方式:
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 :(得分:0)
从 iptables 中删除基于评论的规则的最佳方法是:
iptables-save | grep -v COMMENT | iptables-restore
它用匹配的注释清除所有规则。至于我,我就是用这个方法来添加以后需要完全删除的规则集。
如果您只需要触及 PREROUTING 链,请在创建规则时为您的评论添加一些前缀或后缀,例如 preroute_COMMENT
以在 COMMENT 识别的规则集内产生差异