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