我正在设置一台迷你电脑(无品牌的 Protectli vault,可能是 Yangling 原版)用作家用路由器。一旦我手动解决一些启动问题,目前一切基本都能按预期工作。我的 nftables 规则需要存在一个内部桥接器,该桥接器将一些以太网端口连接到家庭主机,才能成功应用。但在启动序列的这一刻,这个桥接器还不存在。因此 nftables 无法加载规则,我需要在每次启动后手动重新加载它们,这非常不方便且有风险。
- 操作系统:Archlinux
- 防火墙:nftables 配置文件(无前端)
- 网络管理器:systemd-networkd(netctl 也已配置并待命以防万一)
- DHCP + DNS: dnsmasq
- Wifi 接入点管理:hostapd
我在网桥和通向 WAN 的接口之间使用 IP 转发,因此 nftables 需要网桥。这部分的规则就这么简单:
table inet FILTER {
chain FORWARD {
type filter hook forward priority filter
policy drop
ct state established,related accept
# It fails here:
iif "br0" oif "enp1s0" accept
}
}
table ip NAT {
chain PREROUTE {
type nat hook prerouting priority dstnat
policy accept
}
chain POSTROUTE {
type nat hook postrouting priority srcnat
policy accept
oif "enp1s0" masquerade
}
}
Systemd-networkd 应该自动设置系统以进行 IP 转发(nftables 规则 + sysctl net.ipv4.ip_forward),但由于未知原因,它在某个时候完全失去了这种能力,所以我不得不自己启用nftables.service并填充 IP 转发规则。我记得我见过 systemd-networkd 生成的规则,它们非常复杂,以至于我无法解释(并记住)它们。也许这些规则是防止启动问题的正确规则?
此外,在默认配置中,nftables.service设置为在network-pre.target之前启动,而netctl/systemd-networkd 则在之后启动。我可能想交换顺序,但我担心会破坏安全性或不遵循良好做法。
还能做什么?
正如@Jaromanda X在问题的评论中所说的那样:“尝试使用
iifname "br0"
”手册页很好地解释了原因: