Windows 的 OpenVPN 配置文件在 Ubuntu 上失败:三个层次
服务器推送的那行仅限 Windows 的指令只是一个警告。同一个配置文件在终端里会先因权限、再因缺少解析器辅助程序而失败。
在终端里启动同一个配置文件,大多数人复制的那条消息只是警告,而不是客户端停下的原因。这里有三层彼此独立的问题:Linux 版本并不实现的推送指令、创建 tun 设备所需的权限,以及把连接变成可用 DNS 的解析器辅助程序。请按顺序排查,因为每一层都可能掩盖下一层。
保留下载时的原文件,只修改副本,这样重新下载时不会悄悄还原你的改动。
先读懂警告再归咎于它
block-outside-dns 通过 Windows 筛选平台在 Windows 上锁定 DNS,而 Linux 客户端没有对应的实现。服务器推送它时,客户端会为这条推送项打印一行“未知选项”,然后继续运行,因为推送的选项不会被当作致命错误。但你自己文件里的同一行是另一回事:在那里解析器会停下。动手之前先判断你属于哪一种,因为只有一种会终止运行。
要去掉噪音,可在解析前过滤:为该名称加一条 pull-filter ignore 条目,或者当这行位于本地文件时使用 --ignore-unknown-option。两者都只是让你已经读过的行安静下来,都不会修复你尚未诊断的故障。
权限在一切之前先失败
tun 设备和随之而来的路由都是特权对象,普通账户无法创建。--user 选项解释了这种分工:守护进程只有在特权工作完成后才放弃特权。请以 root 或通过这样启动的 unit 启动,然后在查看证书之前先找权限错误。放宽配置文件的文件权限并不能给进程它缺少的权利。
TLS 错误意味着客户端已经越过这一层。关于设备或路由的报错意味着它从未到达上一层。
图形界面做了而终端没做的事
在每次查询仍然失败的情况下成功连接,就是第三层。NetworkManager 自己做解析工作,所以桌面端导入即使配置文件的 up 脚本从未成功运行,也能下发 DNS。命令行 openvpn --config 会执行 --up 指定的内容,如果这个辅助程序不存在,接口虽然出现,查询却仍然发往之前的服务器。安装任何东西之前,先比较两条路径的脚本。
请使用发行版打包的辅助程序;从博客文章里抄来的脚本通常针对的是别的解析器。为 systemd-resolved 提供的集成并不是通用的 vpnc 风格脚本,它们各自期待客户端给出自己的参数和变量。用户自定义的 up 脚本还需要 script-security 2,客户端才会执行它们。
下次运行时把层次分开
用 --verb 4 运行一次,并按发生的顺序读日志:设备创建、路由、TLS 握手,然后是 up 脚本输出。这个顺序里的第一个失败才是值得修的;之后的通常都是后果。解析器不工作时隧道却建立了,说明你在第三层,证书与此无关。比对时请保持下载的配置文件不动。
一旦每次运维调整都换来一行被拒绝的配置,这个文件就是为别的平台准备的。请申请 Linux 导出,而不是长期维护一张过滤清单。
记下哪一层失败、是什么改变了它,否则下一个拿到同一文件的人也会停在警告上。