wg-quick nftables 规则有什么作用?

What does wg-quick nftables rules do?

当我通过 wg-quick up wg0 添加 wireguard 接口时,wg-quick 设置了以下 nftable 规则。这些在做什么,为什么需要它们?

以下是 ipv4 的一些示例规则:

table ip wg-quick-wg0 {
    chain preraw {
        type filter hook prerouting priority raw; policy accept;
        iifname != "wg0" ip daddr 10.4.125.231 fib saddr type != local drop
    }
    chain premangle {
        type filter hook prerouting priority mangle; policy accept;
        meta l4proto 17 meta mark set ct mark
    }
    chain postmangle {
        type filter hook postrouting priority mangle; policy accept;
        meta l4proto 17 meta mark 0x0000ca6c ct mark set meta mark
    }
}

我对这些很感兴趣,因为我的虚拟机需要它们才能正常运行,但我的主机不需要它们就能有一个可用的 wireguard 接口。遗憾的是,脚本本身没有记录为什么要设置它们。

wg-quick 脚本设置这些规则 仅当您配置 WireGuard 对等点的 AllowedIPs 以包含 /0 -- 又名地址族的“所有地址”或“默认路由”(IPv4 为0.0.0.0/0,IPv6 为::/0)。

使用像 WireGuard 这样的隧道作为默认路由需要一些技巧才能在大多数情况下正常工作。 wg-quick 使用的主要技巧是将新的默认路由放入自定义路由 table,同时添加带有防火墙标记的策略路由规则,仅覆盖主要 table 的默认路由。这是您将在本例中看到 wg-quick 设置的路由和策略规则的目的:

[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0

你的问题中列出的防火墙规则有助于解决一些额外的边缘情况:第一个规则防止某些路由循环和其他问题,当数据包被发送到隧道外的 WireGuard 接口地址时;第二条和第三条规则修复了 reverse-path 对通过隧道接收的数据包的查找(允许 reverse-path 过滤工作)。

如果您不希望 wg-quick 执行这些操作,您可以在 WireGuard 配置的 [Interface] 部分设置 Table = off,并自行设置适当的路由。有关这些路由技巧的更多详细信息,请参阅 Routing All Your Traffic section of the routing guide on the WireGuard site, or the Understanding Modern Linux Routing article. See the Wg-quick Default Firewall Rules 文章以了解有关这些防火墙规则的更多详细信息。