在 macOS 上切换已保存的 VPN 配置时,真正改变的是什么
切换已保存的 Mac VPN 并非更换配置文件。了解路由、DNS 和凭据会发生哪些变化,以及如何验证你实际得到的隧道。
你打开 VPN 列表,选择另一个已保存的条目,期待一次干净的切换:新的出口地址,其余一切不变。这个假设首先应当放弃。在 macOS 上,已保存的 VPN 是一项完整的网络服务,而不是预设,因此切换服务可能同时改变路由、DNS 和身份验证。菜单栏只显示哪个服务处于活动状态,并不说明下面的隧道是否符合你的本意。
已保存列表不是配置文件选择器
「系统设置 > 网络」中的每个条目都是独立的服务,有自己的服务器地址、账户、认证方式、DNS 服务器,以及「通过 VPN 连接发送所有流量」之类的选项。较早的系统在「系统偏好设置」中保留同一份列表。两个条目可以指向同一个主机名,行为却仍然不同,因为协议或客户端扩展决定了隧道如何建立。
第三方客户端各自维护列表。Tunnelblick 从自己的文件夹读取配置,WireGuard 保存自己的隧道列表,OpenVPN Connect 则把配置文件存在应用内部。有些会把配置注册到系统,另一些则把一切留在应用里,从不出现在内置列表中。因此「切换到已保存的那一项」究竟意味着什么,取决于配置文件归哪个应用所有。
scutil --nc list 会打印在系统配置中注册的 VPN 服务,名称带引号。编写切换脚本时请使用这些准确的名称,也不要以为列表覆盖了所有第三方隧道。
切换真正改变了什么
活动服务变化时,有四样东西一起移动。如果该服务发送全部流量,默认路由就会跟随新隧道;解析器列表会变成该服务指定的 DNS 服务器;新连接会以新隧道的地址作为源地址;而正在使用的凭据属于新服务。原生配置与应用配置文件不能互换,即使两者都终止在同一个网关。
| What you assume | What the system does |
|---|---|
| Same server name means same tunnel | Protocol, certificate and account are per service |
| All traffic follows the active VPN | Only when Send all traffic over VPN is on |
| DNS switches with the VPN | Only if that service defines DNS servers |
| Disconnect ends the connection | On Demand or a management profile can reconnect |
| Open sessions survive the switch | TCP 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 仍在从本地网络作答,就把该服务配置的服务器与解析器列表做比较。如果默认路由仍指向物理接口,那么这个服务是分离隧道,或者没有完全连上。两者都是配置的结果,而不是客户端损坏的证据。
避免意外的切换顺序
- 记下当前服务,以及是否有配置文件在管理它。
- 当两条隧道无法共存时,先断开它。
- 连接目标,等待「已连接」而不是「正在连接」。
- 检查默认路由、解析器列表和新的出口地址。
- 重启持有长连接的应用程序。
在新条目通过这些检查之前保留旧条目,并给每个条目起不同的名字;相同的标签会让下一次故障更难归因。Apple 的 Mac 帮助在在 Mac 上设置 VPN 连接 中描述了原生一侧,这是编辑受管理的配置之前应当查阅的参考。
如果选择会自动回退,先把它当作策略或「按需连接」来处理。确认配置归谁所有、是否设置为自动连接,然后再判断你是在切换服务,还是在和配置文件较劲。