0

当我通过 添加wireguard 接口时wg-quick up wg0,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 接口。可悲的是,脚本本身没有记录为什么设置它们。

4

1 回答 1

1

wg-quick 脚本仅在您将AllowedIPsWireGuard 对等体配置为包括——也就是地址族(对于 IPv4 和IPv6)/0的“所有地址”或“默认路由”时才设置这些规则。0.0.0.0/0::/0

使用像 WireGuard 这样的隧道作为默认路由需要一些技巧才能在大多数情况下正常工作。wg-quick 使用的主要技巧是将新的默认路由放入自定义路由表中,同时添加带有防火墙标记的策略路由规则以仅覆盖主表的默认路由。这是在这种情况下您将看到 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 接口地址时,第一条规则可以防止某些路由循环和其他问题;第二和第三条规则为通过隧道接收的数据包修复反向路径查找(允许反向路径过滤工作)。

如果您不想让 wg-quick 做这些事情,您可以Table = off[Interface]您的 WireGuard 配置部分进行设置,并自己设置相应的路由。有关这些路由技巧的更多详细信息,请参阅 WireGuard 站点上路由指南的路由所有流量部分,或了解现代 Linux 路由文章。有关这些防火墙规则的更多详细信息,请参阅Wg-quick 默认防火墙规则文章。

于 2022-01-24T00:45:54.517 回答