你的 VPN 地址池不是 LAN 的 DHCP 范围: 为什么会出问题
路由式隧道不是以太网段。选一个不与 LAN 重叠的地址池,然后先给 LAN 一条回程路由,再让客户端去访问。
诱人的捷径是让 VPN 客户端使用办公室 DHCP 服务器所用的同一网段,理由是反正都算一张网。并不是。路由式隧道在两端之间传送单播报文,而 LAN 地址池的存在是为了在物理网段上应答广播请求。复用这些地址会让两个分配者共同掌握同一个地址空间,并且让回程路径无从定义。
两个分配者,一个地址空间
LAN 的 DHCP 服务器知道它把哪些地址租给了哪个 MAC 地址,并用 ARP 保护这些地址。VPN 服务器有自己的地址池,对那些租约一无所知。两者都没有错;只是从来没人把它们互相介绍过。
VPN 服务器从 LAN 地址池分配的地址可能已经属于一台打印机。于是两台设备在同一前缀上争夺一个地址,交换机的转发表决定由谁来应答。
这就是人们最先遇到的故障:客户端连接成功,随后却访问到错误的机器,或者时通时断地访问到正确的机器。
为什么路由器不分配 VPN 地址
DHCP 发现是广播,而广播在路由边界处终止。除非设计把隧道桥接,或者运行了权限匹配的 DHCP 中继,客户端请求根本到不了 LAN 服务器。
所以由 VPN 服务器自己指定地址: 服务器配置里的地址池,WireGuard 部署里为每个对端指定地址,或者 IKEv2 部署中由认证层推送地址。这些机制与 LAN 的租约数据库互不相干,正因如此它们才需要各自的网段。
同样的道理可以解释,为什么修改 DHCP 作用域修不好一个始终拿不到地址的 VPN 客户端。客户端根本不去问 LAN 服务器,再怎么编辑作用域也不会让它去问。
重叠表现为冲突,而不是网络变慢
没有受支持的设计而共用同一前缀的两张网,与重复归属是两回事,二者常被混淆。如果 VPN 地址池是独立前缀,只有当某条路由把流量送到错误一侧时重叠才有影响。如果地址池落在 LAN 前缀之内,冲突就是立刻发生、局限本地。
实践中你会看到来自错误设备的 ARP 应答、中途被重置的连接,以及自己地址被他人占用的客户端。这些都不像路由问题,所以修复总被用错层。重复租约容易确认,却很难与之共处。它还能扛过重启,因为两个分配者都坚持同一个地址。
回程路径是另一件事
即便地址池干净且独立,LAN 主机也得知道如何回应客户端。它们的默认网关是路由器,而路由器需要一条指向 VPN 服务器的地址池路由,除非设计改用地址转换来承载客户端流量。
动手之前先把两个方向的路径都读一遍。在网关上问,内核为客户端地址会选择哪个接口;在客户端上问,它访问 LAN 地址时走哪条路由。
下面这些命令显示网关上的转发判断,以及能暴露重复的邻居表项:
ip -4 route get 10.8.0.5
ip neigh show dev br-lan | grep 10.8
ip -4 route get 192.168.50.20如果第一条命令给出的接口是隧道接口,回程路由就存在。如果给出的是 LAN 接口,路由器就认为客户端在链路上,并会去为它做 ARP。
桥接式设计确实存在,但必须主动选择
把隧道桥接到 LAN 是一种真实的设计,用于客户端必须收到广播,或者必须被假定为单网段的协议发现时。它要求服务器掌握这种桥接行为以及随之而来的地址处理。
行不通的做法是照抄地址来模仿结果。没有桥接的共享地址池只会带来冲突而没有发现能力,这是两种安排里最糟的一种。
除非应用真的需要该网段,否则请选择三层加独立地址池,并把地址池记录下来,免得下一任管理员为了整齐又把 DHCP 范围拿去复用。