最后一行日志之后终端安静下来,并不意味着卡住了。前台客户端本来就是这个样子:它已经启动完毕,正坐在那里承载流量。Shell 提示符并不像看起来那样是成功的标志。

把这个消息当作启动与稳态之间的边界,因为它标记的正是这一点。

这条消息标记的是启动结束,而不是进程结束

OpenVPN 打印这行是在打开设备、配置接口、安装路由并与对端完成 TLS 交换之后。之后进程仍在运行,因为它要维持隧道并转发数据包。前台程序在做这件事时不会回到提示符。此后没有输出很正常,因为只有发生变化时客户端才会说话。

如果这行出现了,连接却在之后断开,那是另一回事,日志会事后说明。

Ctrl+C 是一个决定,不是修复

按下 Ctrl+C 会发送中断,客户端把它当作关闭请求。提示符回来了,隧道消失了,任何使用它的会话都会结束。这看起来像进展,实际恰好相反。如果目标是持久连接,正确的做法是把进程移到不依赖你终端的地方继续运行,而不是打断它。

调试期间让它留在前台是正确选择,因为之后的错误仍显示在同一个窗口里。安静的一分钟什么也证明不了;与其盯着输出,不如通过隧道测试某个资源。

这条消息证明不了什么

完成只是关于客户端自身配置的本地判断。它并不说明对端是否响应、装上的路由是否满足你的需求,也不说明经隧道解析域名是否可用。拆分隧道配置文件可能已经完美初始化,而公司共享目录仍然打不开,因为路由或 DNS 策略从未覆盖它。服务端实例在准备好接受客户端时也会打印类似的一行,这与某个客户端已经连上是两回事。

「服务器启动了」和「笔记本能打开共享目录」是两个不同位置的观察,把两者混为一谈会让你去排查错误的主机。

不带终端运行

要长期部署,请使用平台支持的服务配置。在 systemd 主机上,就是一个 openvpn-client@office 实例,配置文件放在 /etc/openvpn/client,并启用开机自启。Community OpenVPN 还提供 --daemon,配合 --log 或 --log-append 使用,它会脱离终端并把输出写入文件。两种方式改变的只是进程的运行方式;它们都不会修复路由,也不会让远端应用变正常。

确认你没有在服务已经管理的实例旁边再启动一个。两个客户端争用同一份配置文件,会产生混乱的日志和一条本不该出现的隧道。

按任务选择配置

诊断用前台,需要跨越会话的用服务,没有服务管理器可依靠时用守护进程模式。这三种覆盖了常见情况,每种都有存在的明确理由。随手选错其中一个,正是「关掉窗口之前一直好用」这种反馈的来源。

如果隧道需要长期保留,事后要确认重启后它还会回来,并且日志落在你会去看的地方。初始化那一行也会出现在这些日志里,到那时就不需要有人盯着终端了。

相关文章