你打开 VPN 列表,选择另一个已保存的条目,期待一次干净的切换:新的出口地址,其余一切不变。这个假设首先应当放弃。在 macOS 上,已保存的 VPN 是一项完整的网络服务,而不是预设,因此切换服务可能同时改变路由、DNS 和身份验证。菜单栏只显示哪个服务处于活动状态,并不说明下面的隧道是否符合你的本意。

已保存列表不是配置文件选择器

「系统设置 > 网络」中的每个条目都是独立的服务,有自己的服务器地址、账户、认证方式、DNS 服务器,以及「通过 VPN 连接发送所有流量」之类的选项。较早的系统在「系统偏好设置」中保留同一份列表。两个条目可以指向同一个主机名,行为却仍然不同,因为协议或客户端扩展决定了隧道如何建立。

第三方客户端各自维护列表。Tunnelblick 从自己的文件夹读取配置,WireGuard 保存自己的隧道列表,OpenVPN Connect 则把配置文件存在应用内部。有些会把配置注册到系统,另一些则把一切留在应用里,从不出现在内置列表中。因此「切换到已保存的那一项」究竟意味着什么,取决于配置文件归哪个应用所有。

scutil --nc list 会打印在系统配置中注册的 VPN 服务,名称带引号。编写切换脚本时请使用这些准确的名称,也不要以为列表覆盖了所有第三方隧道。

切换真正改变了什么

活动服务变化时,有四样东西一起移动。如果该服务发送全部流量,默认路由就会跟随新隧道;解析器列表会变成该服务指定的 DNS 服务器;新连接会以新隧道的地址作为源地址;而正在使用的凭据属于新服务。原生配置与应用配置文件不能互换,即使两者都终止在同一个网关。

What you assumeWhat the system does
Same server name means same tunnelProtocol, certificate and account are per service
All traffic follows the active VPNOnly when Send all traffic over VPN is on
DNS switches with the VPNOnly if that service defines DNS servers
Disconnect ends the connectionOn Demand or a management profile can reconnect
Open sessions survive the switchTCP sessions tied to the old address stall

最容易让人困惑的是 DNS 部分。macOS 维护解析器顺序,而scutil --dns 会显示哪些解析器正在使用、位于哪个接口上。未配置 DNS 服务器的 VPN 服务可能让 Wi-Fi 的解析器继续作答,于是你得到了新的公网地址,DNS 行为却仍是旧的,进而得出「切换只成功了一半」的结论。

旧配置为什么会回来

如果你断开连接,而同一服务片刻后又自动连上,先看「按需连接」。按需连接规则可以在应用解析到匹配域名时把服务重新拉起来,管理配置文件也能强制执行同样的规则。删除条目很少能解决:由配置文件安装的配置通常会在下次刷新配置文件时回来,而手动配置可能在服务消失后把密码留在钥匙串里。

启动第二个服务并不总会停掉第一个。取决于客户端和协议,你可能最终有两个隧道和两组路由,而决定流量走哪一条的是服务顺序和路由的具体程度,不是你最后点击的那个图标。在下结论说切换发生了之前,先检查接口。

验证隧道,而不是对勾

在动设置之前,先走一遍系统自身的视角。scutil --nc status "Name" 报告系统认为的状态;ifconfig 显示utun 接口是否有地址;netstat -rn -f inet 显示默认路由指向哪里;scutil --dns 显示实际在用的解析器。然后打开一个新连接并确认出口地址,因为已经登录的页面可能仍在用绑定到旧隧道的套接字。

如果 DNS 仍在从本地网络作答,就把该服务配置的服务器与解析器列表做比较。如果默认路由仍指向物理接口,那么这个服务是分离隧道,或者没有完全连上。两者都是配置的结果,而不是客户端损坏的证据。

避免意外的切换顺序

  1. 记下当前服务,以及是否有配置文件在管理它。
  2. 当两条隧道无法共存时,先断开它。
  3. 连接目标,等待「已连接」而不是「正在连接」。
  4. 检查默认路由、解析器列表和新的出口地址。
  5. 重启持有长连接的应用程序。

在新条目通过这些检查之前保留旧条目,并给每个条目起不同的名字;相同的标签会让下一次故障更难归因。Apple 的 Mac 帮助在在 Mac 上设置 VPN 连接 中描述了原生一侧,这是编辑受管理的配置之前应当查阅的参考。

如果选择会自动回退,先把它当作策略或「按需连接」来处理。确认配置归谁所有、是否设置为自动连接,然后再判断你是在切换服务,还是在和配置文件较劲。

相关文章