nftables 錯誤:語法錯誤,意外的 saddr
我想將規則添加
arp saddr ip 192.168.2.1 counter accept
到我的 Nftables 防火牆。使用 讀取配置文件時sudo nft -f /etc/nftables2.conf
,我收到錯誤消息/etc/nftables2.conf:26:21-15: Error: syntax error, unexpected saddr arp saddr ip 192.168.2.1 counter accept ^^^^^^
有問題的表:
table arp filter { chain input { type filter hook input priority 0; policy drop; arp saddr ip 192.168.2.1 counter accept } chain output { type filter hook input priority 0; policy accept; } }
我修不好。起初我嘗試了不同的 IP,然後我嘗試了相同
saddr ether <MAC of device>
的 IP 地址而不是 IP 地址,但得到了相同的結果。我在最新的 Raspberry Pi OS 上使用 nftables 版本 0.9.0。有人可以指出我的錯誤在哪裡嗎?我有點迷路了。謝謝你的時間。
您的規則集是正確的。但是你的nftables版本有點太舊了。這是包含您的範例的公告:
$$ ANNOUNCE $$nftables 0.9.1 版本:
你好!
Netfilter 項目自豪地介紹:
nftables 0.9.1
此版本包含修復和新功能,可用於 Linux 核心 >= 5.2。
$$ … $$
- ARP 發送者和目標 IPv4 地址匹配,例如。
table arp x { chain y { type filter hook input priority filter; policy accept; arp saddr ip 192.168.2.1 counter packets 1 bytes 46 } }
這會更新源自 192.168.2.1 地址的 ARP 數據包的規則計數器。
所以你可能需要 kernel >= 5.2 (如果需要還不清楚)但確實需要 nftables >= 0.9.1
對於核心:https : //www.raspberrypi.org/software/operating-systems/ 表明 Raspberry Pi OS 目前帶有核心 5.10.x,因此這是一個有爭議的問題。
對於nftables版本,雖然通常不推薦,但您可以嘗試使用buster-backports來獲取更新版本的nftables,目前為 0.9.6。如果您發現這不適合 RPi,您應該從 (Debian) 原始碼重新編譯您自己的反向移植包。
注意:wiki 有點滯後,可能並不總是完全準確。通常,手冊頁更準確,當然,一旦該功能存在。例如:
buster的 0.9.0 版:
ARP
$$ ARP header field $$
與buster-backports的 0.9.6 版相比:
arp {htype | ptype | hlen | plen | operation | saddr { ip | ether } | daddr { ip | ether }
簡單案例的解決方法(以及額外的困難)
如果你真的不能為像這樣的簡單情況更改nftables,則可以使用原始有效負載表達式代替,對 ARP 協議有很好的了解,請記住,該協議不僅僅用於乙太網和IPv4 因此有一些通用部分在通常的 IPv4 over Ethernet 使用中始終是常量(例如:hlen=6,plen=4)。
無論如何,我作弊,只是用 nftables 0.9.0 讀回一個工作規則集,以將其顯示為原始有效負載,並將十進制輸出轉換為十六進制(有效負載偏移和長度除外):
table arp filter { chain input { type filter hook input priority 0; policy drop; @nh,112,32 0xc0a80201 counter accept } chain output { type filter hook input priority 0; policy accept; } }
使用維基百科的連結很容易閱讀:
- 偏移量 112(以位為單位)是偏移量 14(以字節為單位):Sender Protocol Address aka
saddr ip
。- 長度 32 位:IPv4 地址長度
0xc0a80201 表示 192.168.2.1