
我有一套我設計的腳本,用於網路監控、控制等。我在這些腳本中做的一件事是建立一個 iptables 鏈,例如iptables -N mychain
.然後,我根據需要將規則插入主表中,以便將資料包發送到我的自訂鏈,以達到我希望它們在那裡存在的任何目的。
我的問題是:我有一個執行“刷新”的腳本 - 換句話說,它刪除所有規則並重新開始。如果出現任何奇怪的異常情況,它很有用。人們通常仍然手動管理 iptables,即使有一些東西在管理它的一部分。 (這就是為什麼我希望所有工作都在單獨的表中完成。)
如果我想清理我的鏈條,那很簡單:iptables -F mychain
。但我什麼不知道該怎麼做是刪除我可能創建的任何引用內建鏈(輸入、輸出等)的規則
假設我的應用程式中有一個錯誤,或者用戶正在擺弄並最終弄亂了表格,並且它以某種方式將規則添加到了 INPUT 鏈中兩次。現在資料包將通過鏈兩次 - 被計數兩次,被路由兩次,等等。
對此的明顯解決方案是遍歷主鏈並刪除跳轉目標是我的自訂鏈的任何規則。但我不知道該怎麼做。
這是我們可以設定的最壞情況的範例:
iptables -N TEST
iptables -A INPUT -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST # again, for doubling error
iptables -I INPUT -p icmp -j TEST
讓我們假設一個不道德或不知情的管理員創建了三個最底層的規則。
所以現在,我可以發布iptables -D INPUT -j TEST
,我創建的規則就會消失。但是,其他規則不會被刪除,因為使用時的參數-D
必須符合。因此,即使我努力刪除自己的規則,資料包仍然可能會因為不同的原因多次出現在那裡。
沖洗主鏈不一定適合。同樣,在命令列中使用 iptables 很常見(我自己一直這樣做),所以只是盲目清除每一個規則可以清除某人出於正當理由添加的內容,即使它是臨時規則。
顯而易見的解決方案是以某種方式刪除任何目的地是TEST
鏈的規則並刪除這些規則。但是我在 iptables 手冊頁中沒有看到任何可以完成此操作的命令。
我能看到的最接近的可能是任何用戶的iptables -S
。我可以使用iptables -S
並創建一個解析器來解釋輸出,但這是一些額外的工作。我只是想知道是否有更正確的方法以某種通配符方式刪除規則。再次,刪除跳轉目標是我想要的任何鏈的任何規則。
如果我想刪除一條鏈,但它在其他地方有引用,則可能會發生類似的情況。我希望能夠找出該引用在哪裡,並且很可能也將其刪除。
這可能嗎?或者我最終必須編寫一個解析器來解釋iptables -S
輸出?
答案1
這應該相當簡單。使用 iptables-save 將目前規則集寫入檔案或標準輸出,刪除任何內容-j YOURCHAIN
並使用 iptables-restore 將結果載入回來
作為管道,這很誘人
iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore
但是,我不確定同時運行保存和恢復是否可以正常工作。將保存與恢復分開會更安全。將會有一個小的關鍵區域,其中規則集的干預更新將會遺失。
答案2
我認為除了重新載入整個配置之外,沒有任何簡單的方法可以解決這個問題。
您也許應該考慮一下在您的鏈中添加一個刪除策略,至少如果您勤奮的話,它會導致問題,並可能引發一些討論。
從技術角度來看,如果您必須解析各種命令的輸出,您可能會發現--line-num 很有幫助,但請記住以相反的順序(從高到低)刪除,以便索引不會每次都改變。
答案3
如果你需要進階操作iptables
,一個優秀的Python函式庫http://ldx.github.io/python-iptables/也許值得一看。它提供了一個程式介面(讀取和修改)netfilter
。互通性iptables
是透過使用iptables
C 庫(libiptc
、libxtables
和iptables
擴展)來實現的,而不是呼叫iptables
二進位檔案並解析其輸出。