我想将规则添加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版本有点太旧了。这是包含您的示例的公告:
你好!
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 头字段]
相对破坏者向后移植'版本0.9.6:
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