快速變化的 iptables 規則會導致問題嗎?

快速變化的 iptables 規則會導致問題嗎?

我正在編寫一個腳本來監視不同的指標(例如介面頻寬使用情況)並iptables相應地更改規則。這些變化可能至少每秒發生 2 次,最多4 * number of interfaces每秒鐘發生一次。

問題是,我不確定如何iptables處理規則變更。重新編譯後腳本是否會嚴重佔用 CPU 資源?或在規則變更期間仍在處理的資料包會發生什麼情況;他們會被丟棄嗎?諸如此類的擔憂。

快速變化的 iptables 規則會導致問題嗎?

編輯:對於我的具體應用,所有規則都已經到位。它們更多的是啟用或停用(新增或刪除)某些規則。換句話說,表不會隨著時間的推移而增長並變得非常大。

答案1

你如何改變規則?

您是否iptables重複呼叫該命令?這將對效能產生重大影響,因為 iptables 的工作原理是:

  • 取得整個 netfilter 表/鏈
  • 按要求執行一項更改
  • 將整個 netfilter 表/鏈載入回內核

這將發生在每一個 iptables調用。

問題是:您對規則所做的更改的性質是什麼?

如果您要根據來源位址和/或目標位址新增/刪除規則,則應使用ipset

但是,如果您要新增/刪除規則,例如因為您正在動態更改其他參數(例如,更改rate為更多/更少匹配,更改 QoS 標誌等),那麼可能ipset不適合您。

另一方面,如果您的腳本執行更改全體,也可以考慮這樣做:

  • 取得整個 netfilter 表/鏈
    • 您可以使用iptables-save實用程序,或者根據您編寫腳本的內容,也許有一個庫可以為您做到這一點
  • 一次執行您想要的所有更改
  • 將整個 netfilter 表/鏈載入(提交)回內核
    • 您可以使用iptables-restore實用程序,或類似於步驟 1,使用可以為您執行此操作的程式庫

編輯:

啊,因為規則已經在表中了,所以你可以使用條件匹配打開/關閉它們。

插入-m condition --condition $NAME您的規則中iptables

這將創建一個文件,/proc/net/ipt_condition/$NAME.如果檔案包含 則符合成功1,否則如果檔案包含0

(當然,您可以使用否定!來反轉匹配。)

例如:

iptables -A INPUT -m condition --condition allow_880 -p tcp -m tcp --dport 880 -j ACCEPT

若要啟用該規則:

echo 1 > /proc/net/ipt_condition/allow_880

禁用:

echo 0 > /proc/net/ipt_condition/allow_880

(您可以隨意使用任何您想要的名稱,我建議使它們易於識別。名稱有最大長度,但我不記得是什麼。)

編輯1a:

如果您已經建立了表,最簡單的編輯方法是保存 的輸出iptables-save,對其進行編輯(添加需要它們的規則匹配的條件),然後使用iptables-restore或加載整個文件iptables-apply

請記住:1個條件文件可以控制多於1個規則;您不需要每條規則有 1 個文件,除非您確實想要這樣。

編輯1b:

正如 @AB 在評論中提到的(謝謝!),-m condition可能不是您的發行版內建 iptables 的標準功能;在這種情況下,您可能需要安裝額外的軟體包,例如xtables-addons.

(抱歉忘記了這一點,因為我使用的是 Gentoo,而iptablesGentoo 上的軟體包只是遵循內核 .config 的內容。)

答案2

Nftables 可能更適合這種情況。由於整合到 Linux 核心和簡化的語法,它提供了更好的效能。

相關內容