你的操作系统已经会哪些 VPN 协议?
Windows、macOS 和 ChromeOS 各自附带一份简短的隧道清单。再装一个驱动之前,先向网关问清它的协议和认证方式。
再下载一个客户端之前,先看看操作系统已经实现了什么,因为答案往往足以让你完全跳过安装程序。Windows、macOS 和 ChromeOS 各自附带一份固定而简短的隧道协议清单,网关只要会说其中一种,就不需要额外的驱动、服务或更新路径。决定这件事的不是手册上的厂商名。决定它的是协议、端点如何认证,以及它期望哪个地址。
问协议,而不是问产品名
产品名几乎说明不了线路上跑的是什么。同一块牌子下的两台网关可能要求完全不同的隧道,一台接受内置客户端,另一台则除了自家门户什么都不认。两位管理员描述同一台设备却各执一词,可能都对,因为他们说的是不同层次。真正决定要不要装驱动的,是底下那条隧道。
向管网关的人问三件事:用哪种隧道协议、哪种认证方式、客户端必须接受哪个地址和 DNS 后缀。按名字要协议;如果对方只回产品名,就解释为什么你需要的是协议。这三个答案在下载任何软件之前就把客户端的问题定下来了。
产品名之所以在那么多工单里活下来,是有原因的。用户看到的是门户 URL,而隧道在正常工作时是看不见的。把协议写进交接备注只花一行字,却能为后来的人消除歧义。
内置清单停在哪里
原生清单很短,而它的边界比内容更重要。基于 IPsec 的 L2TP如果只用预共享密钥,就不会说 SSTP,这个差别决定了选哪个客户端。表格按隧道而不是按厂商排列,所以你可以直接查网关报出的协议。
| Tunnel | Windows | macOS | ChromeOS | Linux |
|---|---|---|---|---|
| PPTP | built in | removed in 10.12 | no | package |
| L2TP over IPsec, pre-shared key | built in | built in | built in | package |
| L2TP over IPsec, certificate | built in | built in | built in | package |
| SSTP | built in | no | no | package |
| IKEv2 | built in | built in | no | package |
| Cisco IPsec with XAuth | no | built in | no | package |
| OpenVPN | no | no | built in | package |
对着网关的要求读表格,而不是对着手册。如果答案是带预共享密钥的 L2TP over IPsec,前三类平台不装任何东西就能连。如果答案是 OpenVPN,在装任何东西之前只有 ChromeOS 被覆盖。哪个内置列里都没有的协议,才是要装东西了的诚实信号。
Linux 是最抗拒一概而论的一列。它的协议支持存在于发行版选择打包的守护进程和插件里,所以最小镜像在你补上之前可能一种都不支持,而两个桌面相同的发行版也可能不一样。
从命令行创建配置文件
图形面板写下的所有内容都保存在你能访问的地方,这正是内置配置文件可以自动化的原因。Windows 把 VPN 条目放在.pbk文件里,位于用户配置文件下以及ProgramData下,而rasphone能列出并编辑网络列表不显示的条目。当机器由脚本预置、没人会去点向导时,这一点很重要。它也解释了配置文件如何能在从不现身托盘的情况下存在。
rasdial
rasdial "VpnName" alice
rasdial "VpnName" /disconnect
手工编辑.pbk文件是可行的,同时也是把它弄坏最快的方式,所以让工具拥有格式。macOS 把服务放在系统配置里,而networksetup按服务名来处理它们;有几个标志要的是地址而不是主机名,所以先把端点解析出来,再保存客户端真正会用的值。这个区别在自动化时会咬人:用地址能跑的脚本换成名字就可能失败,而报错看起来像网关坏了,而不是参数被拒。
networksetup -listallnetworkservices
networksetup -getinfo "ServiceName"
networksetup -setmanualwithdhcprouter "ServiceName" 198.51.100.20
服务名是本地化的,用户也能改,所以把Wi-Fi写死的脚本,在第一条设成别的语言的机器上就会坏。从列表命令里读出名字再传下去,别靠猜。
没有专有客户端也能用证书
有些部署只需要客户端证书,别的都不专有,这正是接受驱动之前值得一试的中间情形。把证书放进平台存储是受支持的;这和把厂商根证书一丢、指望客户端自己找到,不是同一件事。前者是有意放置,后者是附带一张支持工单的猜测。
真正让人栽跟头的是客户端读的是哪个存储。用户存储里的证书,对配置为使用机器存储的客户端是不可见的,而你收到的提示会说证书缺失,而不是说它放错了位置。下结论说证书有问题之前,两个存储都查一遍。把能用的配置用的是哪一个记下来,因为机器重建时,那条笔记比证书活得久。
Windows 明确区分这两个存储,macOS 则把登录钥匙串与系统钥匙串分开。名字不同,但失败方式一模一样:一张客户端从来不看一眼的有效证书。
什么会逼你装客户端
有些网关把客户端绑到私有证书存储、终端状态代理,或操作系统根本做不到的登录交换上。基于 Check Point、Cisco 或 Fortinet 硬件的部署常常落到这里,在这些场景里内置客户端不是捷径。第三方替代品可能连得上,却仍然违反策略,所以这是安全决定而不是便利决定。按策略装上该装的,并在安装程序版本旁记下理由。
那份记录才是人们会跳过、却能为下一任管理员省下一周的部分:协议、认证方式、地址族和必需后缀,外加每个不得不加进去的二进制文件的一行理由。把它放在安装备注所在的地方,而不是聊天线程里。两行文档就能免掉一次重复调查。