WireGuard 里再套企业 VPN:哪一层先上?
同一台机器上的两个客户端只有在隧道外层承载内层客户端自己的连接,并且用度量值按前缀挑选网卡时才能并存。
在开发者的笔记本上把隧道套起来,有两个正当理由。要么需要让企业客户端看起来来自某个特定国家,要么需要同时访问两个私有网络。这两种情况都要求外层隧道承载内层客户端自己的连接。
按某种顺序先后启动两个客户端并不能做到这一点。真正起作用的是路由。
比较两种可能的顺序
把公网能到达其端点的隧道作为外层。内层则是服务器只能经由那个出口应答的隧道。在 Windows 上,实际划分是外层 WireGuard、内层企业客户端。决定因素是控制权。
官方 WireGuard 客户端会应用完整的配置文件,包括路由和 DNS。商业企业客户端通常把这两样都藏起来。把不透明的客户端放在外层,底下的路径就只能靠猜。
反过来并非不可能。只是更难推理,因为外层客户端会按你永远看不到的时间表改写路由。
让 AllowedIPs 只写出企业网段
AllowedIPs 列出了 WireGuard 送进隧道的目标地址。做嵌套时,它只需要内层服务器地址和企业前缀。其余流量都留在本地网络,打印机和管理程序也不例外。这在设计上就是分离隧道,因此彻底避开了排除段的问题。
外层若采用全隧道,就需要 0.0.0.0/0 减去本地网段。 这种写法无法表达排除,所以必须把补集算出来再粘进去。
[Interface]
PrivateKey = ...
Address = 10.99.4.2/32
[Peer]
PublicKey = ...
Endpoint = 198.51.100.44:51820
AllowedIPs = 198.51.100.44/32, 10.20.0.0/16, 10.21.0.0/16
如果内层客户端不自己安装路由,就要手动把企业前缀列出来。那一行里漏掉的前缀,就是外层隧道永远不承载的目标。过期的列表副本比没有更糟,因为它看起来仍然是对的。
顺序、度量值与第二块网卡
先连外层隧道,再启动企业客户端。这样它的端点连接会经由 WireGuard 出去,而不是走本地网关。给企业网卡更低的度量值,让它拥有的地址在前缀竞争中获胜。
# which interface currently claims the corporate prefix?
Find-NetRoute -RemoteIPAddress 10.20.10.5 | Select-Object -First 1
# prefer the corporate interface for its own prefixes
Set-NetIPInterface -InterfaceAlias 'Corp VPN' -InterfaceMetric 3
Set-NetIPInterface -InterfaceAlias 'wg-personal' -InterfaceMetric 40
wg show interfaces
度量值正是人们常跳过的一步。没有先后顺序时,重叠前缀会由最后安装的那条路由胜出。这一点每次启动都可能变化,所以问题看起来时有时无。
基于 OpenVPN 2.6 的客户端还有自己的坑。数据通道卸载适配器已被占用时,第二个实例直接拒绝启动。在配置里加上 disable-dco 就会退回旧的 TAP 路径,两个客户端便能并行运行。
嵌套路径会在哪里断
断开外层隧道会连带杀掉内层。单独重连内层客户端,常常会让它直接走公网,嵌套就这样被悄悄拆掉。每次都要从两个隧道都停止的状态开始测试顺序。
可用 MTU 会变小。每加一层都有额外开销,因此先从 1420 和 1400 左右的一对数值试起。大包卡住而小请求正常,就是典型征兆。企业策略是另一道限制,因为要求受管设备的客户端可能把嵌套路径视为违规。
如果两端都是固定网络,在两个网关之间建站点到站点隧道,是把顺序问题消除掉,而不是去管理它。在一台笔记本上,两条隧道只有在各自拥有独立网卡、并按前缀选择目的地的规则下才能共存。