如果添加的规则与链中已有的规则相同,是否可以在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
您的脚本不会在此异常之前重新插入规则并取消它。