如何使用 nftables 製作有狀態的橋接文件牆?

如何使用 nftables 製作有狀態的橋接文件牆?

nftables 維基有一個例子,但它似乎對我不起作用。

該頁面說它應該從內核 5.3 開始工作,但當我嘗試該頁面中的確切命令時,它顯示「協定錯誤」:

# nft add table bridge filter
# nft add chain bridge filter forward '{type filter hook forward priority 0; }'
# nft add rule bridge filter forward ct state established,related accept
Error: Could not process rule: Protocol error
add rule bridge filter forward ct state established,related accept
                               ^^^^^^^^
  • 硬體:樹莓派4
  • 內核:5.10.92-v8+
  • nft --version:v0.9.8 (E.D.S.)

在建立最新版本的 nftables 及其庫後,我也嘗試過:

  • nftables 1.0.1
  • libnftnl 1.2.1
  • libmnl-1.0.4

我確認ldd nft確實使用了新版本的庫,但仍然出現相同的錯誤訊息。

答案1

此功能自核心 5.3 起可用,但 Raspberry 選擇不在提供的核心中編譯它。

由於我沒有找到核心設定檔(通常作為/boot/config-xxx核心或來自核心),因此我提取了安裝映像以直接驗證這一點。這是 Raspbian 核心中可用模組的比較(來自壓縮影像從官方網站下載):

$ ls -1 lib/modules/5.10.92-v8+/kernel/net/bridge/netfilter/nf*
lib/modules/5.10.92-v8+/kernel/net/bridge/netfilter/nf_log_bridge.ko
lib/modules/5.10.92-v8+/kernel/net/bridge/netfilter/nft_reject_bridge.ko

與一個類似的 Debian 內核對於相同的架構:

$ ls -1 lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nf*
lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nf_conntrack_bridge.ko
lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nf_log_bridge.ko
lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nft_meta_bridge.ko
lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nft_reject_bridge.ko

nf_conntrack_bridge正如我們所看到的,需要Netfilter提供的支持連線部分和nft_meta_bridge對於nftables該部分在 RaspberryPi 作業系統的預設核心上不可用(不,它也不是內建的:grep bridge lib/modules/5.10.92-v8+/modules.builtin沒有結果)。還必須建立啟用這些功能的核心:

很可能還缺少其他罕見的功能。例如模組nft_synproxynft_xfrm(用於 IPSec 過濾)也不存在。

同時,人們仍然可以使用已棄用的方法(一旦實現功能奇偶校驗就將其刪除),這也會影響nftables無論好壞:br_netfilter核心模組。但本土的nftables缺乏對此方法的具體支持,因為它設計為使用較新的內核 5.3 方法。特別是它沒有等效項iptables'-m physdev --physdev-is-bridged

相關內容