Martin Asked: 2019-12-14 08:17:47 +0800 CST2019-12-14 08:17:47 +0800 CST 2019-12-14 08:17:47 +0800 CST 替换 iptables 规则而不给出规则编号 772 如果添加的规则与链中已经存在的规则相同,是否可以通过覆盖现有规则来替换iptables规则而不给出规则编号或插入/附加规则?我问的原因是我有一个自动添加iptables规则的脚本,并且可能存在添加的规则与链中已经存在的规则相同的情况。 iptables 1 个回答 Voted Best Answer A.B 2019-12-14T09:50:30+08:002019-12-14T09:50:30+08:00 这是一种足够接近的方法来完成您的要求。iptables有选项-C/--check: -C, --check链式规则规范 检查所选链中是否存在与规范匹配的规则。此命令使用与-D相同的逻辑来查找匹配条目,但不会更改现有的 iptables 配置并使用其退出代码来指示成功或失败。 因此,例如,如果您有一些自动脚本尝试执行以下操作: iptables -I FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT 并且你不想污染你的规则,你可以这样做: iptables -C FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT || \ iptables -I FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT 这将检查规则是否存在。如果它返回 true,则什么都不会发生,如果它返回 false,shell 将执行第二条iptables规则。如果总是这样完成,那么您将幂等地获得一次且仅一次该规则(但请参阅稍后关于排序的内容)。您本可以使用-A但-I更有可能提供帮助。 如果规则的位置确实很重要,但由于其他更改而您不知道它当前的确切位置,则应使用用户定义的链来执行此操作。这样规则将始终在跳转的位置被调用: iptables -N mychain iptables -A FORWARD -m comment --comment first_rule iptables -A FORWARD -m comment --comment initially_second -j mychain iptables -C mychain -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT || \ iptables -A mychain -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT 这样,如果在某个时间之前插入了异常: iptables -I FORWARD 2 -s 10.0.3.10 -d 10.0.4.20 -m comment --comment now_second -j DROP 您的脚本不会在此异常之前重新插入规则并取消它。
这是一种足够接近的方法来完成您的要求。
iptables
有选项-C/--check
:因此,例如,如果您有一些自动脚本尝试执行以下操作:
并且你不想污染你的规则,你可以这样做:
这将检查规则是否存在。如果它返回 true,则什么都不会发生,如果它返回 false,shell 将执行第二条
iptables
规则。如果总是这样完成,那么您将幂等地获得一次且仅一次该规则(但请参阅稍后关于排序的内容)。您本可以使用-A
但-I
更有可能提供帮助。如果规则的位置确实很重要,但由于其他更改而您不知道它当前的确切位置,则应使用用户定义的链来执行此操作。这样规则将始终在跳转的位置被调用:
这样,如果在某个时间之前插入了异常:
您的脚本不会在此异常之前重新插入规则并取消它。