Arp

nftables 錯誤:語法錯誤,意外的 saddr

  • July 26, 2021

我想將規則添加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

$$ ARP header field $$

buster-backports的 0.9.6 版相比:

ARP 報頭表達式

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

引用自:https://unix.stackexchange.com/questions/658586