nftables 表和链优先级

nftables 表和链优先级

我的 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 链时,就在伪装规则之前,它按预期工作。

答案1

从历史上看,给定的钩子(预路由、输入、输出……)中曾经有一个 NAT 链。执行 nat 语句或简单地接受作为链终端的数据包,对于单个链,它也会结束钩子内的处理。和nftables允许在同一个钩子中使用多个链,终止一个链将继续到下一个链。因此,如果第一个链不执行任何操作(通过接受),则下一个链将有机会执行此操作,这不是预期的目的。

为了解决这个问题,第一个链(或任何其他链)可以留下一条消息传递给每个下一个链,以便它可以对其采取行动:为下一个链设置一个标记(任意值)以改变其行为。

设置一个标记,而不是accept效果为零(将链留空VPN-POSTROUTING也会执行默认策略:)accept。因此,将规则替换VPN-POSTROUTING为以下规则:

nft add rule ip vpn VPN-POSTROUTING oifname br2 ip saddr 10.0.0.0/24 ip daddr 192.168.0.0/24 mark set 0xdeaf

设置此标记后,可以在其他链上使用它来通过不执行剩余规则来改变行为。首先将此规则插入ip nat INTERNET

nft insert rule ip nat INTERNET mark 0xdeaf accept

相关内容