zoukankan      html  css  js  c++  java
  • iptables的删除命令中的相关问题

    最近在做一个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来进行规则的删除。这样就可以不用精确匹配了。但问题是无法在阻塞态的时候使用

    但是可以重启一个单独的脚本运行

    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
    
  • 相关阅读:
    redis参数AOF参数的bug
    tidb损坏tikv节点怎么恢复集群
    mysql主从延时临时解决办法
    python脚本批量杀死redis链接
    pt-online-schema-change 脚本化
    mysql查看锁等信息SQL
    mongo复制集脑裂问题如何处理
    日志收集及网络包收集方案
    各浏览器下载文件名不乱码的解决办法
    java 中 byte[]、File、InputStream 互相转换
  • 原文地址:https://www.cnblogs.com/selfcs/p/12610873.html
Copyright © 2011-2022 走看看