即使没有设置隧道 IP 地址,Wireguard 也可以工作,即设置允许的 IP、端点地址、私钥和公钥就足够了。
在OpnSense的文档中,有以下警告:
注意:隧道地址必须采用 CIDR 表示法,并且必须是您的网络的唯一 IP 和子网。[..]请勿使用 /32 (IPv4) 或 /128 (IPv6) 隧道地址
pfSense 有一个可能的解释:
注意:系统路由表中不会自动创建路由。除隧道网络本身之外的其他网络的路由必须使用静态或动态路由单独配置。
在网上搜索并没有得到太多解释:
该子网似乎没有任何功能,我们做了一些测试:
那么,隧道ip中的子网掩码有什么作用呢?
小智 6
子网掩码不执行WireGuard 特定的任何操作。
WireGuard 本身不使用或关心其接口地址上的子网掩码(甚至不使用或关心地址本身)。但是,WireGuard 主机上的网络堆栈和其他网络工具确实关心为每个网络接口注册的 IP 地址和子网,并将使用它们来尝试确定特定接口是否直接连接到特定网络。
您观察到的行为可能会根据您使用的操作系统和特定网络工具(例如 OPNSense/pfSense 及其所有杂项插件)而有所不同,但很多内容(例如路由表、防火墙规则、ARP 消息、邻居表等)都可能会生成根据您为每个网络接口配置的 IP 地址和子网自动进行。然而,在许多情况下,您仍然可以通过自定义路由/防火墙规则、内核设置、网络守护程序配置等来覆盖这些默认值。
例如,当您在 Linux 上使用标准wg-quick脚本启动 WireGuard 接口时,该脚本将使用iproute2工具添加您为该接口配置的每个地址和子网。对于添加的每个地址,iproute2 都会自动将相应的路由添加到主路由表中以匹配该地址的子网。使用该脚本启动一个wg0
地址为 的接口10.0.0.123/24
将导致 iproute2 将以下路由添加到主路由表中:
10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.123
Run Code Online (Sandbox Code Playgroud)
这不是 WireGuard 的问题,它只是 Linux 上一些标准网络工具的默认行为。您可以随意删除该路由并添加其他路由,或者只是使用一组不同的工具来设置 WireGuard 接口。AllowedIPs
(但请记住,添加到 WireGuard 接口的此路由或任何其他路由在接口自身的配置中没有相应的条目将实际上成为黑洞。)
结果是,在大多数情况下,在 WireGuard 接口上使用具有 /32 或 /128 子网掩码的地址是完全可以的。您可以设置自己的路由和防火墙规则,以将所需的任何流量发送到该接口。但对于更高级的情况 - 特别是当您想要在代理 ARP、NDP 代理、OSPF 等接口上运行工具(用于本地子网内)时 - 您可以避免与这些工具的默认行为作斗争通过将 WireGuard 接口及其虚拟邻居分配到一致的逻辑子网。