在 macOS 上移除 VPN 看起来是一个动作,实际上至少是四个。系统设置里的按钮会从系统配置存储中删除一个网络服务。它不会删除客户端应用、该应用安装的网络扩展、你钥匙串里的凭据,也不会删除设备管理推送的描述文件。知道每个症状归哪个对象所有,才能阻止已移除的 VPN 悄悄回来。

「移除配置」按钮究竟删除了什么

你添加的每个 VPN 都会成为一个网络服务,与 Wi-Fi 或雷雳网桥属于同一类对象。macOS 把它们全部保存在这里:/Library/Preferences/SystemConfiguration/preferences.plist,每个都有服务 ID、显示名称,以及一个描述隧道类型、服务器地址和隧道启动方式的配置字典。

当你打开系统设置、VPN,点击服务旁的信息按钮,选择「移除配置」并确认后,macOS 会停止隧道、删除该服务对象并重写存储。对系统拥有的部分来说,拆除是完整的:服务从列表中消失,登录时没有任何东西启动它。

按钮触及不到的是属于另一个子系统的全部内容。应用包位于这里:/Applications。NetworkExtension 客户端作为系统扩展运行,其注册与它的配置彼此独立。凭据是钥匙串项目,受持有它们的钥匙串的访问控制约束。配置描述文件归描述文件系统所有。移除服务后,这四样都原封不动。

列出 Mac 仍认为已安装的东西

在删除任何东西之前先做清点。三条命令覆盖三层,它们会产生同样的可见故障:

scutil --nc list
networksetup -listallnetworkservices
profiles -P

scutil --nc list 是 VPN 配置的权威视图,包含连接状态、服务名称和服务 ID。它经常显示设置列表中从不出现的条目:几个月前卸载的客户端留下的服务,以及静默启动的按需配置。networksetup -listallnetworkservices 按命令行工具期望的名称显示网络服务,按名称移除时正需要它。profiles -P 列出已安装的配置描述文件;在受管理的 Mac 上,VPN 可能根本不是你添加的服务,而是其中某个描述文件里的负载。

不要只信任第一份列表,要把几份列表放在一起读。scutil 里存在但设置里没有的服务,通常意味着第三方客户端拥有隧道并在自己的窗口中显示它。两个视图都有、但在设置里是灰色的服务,意味着策略。删除后又出现的名称,意味着有东西在重建它,而那个东西才是真正的目标。

通过所有者移除服务

对你亲自添加的服务,留在有文档的路径上:系统设置、VPN、信息按钮、「移除配置」。Apple 记录了这条路径,它也让配置存储保持一致。在网络栈运行时手动编辑 preferences.plist,正是产生任何界面都无法删除的重复或僵尸服务的方式。

从终端按名称移除服务:networksetup -removenetworkservice "Service Name",然后确认:scutil --nc list。该命令与界面作用于同一份服务列表,因此不在 networksetup -listallnetworkservices 中出现的名称,两条路径都不会移除它。当客户端拥有隧道时,先走该客户端的移除或卸载路径,因为客户端下次启动时会重建该服务。

如果 VPN 来自设备管理,你就不是所有者。MDM 安装的描述文件可以被标记为不可移除,即使可移除,也可能在下次检查时被重新推送。用这条确认:profiles -P,然后走你所在组织的离职流程。在本地删除负载要么失败,要么触发重新安装。

没有服务也会重连的残留

常见的「它又回来了」报告,回来的不是服务,而是拥有该服务的扩展。列出已注册的系统扩展和网络扩展类型的应用扩展:

systemextensionsctl list
pluginkit -m -p com.apple.networkextension.packet-tunnel

NetworkExtension 客户端把它的隧道提供程序安装在自己的标识符下,与任何配置分离。配置消失后扩展仍可能保持活动,客户端的菜单栏代理可能在下次启动时创建新配置,有时还会复用你刚删除的名称。在这里检查登录项和厂商的辅助工具:/Library/LaunchDaemons,然后再断定移除失败。

凭据是第二处残留。登录钥匙串里保存的密码或客户端证书不会随服务一起删除,而 IPSec 共享密钥历来存放在系统钥匙串中,这就是删除后重新添加有时会跳过密码提示的原因。如果这台 Mac 正在离开你的控制,请在 Keychain Access 里按服务名称找到该项目,并吊销已保存凭据所代表的账户、证书或对端密钥。A copied configuration file is a live credential even after local removal。

验证移除,并正确解读回来的描述文件

当服务从两个视图中都消失,并在重新启动后仍然消失,移除才算完成。检查 scutil --nc list 里的服务 ID,用 scutil --dns 确认名称解析使用的是你预期的解析器,然后重启一次,因为按需规则和登录代理是只有干净启动才会现身的两种东西。

如果它还在,不要再删除更多对象。弄清楚是哪一层重建了它:MDM 描述文件重新推送服务、客户端代理重建服务,或者服务因为名称不匹配而从未被移除。这个答案决定了你需要厂商的卸载程序、你的 IT 团队,还是再走一遍同一个移除对话框。Apple 的移除指南只覆盖你添加的服务的受支持路径;残留部分需要你自己核查:remove a VPN configuration。

相关文章