iptables刪除命令中的相關問題

安全劍客發表於2019-10-17
最近在做一個V*P*N中介軟體的配置工作,在配置iptables的時候,當使用者想刪除EIP(即釋放當前連線),發現使用iptables的相關 會提示錯誤。iptables: Bad rule (does a matching rule exist in that chain?)。
我就納悶了,怎麼會出現這個問題,按照官方的文件也有錯?以下是我針對iptables刪除 的解決辦法。
解決方法:
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

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2660388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章