有人发给你一份配置,你导入它,三十秒后客户端就连向了一个没人检查过的目的地。请先用文本编辑器读一遍文件,因为要害都集中在一小把指令里:remote、proto、port、ca、cert、tls-crypt 和 verify-x509-name。其余全是默认值,而意外就藏在默认值里。

列出文件可能用到的每一个端点

先把端点列全,因为一份配置可能包含多个。grep -nE '^[[:space:]]*(remote|proto|port|remote-random|connection)' profile.ovpn 会按文件顺序打印每个候选,包括内联 <connection> 块中嵌套的那些。

当指令省略端口时,客户端会回落到监听端默认值,所以只有 remote vpn.example.com 时意味着端口 1194,无论文件后面出现哪个 proto。多条裸 remote 行互为备选:客户端按顺序尝试,除非 remote-random 打乱顺序;它也绝不会悄悄替换成另一家运营商的域名。出现两条指向无关域名的 remote 行,就是该停下来问清楚到底想用哪一条的地方。

还要注意 proto 的写法。tcp 被当作客户端侧 tcp-client 的同义词接受,但客户端配置里的 tcp-server 是配置错误,它往往表现为挂起而不是干脆失败。

先确认名字,再确认端口

dig +short vpn.example.com 会告诉你名字是否存在、返回哪些地址;多宿主或经代理的端点合法地返回多个地址。解析只是前提,不是归属证明:谁都能把名字指向某个地址,一个地址也能应答许多名字。

然后按传输层去检查你找到的那个端口。TCP 上,openssl s_client -connect vpn.example.com:1194 -servername vpn.example.com 会打印服务器出示的证书链。UDP 上需要 DTLS:openssl s_client -dtls1_2 -connect vpn.example.com:1194 会在数据报上完成同样的握手。握手成功只证明有东西在监听并持有证书,这比 ping 显示的更多,却仍少于配置自身信任设置所要求的。

当握手失败而主机还能 ping 通时,端口多半是错的或被过滤了。把这当作索要正确端口的理由,而不是去扫邻近端口的邀请。nc -vzu 在某些协议栈上即使无人监听也会报告成功,所以背后没有握手的裸 UDP 探测毫无意义。

把信任固定项与地址分开读

地址决定客户端去哪里,信任块决定它到了之后相信谁。verify-x509-name "vpn.example.com" name 固定主题的通用名,remote-cert-tls server 要求使用扩展密钥用法来完成服务器身份验证。运营商交给你的配置应当两者兼备。

要找 ca、内联 <ca> 块,以及 tls-crypt 或 tls-auth。使用 tls-auth 的配置,在服务器侧使用方向 0 时客户端需要 key-direction 1;不匹配会让握手失败,报出的 TLS 错误读起来像证书故障。内联 CA 不属于你刚解析的那个运营商,说明文件是两处来源拼起来的,这种情形就应当直接拒收。

verify-x509-name 接受 name、name-prefix 或 subject 三种模式,最后一种要求按服务器打印的精确顺序给出完整可辨识名。模式要与值的形态匹配,因为客户端宁可拒绝每一次连接,也不会对差一点的情况给出警告。对不是你写的文件,用普通主机名配 name 是最不意外的选择。

检查那些会静默失败的选项

OpenVPN 2.6 通过 data-ciphers 协商加密算法,只带旧式 cipher AES-256-CBC 行的配置可能建好控制通道却在数据阶段卡住。读这个值能判断文件是否早于你要接入的服务器;2.6 的 手册页 列出了协商顺序,需要向运营商复述时可直接引用。

不带文件名的 auth-user-pass 意味着客户端会提示输入,所以看上去自足的配置仍然需要凭据。auth-user-pass credentials.txt 意味着它期待的是一份多半没发给你的文件。nobind 与 resolv-retry infinite 很平常也无害,而 explicit-exit-notify 只适用于 UDP,在 TCP 上毫无意义。

这些都不改变配置连向何处,但每一项都改变它到底连不连得上,而且没有一项会出现在客户端的导入对话框里。

做出判断,然后记录你的判断

读完之后只有三种结局,其中只有一种该导入。当端点与固定项同你从另一条渠道得到的说明一致时,导入它。当端点看着对、但固定项或 CA 对不上时,索要修正后的文件。当文件混用了不同来源的端点或 CA 材料时,删掉它并索要一份新副本。

记下你核对过的哈希,好让下一个人知道文件是否变过:sha256sum profile.ovpn,贴在笔记里端点旁边。配置是一整套安排,不是一张地址清单,所以绝不要把能用的 remote 塞进别人的信任块里还留着他们的凭据。

对照笔记时,别把私钥和密码留在截图和聊天记录里。端点和非机密选项足以提出一个精确的问题,其余的都该留在文件里。

如果你还是导入了,而第一次尝试失败,就用 --verb 3 运行客户端并读前十行:解析出的 remote 地址、协商出的 proto 和 TLS 错误会依次出现,正好告诉你上面哪一项检查被跳过了。

相关文章