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