iptables的删除命令中的相关问题
程序员文章站
2022-03-15 22:11:29
最近在做一个VPN中间件的配置工作,在配置iptables的时候,当用户想删除EIP(即释放当前连接),发现使用iptables的相关命令会提示错误。 我就纳闷了,怎么会出现这个问题,按照官方的文档也有错? "官方文档地址" 解决方法: 1. 按行删除 如果按照行号删除,就不会有这篇文章了,当然如果 ......
最近在做一个vpn中间件的配置工作,在配置iptables的时候,当用户想删除eip(即释放当前连接),发现使用iptables的相关命令会提示错误。
iptables: bad rule (does a matching rule exist in that chain?).
我就纳闷了,怎么会出现这个问题,按照官方的文档也有错?
解决方法:
1. 按行删除
如果按照行号删除,就不会有这篇文章了,当然如果你删除前就知道了行号,那么就可以使用一下命令
iptables -t $table -d postrouting 2
-t
: 后面接的是要操纵的表。表包括四个,注意默认的可能不是你的table,具体看
-d
: 代表删除
postrouting
: 用于源地址转换(snat),这里需要填你的规则连接。
然后后面接行号
iptables -t $table -l -n --line-numbers
2. 根据匹配规则删除
官方文档中采用的的精确匹配删除。所以你不能只制定一个筛选条件。必须给出规则的每一个细节,和你当初添加该规则时一样,和添加动作唯一不同的是,你要把-a改成-d。这种精确匹配删除的成功依赖的就是用户提供的所有match字段,target字段必须和内核中保存的一模一样,精确到字节级别的匹配。如果哪怕有一个字节不匹配,就会有二义性,删除失败。
3. 整表整链删除
这个太极端了,慎用
iptables -t $table -f
4. 使用python-iptables进行操作
本来我这接口就是用python写的,所以自然就想到使用python-iptables来进行规则的删除。这样就可以不用精确匹配了。但问题是无法在阻塞态的时候使用
import iptc table = iptc.table(iptc.table.nat) table.autocommit = false # 不加亦可,会自动提交,此处是手动 chain = iptc.chain(table, "postrouting") for rule in chain.rules: if rule.src == f"{network_segment}/255.255.255.0": chain.delete_rule(rule) table.commit() table.autocommit = true
上一篇: DxO第一稳了?郭明錤曝光华为Mate 30系列相机规格
下一篇: 机器人热之后的冷思考