
我正在編寫一個腳本來監視不同的指標(例如介面頻寬使用情況)並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,而iptables
Gentoo 上的軟體包只是遵循內核 .config 的內容。)
答案2
Nftables 可能更適合這種情況。由於整合到 Linux 核心和簡化的語法,它提供了更好的效能。