在 Windows 上,"我的 OpenVPN 配置文件在哪里"有两个不同答案,选错会搭进去一下午。社区版 OpenVPN GUI 把一个目录当作它的配置文件列表:配置文件夹里的每个 .ovpn 文件都会出现在托盘菜单中,从该文件夹删掉的文件也就消失了。OpenVPN Connect 则从导入存储工作,所以它会保留你从磁盘上删掉的配置文件,而忽略你复制进去的文件。下面的对比就是我动手之前用来决定打开哪个文件夹的依据。

文件夹列表与导入存储

社区版 GUI 在启动时枚举文件:它读取安装时选定的一个配置目录,放在那里的 .ovpn 文件就是一个配置文件。关掉客户端,把文件复制进那个文件夹,再启动,菜单里就有这一项。

Connect 则根据导入时写入的记录来构建列表,所以复制进去的文件看不见,而导入过的配置文件在原始下载被删除后依然存在。正是这一处差别解释了大多数"两个客户端把配置文件存在不同地方"的报告,因为它们确实如此。

社区版 GUI:实际使用的是哪个文件夹

有两个文件夹值得注意。按用户安装读取 %USERPROFILE%\OpenVPN\config;为所有用户安装读取 C:\Program Files\OpenVPN\config,客户端是 32-bit 时则读取 x86 路径。如果某个配置文件只对某个 Windows 账户出现,它就在按用户的文件夹里,另一个账户永远看不到它。

不要从安装程序推断路径。GUI 接受 --config_dir 参数并记住启动时所用的目录,所以快捷方式可能指向完全不同的地方。创建任何文件之前,先检查快捷方式的目标和 Start in 字段,或者 GUI 设置。

删除就是删文件。先关闭 GUI,免得它把条目留在内存里,把 .ovpn 连同旁边保存的任何证书或密钥文件一起删掉,然后重新启动客户端。

所有用户的文件夹需要提升权限才能删除。在那里静默地什么也没做,是 UAC 的问题,不是客户端缺陷。

Connect:导入存储与双重 AppData 陷阱

当前的 2.x 和 3.x 版本把配置文件放在 %APPDATA%\OpenVPN Connect\profiles 下。2.5 前后的版本改用 %ProgramFiles(x86)%\OpenVPN Technologies\OpenVPN Client\etc\profile,所以新旧论坛回答看起来互相矛盾。就地升级过的机器可能两者都还留着。

路径在转述中会被弄乱。%AppData% 本身已经解析为 AppData\Roaming,所以写 %AppData%\Roaming\OpenVPN Connect\profiles 会展开成 AppData\Roaming\Roaming,指向不存在的位置。要么用变量,要么用字面路径,绝不要混用。

通过客户端删除:打开 Profiles,用铅笔图标,选择 Delete。这样会同时移除记录和存储的副本。在 Connect 运行时删除文件夹,可能留下一个什么都打不开的记录,这就是"配置文件仍然显示"的另一种形式。

导入的副本才是客户端运行的那份。编辑留在 Downloads 里的 .ovpn 没有任何作用,因为 Connect 读取的是它存储的副本;要更换 remote 或 cipher,就在客户端内编辑配置文件,或者编辑文件后重新导入。

为什么删掉的配置文件会回来

同一客户端家族的两次安装是常见原因。按用户的 GUI 和所有用户的 GUI 有各自的配置目录,所以从其中一个删除后另一个原封不动,托盘里仍然列着名字。Programs and Features 是确认两者是否都安装的地方。

第二个原因是配置文件根本不在你检查的文件夹里。从网络共享或 Downloads 文件夹打开一次 .ovpn,可能把它复制进按用户的配置目录,而导入的 Connect 配置文件只存在于 AppData。编辑任何东西之前,先在 %USERPROFILE% 和 %APPDATA% 下都搜一下文件名。配置文件文件夹通常把私钥放在 .ovpn 旁边,所以绝不要把文件夹贴进工单或聊天来证明你删了哪个配置文件——改为说明文件名和时间戳。

较旧的 GUI 版本还会把客户端偏好存在注册表里。如果文件没了、托盘仍列着名字,而且只装了一个客户端,就先重启一次客户端,并在考虑改注册表键之前重新检查快捷方式的配置目录。

两条隧道同时开:先加适配器,再处理路由

GUI 可以保留多个连接,每个虚拟适配器一个;从安装 TAP-Windows6 的 Start 菜单项添加适配器,然后在 Network Connections 里确认数量,因为两条同时运行的隧道需要两个适配器,而且都应该自动获取地址。路由才是更难的限制。两个都重定向全部流量的配置文件会争夺默认路由,而只能有一个拥有它,所以你得到的是时断时续的失败,而不是两条能用的隧道。保留一条完整隧道,给第二条一个只推送自己子网的 split-tunnel 配置文件。

重叠的私有网段无法靠加适配器解决。如果两个服务器都下发 10.8.0.0/24,第二条隧道就在地址层面冲突,再多客户端配置也分不开。

适配器名称能说明你在看什么。PowerShell 里的 Get-NetAdapter 会按名称列出 TAP-Windows 适配器和 Wintun 适配器,当隧道起在错误的适配器上时,这比在 Network Connections 里数图标更快。

从脚本启动指定名称的配置文件

GUI 接受相对于其配置目录的配置文件名,所以启动器看起来是这样:"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect "myvpn.ovpn"。绝对路径,或者在不同工作目录中启动的进程,会静默失败,这就是双击能用的快捷方式在 Task Scheduler 下会坏掉的原因。

与其碰运气,不如设置工作目录。在 AutoHotkey 启动器里是 SetWorkingDir, C:\Program Files\OpenVPN\config;在 Task Scheduler 里是操作的 Start in 字段。用同样的路径传 --config_dir 可以让启动器不依赖这两者。

结束之前,导出配置文件,记下它的适配器、子网以及它路由的子网,并把每个客户的证书放在各自的子文件夹里。然后确认这个文件夹属于你实际运行的客户端,并在该客户端有导入存储时通过客户端删除。正是这个顺序能阻止同一个配置文件在下次重启后再次出现。

相关文章