OpenVPN 配置文件为何无法导入 SoftEther
SoftEther 可以提供兼容 OpenVPN 的监听器,但原生客户端需要自己的连接配置文件。请先确认服务类型,再拆分密钥。
两个看起来都像 VPN 配置的文件落在同一个文件夹里,而其中只有一个能用。OpenVPN 配置文件描述的是由该客户端能够理解的指令所组成的 TLS 隧道,而 SoftEther 连接描述的是针对虚拟集线器的会话,两者使用不同的身份验证契约。把其中一个转成另一个并不是格式练习,因为这两个客户端并不实现同一套协议。弄清服务端实际发布的是哪一项服务,决定了后面的一切。
两个文件,两种契约
OpenVPN 配置文件是客户端配置:远端端点、传输方式、TLS 材料,以及用于路由和重新协商的指令。SoftEther 连接是针对虚拟集线器的原生客户端会话,并挂载了一块虚拟网卡。
它们可以描述对同一网络的访问,却不能互相替代。OpenVPN 监听器是服务端可以在单独端口上发布的兼容功能,它讲的是 OpenVPN,而不是原生协议。原生客户端讲原生协议,并且期待自己的配置文件。一个服务端,两扇门,每扇门各有自己的钥匙。
文件扩展名几乎说明不了什么,所以运维方的回答比文件名更重要。
先读懂服务端,再动证书块
向运维方问三件事:哪个端口和传输方式,哪种身份验证方法,以及他们期望你使用哪个客户端。这些答案能消除大部分猜测。
然后确认实际在监听什么,而不是教程声称什么。被关闭的兼容监听器不会在端口上显示任何东西,而开启的监听器即使从没人连接过也会显示套接字。关掉的端口和被拒绝的登录之间的差别,是第一个有用的诊断。之后的一切都取决于敲的是哪扇门。
ss -lunp | grep -E ':1194|:443'
sudo ss -ltnp | grep -E ':992|:5555'
grep -nE '^(remote|proto|auth-user-pass|ca |cert |key )' profile.ovpn
监听列表里没有的 UDP 端口意味着该功能被关闭,而不是防火墙问题。
原生客户端需要什么,而配置文件给不了
原生客户端会安装一块虚拟网卡,并把连接绑定到它上面。没有这块网卡就没有可路由的接口,所以原生连接可能认证通过却完全不承载流量。
原生身份验证针对虚拟集线器进行,使用的是集线器管理员创建的用户对象。从 OpenVPN 配置文件里复制来的证书块不会变成集线器用户,集线器用户也不会变成客户端证书。两套系统保存的东西不同,而配置文件没有地方存放集线器的用户记录。这是结构上的差异,而不是语法问题。
不要把私钥交给任何转换服务,因为一旦私钥离开本机,就必须视为已经泄露。
兼容 OpenVPN 的监听器接受什么
从客户端角度看,兼容监听器就是真正的 OpenVPN 服务端:它期待 OpenVPN 客户端,以及该客户端支持的指令。内联证书块是 OpenVPN 的功能,属于那道篱笆的另一侧。
它不会做的是接受原生 SoftEther 配置文件,因为那种配置文件不是 OpenVPN 配置。监听器也不会把原生客户端变成 OpenVPN 客户端。如果运维方只提供原生服务,答案就是原生客户端;如果提供兼容监听器,答案就是 OpenVPN 及其自己的材料。
请向运维方索取其支持的导出文件,而不是用碎片自己拼一份,因为导出文件带有手工搭建的文件通常遗漏的细节。
改指令之前先验证路径
选定客户端后,先测隧道,再动路由。登录成功和接口能承载流量是两个不同的结果。
sudo openvpn --config profile.ovpn --verb 3
ip -br addr
ip route get 10.70.4.20
resolvectl status | grep -A2 'DNS Servers'
把分配到的地址与运维方描述的地址池对比,然后分别检查路由和解析器。原生集线器连接可能干净地通过认证,却完全不安装任何路由,这在客户端看来就像隧道坏了。只有这三者一致,才值得修改指令。过早修改会掩盖究竟是哪一层出了问题。