通过IP地址dynamic删除iptables策略

我想根据源或目标IP地址自动删除一些NAT POSTROUTING规则。

我知道源和目标IP,但我不一定知道哪些策略已经存在。

例如,我可能会有这样的:

-A POSTROUTING -s 10.10.10.10/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 1.2.3.4 -A POSTROUTING -s 10.10.10.10/32 -p tcp -m tcp --dport 443 -j SNAT --to-source 1.2.3.4 -A POSTROUTING -s 10.10.10.10/32 -j ACCEPT 

或者我可能只是有这个:

 -A POSTROUTING -s 10.10.10.10/32 -j SNAT --to-source 1.2.3.4 

我想取消旧计算机的NAT地址,并将其分配给新的计算机。 这全是自动的,所以我不能手动查找它。

删除旧IP策略的最佳方法是什么? 我可以使用list + grep命令吗? 我通常在Windows世界中闲逛,所以我不确定在这里处理这个问题的最好方法。

您可以通过精确指定并使用-D (– --delete )而不是-A来匹配要删除的规则。 例如:

 iptables -t nat -D POSTROUTING -s 10.10.10.10/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 1.2.3.4 

为了编写脚本,匹配一个特定的IP地址,而不是由于竞争条件而丢失任何规则,让我们尝试这样的事情。 这将删除包含给定IP地址的nat表中的任何规则:

 IFS=$'\n' for rule in `iptables-save -t nat | grep -w $IP_ADDRESS | sed -e 's/-A/-D/'`; do echo $rule | xargs iptables -t nat done 

关于这个的一些注意事项:我们使用grep -w来确保IP地址完全匹配,例如,以25结尾的给定地址不匹配250 。 从-A-D的转换由sed在循环中完成。 我们使用xargs将每个规则展开成参数。

iptables -t nat -L POSTROUTING -n --line-numbers | grep -w 1.2.3.4 | awk '{print $1}'

这将grep你想要的IP,并抓住防火墙规则的行号。 然后使用iptables -t nat -D POSTROUTING 1来删除规则1,或者任何你想要的数字。