我在运行 NixOS 22.11 的路由器上使用 nftables(启用了最新的 XanMod 内核补丁和 acpid 以及 irqbalance)。该机器有 3 个接口:连接到互联网的 enp4s0 和两个服务于不同 IP LAN 的本地 WiFi 接入点,wlp1s0 和 wlp5s0。
我的 nftables 配置如下:我只允许本地网络上的入站 DNS、DHCP 和 SSH 流量,并允许出站和转发流量以及 SNAT 到互联网。
table ip filter {
chain conntrack {
ct state vmap { invalid : drop, established : accept, related : accept }
}
chain dhcp {
udp sport 68 udp dport 67 accept comment "dhcp"
}
chain dns {
ip protocol { tcp, udp } th sport 53 th sport 53 accept comment "dns"
}
chain ssh {
ip protocol tcp tcp dport 22 accept comment "ssh"
}
chain in_wan {
jump dns
jump dhcp
jump ssh
}
chain in_iot {
jump dns
jump dhcp
}
chain inbound {
type filter hook input priority filter; policy drop;
icmp type echo-request limit rate 5/second accept
jump conntrack
iifname vmap { "lo" : accept, "wlp1s0" : goto in_wan, "enp4s0" : drop, "wlp5s0" : goto in_iot }
}
chain forward {
type filter hook forward priority filter; policy drop;
jump conntrack
oifname "enp4s0" accept
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
oifname "enp4s0" snat to 192.168.1.2
}
}
table ip6 global6 {
chain input {
type filter hook input priority filter; policy drop;
}
chain forward {
type filter hook forward priority filter; policy drop;
}
}
通过这个简单的配置,我预计 KDE Connect 无法工作,因为它需要打开端口 1714-1764。事实上,如果我将我的计算机连接到 wlp1s0,将我的手机连接到 wlp5s0(如此不同的接口),这些设备无法相互看到,并且我可以通过 tcpdump 以及通过 nftables 查看数据包,使用日志记录规则或 nftrace。
但是不知何故,如果我现在将两台机器放在同一个界面上,例如 wlp1s0,KDE Connect 可以完美运行并且设备可以相互看到。我最好的猜测是这是由于连接跟踪而发生的,但即使我添加
chain trace_wan {
type filter hook prerouting priority filter - 1; policy accept;
iifname "wlp1s0" oifname "wlp1s0" meta nftrace set 1
}
到filter
表上,运行时看不到任何数据包nft monitor trace
。同样,在链中的索引 0 处插入日志记录规则时,我在系统日志中看不到任何数据包forward
。然而在运行时tcpdump -i wlp1s0 port 1716
我可以看到我希望 nftables 也能看到的数据包:
14:33:59.943462 IP 192.168.2.11.55670 > 192.168.2.42.xmsg: Flags [.], ack 20422, win 501, options [nop,nop,TS val 3319725685 ecr 2864656484], length 0
14:33:59.957101 IP 192.168.2.42.xmsg > 192.168.2.11.55670: Flags [P.], seq 20422:20533, ack 1, win 285, options [nop,nop,TS val 2864656500 ecr 3319725685], length 111
当两个设备连接在同一个接口上时,为什么 nftables 看不到那些数据包?我怎样才能使 nftables 默认丢弃所有这些转发的数据包?
评论中要求的其他信息:
❯ ip -br link
lo UNKNOWN <LOOPBACK,UP,LOWER_UP>
enp2s0 DOWN <BROADCAST,MULTICAST>
enp3s0 DOWN <BROADCAST,MULTICAST>
enp4s0 UP <BROADCAST,MULTICAST,UP,LOWER_UP>
wlp5s0 UP <BROADCAST,MULTICAST,UP,LOWER_UP>
wlp1s0 UP <BROADCAST,MULTICAST,UP,LOWER_UP>
❯ ip -4 -br address
lo UNKNOWN 127.0.0.1/8
enp4s0 UP 192.168.1.2/24
wlp5s0 UP 192.168.3.1/24
wlp1s0 UP 192.168.2.1/24
❯ bridge link
❯ ip route
default via 192.168.1.1 dev enp4s0 proto static
192.168.1.0/24 dev enp4s0 proto kernel scope link src 192.168.1.2
192.168.1.1 dev enp4s0 proto static scope link
192.168.2.0/24 dev wlp1s0 proto kernel scope link src 192.168.2.1
192.168.3.0/24 dev wlp5s0 proto kernel scope link src 192.168.3.1
❯ sysctl net.bridge.bridge-nf-call-iptables
sysctl: error: 'net.bridge/bridge-nf-call-iptables' is an unknown key