根据 IP 地址动态删除 iptables 策略

根据 IP 地址动态删除 iptables 策略

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

我知道源 IP 和目标 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 世界中闲逛,所以我不确定在这里处理这个问题的最佳方法是什么。

答案1

-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 地址,并且不会因竞争条件而丢失任何规则,让我们尝试以下操作。这将删除 nat 表中包含给定 IP 地址的任何规则:

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-Dsedxargs

答案2

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,或您想要的任何数字。

相关内容