防火牆:nftable 計數器規則
幾個月前,我使用 debian 推薦的程序將 debian 筆記型電腦的防火牆從 遷移
iptables
到nftables
,一切似乎都很好。現在,幾個月後,我正在仔細檢查由該遷移過程創建的規則集,嘗試學習nftables
語法,並查看似乎是幾個我不理解並且懷疑可能不正確的基於計數器的規則。我還沒有發現nftables
wiki 是有用的教育資源,也沒有找到任何其他線上教育資源來解決此類問題:預設的自動遷移規則集包括以下內容:
table inet filter { chain INPUT { type filter hook input priority 0; policy drop; counter packets 123 bytes 105891 jump ufw-before-logging-input counter packets 123 bytes 105891 jump ufw-before-input counter packets 0 bytes 0 jump ufw-after-input counter packets 0 bytes 0 jump ufw-after-logging-input counter packets 0 bytes 0 jump ufw-reject-input counter packets 0 bytes 0 jump ufw-track-input }
前兩個
counter
陳述是引起我注意的例子。我是否正確他們說“跳轉到 ufw-before-foo 部分中的規則,但僅在收到前 123 個數據包和前 105891 個字節之後”。
- 為什麼不立即從數據包 0 字節 0 開始?
- 為什麼不使用 nftables 似乎支持的語法 >=?
- 這些數字是任意的嗎?可能是由於遷移中的故障?
上面的規則集包括跳轉到下面的鏈,可能有類似的問題。這是它的一個片段:
chain ufw-before-input { iifname "lo" counter packets 26 bytes 3011 accept ct state related,established counter packets 64 bytes 63272 accept ct state invalid counter packets 0 bytes 0 jump ufw-logging-deny ct state invalid counter packets 0 bytes 0 drop ... }
- 為什麼要根據接收到的 26 或 64 個先前的數據包來決定接受?
- 防火牆可以在開機和網路發現/連接後的任何時間任意刷新,那麼為什麼要丟棄所有這些初始數據包呢?
正如我上面提到的,這些規則已經實施了幾個月,所以我想知道它們可能會產生什麼負面影響。我想出的唯一候選者是筆記型電腦有時很難建立 wifi 連接(尤其是在從睡眠狀態恢復後),而附近的第二台筆記型電腦則沒有這樣的問題。
- 這些丟棄數據包的規則是否會成為 wifi 連接協商困難的罪魁禍首?
不,解釋要簡單得多:計數器語句具有可選參數數據包和字節,它們顯示當數據包達到其所在規則時計數器計數的數據包和字節數。如果在計數器之前沒有過濾器,任何數據包(包括環回)都會因此增加值,因此它可以非常早和快速地發生。進行轉換的工具看到了一個 iptables 預設計數器,並選擇將其值轉換為保真度。
因此,通常當您編寫規則時,您不會設置這些值,而是
counter
單獨放置一個簡單的,它們都得到預設值 0。當數據包遍歷它時,這些值會增加。可選地,特別是在命名計數器狀態對像中使用時,它甚至可以顯示和重置(使用類似的東西nft reset counters
),為了進行某種形式的記賬,可以在編寫規則集時設置這些值:通常在恢復保存的規則集時就在重新啟動之前。這只能在用作命名的變體時重置,而不是作為“內聯”匿名計數器。它們不能用於改變規則中的匹配,除了顯示它們別無選擇。您遇到的任何 wifi 問題都不是由任何反聲明引起的。
如果現在要使用數據包計數來限制 nftables 防火牆中規則的使用,根據需要有幾種不同的方法:
- 另一個有狀態的對象配額(同樣可以匿名使用,但只能在使用 named 時重置)。然後,您可以讓規則從不匹配或根據其計數開始匹配。
- 有計算費率的限制聲明。例如,如果您擔心日誌規則可能會淹沒日誌文件,您可以使用它來限製完成的日誌數量。它還可以將速率限制為某些資源(通常與帶有 conntrack 的其他過濾器一起使用)。
- 對於最近足夠的 nftables(0.9.2?)和核心(4.18?),有ct count conntrack 表達式來計算使用 conntrack 建立的連接數,通常是為了限制對某些資源(ssh、web 伺服器… )