我想根据源或目标 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
-D
sed
xargs
答案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,或您想要的任何数字。