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