导入配置文件并不等于替换客户端。NetworkManager 会保存插件类型以及插件专属的数据和机密,而拥有该类型的插件决定连接能做什么。供应商应用叠加在上面的东西,从注册到常开拦截,都存在于文件之外。切换是否安全,取决于你实际依赖其中哪些层。

文件指定的是插件,而不是一组功能

NetworkManager 的「VPN 设置参考」描述了一种选择插件的服务类型,还描述了只有插件才能解释的不透明数据字典和机密字典。配置文件是与某一种实现的契约,而不是任何客户端都能复现的行为说明。两个客户端可以说同一种协议,却在协商内容和启用哪些数据路径上不同。协议名称告诉你隧道是什么,从不告诉你周边客户端拿它做什么。

所以要比较需求,而不是包装。问题不是替代方案能否连上,通常都能;而是那些让原客户端可被接受的需求,是否在迁移后仍然成立。在安装任何东西之前把这些需求写下来,否则比较就变成了找第一个出问题的地方。

供应商应用在隧道周围还加了什么

供应商客户端通常把注册与设备姿态检查、带自有界面的二次验证流程、常开拦截、更新通道和支持工具打包在一起。其中一部分紧挨协议,另一部分则是只共用安装程序的不同产品。NetworkManager 可以替换隧道及其路由,连接状态变化时 dispatcher 脚本也能触发动作。但它不复制拦截引擎、证书续期流程,也不复现“哪个用户可以拉起连接”这一假设。

组件更多并不意味着更安全,更少也不意味着更弱。问题在于哪个组件执行了你被要求遵循的策略。如果审计员问隧道断开时是什么在拦截流量,答案必须指出真正做这件事的东西,而只会连接的配置文件不是答案。

归属真正分歧的地方

请把这张表当作归属地图而不是检查清单,因为下面的失败都是归属缺口,再多的客户端配置也补不上。每一行都点明层次、今天通常由哪一方持有,以及缺口最先出现在哪里。

LayerVendor applicationNetworkManager connectionWhere the gap shows up
Enrollment and posturebuilt into the clientabsent unless something else supplies ita managed device fails its next posture check
Address and resolver authoritythe client sets boththe plugin plus dispatcher scriptsnames resolve through the wrong resolver after a state change
Blocking on dropa bundled enginenothing by defaulttraffic continues in the clear after the tunnel dies
Upgrade paththe vendor's own channelthe distribution package and its plugina plugin update changes behaviour with no vendor note
Diagnostics and supportvendor tooling with client statejournal and dispatcher outputsupport cannot see why negotiation failed

每一行都要配一个可以重复的观察,而不是对客户端的感觉。一个经由预期解析器解析的名字、一条隧道停止后消失的路由,以及模拟断开后被拦截的连接,这三项观察合起来覆盖了表格的大部分。把观察写在它所证明的需求旁边,并保留失败的那些,因为失败的观察是记录中唯一能预测下一次事故的部分。

在不重叠归属的前提下切换

针对同一服务同时运行供应商客户端和 NetworkManager 连接,是这类比较最常见的出错方式。两者都会安装路由,两者都可能设置 DNS,两者都可能触碰防火墙状态。此时你测到的是第三种安排,它与两个客户端中任何一个的文档化行为都不相符。

nmcli -f NAME,UUID,TYPE connection show
nmcli connection show work --show-secrets | grep -E "^vpn\."
journalctl -u NetworkManager -b --since "10 min ago"

第一条命令告诉你配置文件到底是不是 VPN 类型。第二条显示插件服务类型以及存了哪些机密,当密钥期望由代理而非文件提供时这一点很重要。日志是加载成功却未能协商的插件会开口的地方。如果三者都没有显示问题,缺口就在隧道之上的策略层,而不在连接本身。

在启用新连接之前断开旧客户端,保持端点和账户一致,并写下哪个组件拥有路由、解析器设置和拦截。正是这份记录,能防止下一次更新以两个所有者收场。

相关文章