我需要在 Ubuntu 16 服务器上编写一些涉及 NAT 规则 (-t nat) 的 Iptables 规则更改脚本。使用 -D [此处的规则] 删除规则的常见方法似乎不适用于 -t 标识符...我真的不想通过必须识别我正在查找的链中的哪个规则来使脚本变得复杂并获取其关联的行号...有什么想法吗?
如果有帮助的话,以下规则的目的是在本地 MySQL 数据库崩溃或重新启动期间(基本上)将本地主机和外部流量从 1 个服务器重定向到备份。
我的规则:
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination RMT_IP:3306
iptables -t nat -I OUTPUT -p tcp -o lo --dport 3306 -j DNAT --to-destination RMT_IP:3306
我尝试放弃(有效):
iptables -t nat -D POSTROUTING -j MASQUERADE
iptables -t nat -D PREROUTING -p tcp --dport 3306 -j DNAT --to-destination RMT_IP:3306
无法弄清楚如何在不使用 --line-number 的情况下删除此规则:
iptables -t nat -I OUTPUT -p tcp -o lo --dport 3306 -j DNAT --to-destination RMT_IP:3306
答案1
-I
给定带有(插入)或(附加)的任何规则-A
,您可以重复规则定义以-D
将其删除。
对于您的特定示例,这将删除表链中的第一个OUTPUT
匹配nat
规则
iptables -t nat -D OUTPUT -p tcp -o lo --dport 3306 -j DNAT --to-destination RMT_IP:3306
答案2
如果您需要轻松地打开或关闭规则,那么为其创建一个单独的链怎么样?
iptables -t nat -N MySQLnat
iptables -t nat -A MySQLnat -j DNAT --to-destination RMT_IP:3306
然后以稍微修改的方式创建规则:
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j MySQLnat
iptables -t nat -I OUTPUT -p tcp -o lo --dport 3306 -j MySQLnat
现在,您可以通过清空自定义链来轻松删除 MySQL 特定于 MySQL 的 DNAT 规则:
iptables -t nat -F MySQLnat
空链与刚刚进入空链的链相同-j RETURN
,因此它不执行任何操作,然后继续处理跳入空链的链。
(在你的立场上,我会对删除-j MASQUERADE
POSTROUTING 链中的无条件规则持谨慎态度,除非我非常确定没有其他东西依赖于它。)
当您再次需要 MySQL DNAT 时,只需将链的内容放回即可:
iptables -t nat -A MySQLnat -j DNAT --to-destination RMT_IP:3306