我的 nftables 设置有问题。
我有两张桌子,每一张都有一个带有相同钩子但名称和优先级不同的链。
这些表位于由包含参数加载的不同文件中。
由于优先级,我认为 VPN-POSTROUTING 链将在 INTERNET 链之前执行。但在我的设置中,首先执行 INTERNET 链。
table ip nat {
chain INTERNET {
type nat hook postrouting priority srcnat + 1; policy accept;
oifname br2 masquerade
}
}
table ip vpn {
chain VPN-POSTROUTING {
type nat hook postrouting priority srcnat - 1; policy accept;
oifname br2 ip saddr 10.0.0.0/24 ip daddr 192.168.0.0/24 accept
}
}
我的错误在哪里?
编辑:我更改了规则并将所有链添加到同一个表中,结果相同。
在下一步中,我按照 AB 的建议将计数器和日志添加到规则中。
链的顺序与优先级相对应,但不会触发 VPN 的接受规则。
当我将 VPN 接受规则添加到 INTERNET 链中时,就在伪装规则之前,它按预期工作。
从历史上看,在给定的钩子中曾经有一个 NAT 链(预路由、输入、输出……)。执行 nat 语句或简单地接受作为链的终端的数据包,对于单个链,它也结束了钩子内的处理。由于nftables允许在同一个钩子中使用多个链,终止一个链将继续到下一个链。因此,如果第一个链不做任何事情(通过接受),下一个链就有机会去做,这不是预期的。
为了解决这个问题,第一个链(或任何其他链)可以将消息传递给每个下一个链,以便它可以对其采取行动:为下一个链设置一个标记(任意值)以改变其行为。
设置一个标记,而不是
accept
具有零效果(将链VPN-POSTROUTING
留空也执行默认策略:)。accept
所以VPN-POSTROUTING
用这个替换规则:设置此标记后,可以在另一条链上使用它来通过不执行剩余规则来更改行为。首先将此规则插入
ip nat INTERNET
: