替换 iptables 规则而不给出规则编号

替换 iptables 规则而不给出规则编号

如果添加的规则与链中已有的规则相同,是否可以在iptables不给出规则编号的情况下替换规则,或者通过覆盖现有规则来插入/追加规则?我问的原因是我有一个自动添加iptables规则的脚本,并且可能存在添加的规则与链中已有的规则相同的情况。

答案1

这是一种足够接近的方法来完成您所要求的事情。iptables有选择-C/--check

-C,--检查链式法则规范

检查所选链中是否存在符合规范的规则。该命令使用与以下相同的逻辑-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

您的脚本不会在此异常之前重新插入规则并取消它。

相关内容