nftables 错误:语法错误,意外的 Saddr

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 操作系统上使用 nftables 版本 0.9.0。有人可以指出我的错误在哪里吗?我有点迷路了..谢谢你的时间。

答案1

你的规则集是正确的。但你的nftables版本有点太旧了。这是包含您的示例的公告:

[公告] 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 操作系统当前附带内核 5.10.x,因此这是一个有争议的问题。

为了nftables版本,虽然它是通常不推荐,你可以尝试使用破坏者向后移植获取更新版本nftables,当前为 0.9.6。如果您发现这不适合 RPi,您应该从 (Debian) 源重新编译您自己的反向移植包。

注意:wiki 有点滞后,并且可能并不总是完全准确。当然,一旦该功能存在,手册页通常会更准确。例如:

巴斯特的版本0.9.0:

ARP 头表达式

arp [ARP 头字段]

相对破坏者向后移植'版本0.9.6:

ARP 头表达式

arp {htype | ptype | hlen | plen | operation | saddr { ip | ether } | daddr { ip | ether }

简单情况的解决方法(以及额外的困难)

如果你真的无法改变nftables对于像这样的简单情况,可以使用原始负载表达式相反,与熟悉ARP协议,请记住,该协议不仅仅用于以太网和 IPv4,因此有一些通用部分在通常的 IPv4 over 以太网使用中始终是常量(例如: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(以字节为单位):发送方协议地址,又名saddr ip

  • length 32 位:IPv4 地址长度

    0xc0a80201 表示 192.168.2.1

相关内容