跳到主要内容

OpenVPN 已经存在很多年了,这份资历反而是优点:几乎所有 VPN 服务商和自建方案都能给你一份 OpenVPN 配置,而 Ubuntu 只要装一个软件包就能使用它。这种灵活性的代价,是配置文件里选项繁多,日志里满是陌生的词句,还有几处 Ubuntu 特有的 DNS 细节,让新手容易栽跟头。

本文只处理一件事:拿到一份现成的 .ovpn 配置,如何让它在 Ubuntu 上正确工作。内容包括首次试运行、安全处理凭据、把 OpenVPN 作为服务运行、DNS、桌面版的选项,以及一张把常见日志语句翻译成具体动作的表格。我们不讲 OpenVPN 的内部工作原理,那在文章 OpenVPN 详解 中有介绍,也不与新协议比较,请看 WireGuard 与 OpenVPN 对比。如果你是 XPASS 用户,受支持的方式是免费的 VPNclient 应用,登录信息在 My Pass 页面,详见 Linux 帮助指南;本文的步骤面向手里有自己 OpenVPN 配置的人。

命令行还是桌面:先选路线

Ubuntu 上运行 OpenVPN 主要有两种方式。选好一种就坚持下去,因为混用常常是困惑的来源。

路线 最适合 优点 弱点
终端里的 openvpn 命令 测试、服务器、排障 能看到完整日志,无需额外软件包 DNS 和启动都要自己管
systemd 服务(openvpn-client@名称) 无界面机器、常开隧道 开机启动,失败后重启 某些笔记本上会早于 Wi-Fi 启动
NetworkManager 插件 Ubuntu 桌面版和笔记本 托盘图标,适应漫游,凭据存入密钥环 日志不够详细,需要额外软件包

对大多数人来说,合理的流程是:先用普通命令测试,因为日志能告诉你哪里出了错;能用之后,再根据机器是服务器还是笔记本,转到 systemd 服务或 NetworkManager。

安装 OpenVPN 并读懂你的配置

从标准软件源安装客户端。

sudo apt update
sudo apt install openvpn
openvpn --version

接着,运行之前先看一眼你的 .ovpn 文件。它是纯文本,用编辑器打开即可。通常会看到类似下面的行。

  • client:让 OpenVPN 以客户端而不是服务器身份运行。
  • dev tun:请求一个路由模式的隧道接口。
  • proto udp 或 proto tcp:选择传输方式,文章 OpenVPN 的 UDP 与 TCP 说明了取舍。
  • remote 主机 端口:指明服务器和端口。
  • auth-user-pass:表示会询问用户名和密码。
  • remote-cert-tls server:让客户端检查服务器证书确实是用于服务器的。
  • ca、cert、key 或 tls-auth 块:存放证书和密钥,可能是单独的文件,也可能内嵌在标签之间。
  • verb 3:设置日志详细程度。

不要修改你不理解的内容。改错一行加密算法或证书,握手就会失败。如果想试验,请先备份:cp profile.ovpn profile-test.ovpn。

第一次运行:放在前台

直接运行配置,以便看到它输出的一切。

sudo openvpn --config ~/Downloads/profile.ovpn

如果配置使用了 auth-user-pass,OpenVPN 会先问用户名,再问密码。请小心输入,密码不会回显。观察输出中的这几个节点。

  1. 解析或连接服务器:如果无法解析主机名,问题出在基础网络或 DNS。
  2. TLS 握手:与证书校验相关的行应当不带错误地结束。
  3. 含有 Initialization Sequence Completed 的一行:这是 OpenVPN 表示隧道已建立的方式。
  4. 新增名为 tun0 的接口:用 ip addr show tun0 检查。

运行期间,另开一个终端测试流量。先对某个知名地址执行 ping -c 3,再打开网站。完整的测试流程见 如何检查 VPN 是否正常工作。在第一个终端按 Ctrl+C 即可停止隧道。

安全地保管凭据

每次手输密码很安全但很麻烦,也无法在无人值守时自动启动。常见的替代办法是一个小型凭据文件。

sudo nano /etc/openvpn/client/credentials.txt

第一行写用户名,第二行写密码,然后锁定文件权限。

sudo chown root:root /etc/openvpn/client/credentials.txt
sudo chmod 600 /etc/openvpn/client/credentials.txt

再把配置中的相应行改成 auth-user-pass /etc/openvpn/client/credentials.txt。

要坦率说明其中的取舍:这个文件能防止随手读取,但防不住拥有 root 权限的人或被盗的磁盘。如果机器是多人共用的,或磁盘没有加密,宁可手动输入密码,或者使用由系统密钥环保存密码的桌面路线。不要把密码写进配置文件本身,也不要把任何一个文件提交到代码仓库。一旦怀疑泄露,请立即在账号页面修改 VPN 密码。

把 OpenVPN 作为服务运行

想要自动启动的隧道,Ubuntu 自带 systemd 模板单元。它要求配置放在特定文件夹中,并使用 .conf 扩展名。

sudo cp ~/Downloads/profile.ovpn /etc/openvpn/client/work.conf
sudo systemctl start openvpn-client@work
sudo systemctl status openvpn-client@work

@ 后面的词是去掉 .conf 的文件名。若要开机自启,再加上:

sudo systemctl enable openvpn-client@work

查看运行中服务的日志:

sudo journalctl -u openvpn-client@work -f

有两点提醒。在网络就绪之前启动的服务,在笔记本上可能失败,所以请分别在有 Wi-Fi 和没有 Wi-Fi 时测试重启。另外,如果配置用相对路径引用证书文件,请把这些文件复制到同一文件夹,或改成绝对路径,因为服务并不是从你的主目录运行的。

DNS:让人意外的 Ubuntu 细节

许多服务商会向客户端下发 DNS 服务器。OpenVPN 客户端只是收到这些信息,并不会自己应用。在多数版本使用 systemd-resolved 的 Ubuntu 上,你需要一个辅助脚本。

sudo apt install openvpn-systemd-resolved

然后在配置里加入这几行:

script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .

script-security 2 一行允许 OpenVPN 运行外部脚本。只对你信任的配置启用它,因为它能让配置在你的机器上执行程序。连接之后用下面的命令检查:

resolvectl status

你应当看到隧道接口及配置中的 DNS 服务器。如果原来 Wi-Fi 的 DNS 对所有名称依然排在首位,查询可能会离开隧道。文章 DNS 泄漏 介绍了测试方法。想了解 DNS 的基本作用,Cloudflare 有一篇 通俗的 DNS 说明。

桌面版的 NetworkManager 路线

对于笔记本,桌面插件更友好。

sudo apt install network-manager-openvpn-gnome
sudo nmcli connection import type openvpn file ~/Downloads/profile.ovpn
nmcli connection up profile

导入后,隧道会出现在网络菜单中,NetworkManager 会询问用户名和密码,并可保存到密钥环。它还会替你处理 DNS,省去了整个脚本步骤。如果配置里含有插件不认识的选项,导入可能失败或丢弃这些选项,这时请回到命令行。

读日志:常见错误与对策

日志语句 可能的含义 可以尝试
AUTH_FAILED 用户名或密码错误,或账号已过期 小心重新输入,检查账号,使用 VPN 凭据
TLS handshake failed 或 TLS key negotiation failed 数据包没到服务器,或没有回应 检查网络,换个网络,如配置提供另一种协议可试试
Cannot resolve host address 隧道建立前没有 DNS 测试普通上网,检查配置里的主机名
VERIFY ERROR 或 certificate verify failed 证书不匹配,或时钟错误 检查 timedatectl,重新下载配置
Cannot open TUN/TAP dev 权限不足 使用 sudo
Options error 文件中某行格式有误 看消息里提示的行号
已连接但网页打不开 DNS 或路由 见 DNS 一节,用数字地址测试
不断重启 网络掉线或 keepalive 超时 换更稳定的网络,查看日志时间戳

也要留意日志里的时间。如果系统时钟偏差很大,依赖时间的证书和握手就会失败。如果连通之后速度不理想,指南 OpenVPN 性能调优 说明了哪些值得调整,哪些不必动。

良好习惯、限制与安全默认值

  • 信任配置的来源。 配置可以运行脚本并设置路由。只使用来自你信任的服务商或管理员的文件,不要从随便的论坛下载。
  • 保持默认的加密算法和协议设置,除非客服要求你改。
  • 不要同时运行两个 VPN。 两条隧道会争抢路由和 DNS。
  • 清楚自己防的是什么。 OpenVPN 加密的是通往 VPN 服务器的路径,拦不住钓鱼、恶意软件或账号被盗,参见 VPN 无法保护你的哪些方面。
  • 大更新后重启。 内核和库的更新有时需要重启,隧道才会正常。
  • 清理旧配置。 不再使用某家服务商时,把 /etc/openvpn/client/ 里的旧配置和凭据文件一并删除。

总结

在 Ubuntu 上使用 OpenVPN:安装软件包,检查 .ovpn 配置,先在前台运行一次以便读日志。凭据只保存在 root 所有、权限严格的文件里,或者手动输入。后台服务用 openvpn-client@名称,笔记本用 NetworkManager 插件,需要处理 DNS 时加入 systemd-resolved 辅助脚本。出现故障时,日志语句会告诉你该检查哪一层。

如果你更想用现成的应用而不是修改配置,价格页面 列出了可搭配免费 VPNclient 应用使用的预付通行证。

常见问题

.ovpn 文件是什么,从哪里获得?

它是一个纯文本配置文件,告诉 OpenVPN 客户端要连接哪台服务器、使用什么协议和端口、信任哪些证书。由 VPN 服务商或你自己服务器的管理员提供。因为其中可能含有密钥,应当视为敏感文件。

为什么 OpenVPN 提示 AUTH_FAILED?

服务器拒绝了用户名或密码。请检查是否输错或多了空格,确认账号有效且未过期,并且使用的是 VPN 凭据而不是网站登录密码。

在 Ubuntu 上怎样让 OpenVPN 在后台运行?

把配置文件复制到 /etc/openvpn/client/,扩展名改为 .conf,然后运行 sudo systemctl start openvpn-client@名称,其中名称是去掉扩展名的文件名。用 enable 让它开机启动。

OpenVPN 显示 Initialization Sequence Completed,为什么网页还是打不开?

隧道已建立,但 DNS 或路由有问题。用 resolvectl status 查看系统在用哪些 DNS 服务器;如果配置会下发 DNS 服务器,就添加 DNS 更新脚本;再用数字地址测试,区分是路由问题还是域名解析问题。

把密码放在文本文件里安全吗?

这是一种取舍。密码文件免去了输入,所以连接可以自动启动,但任何能读这个文件的人都能看到密码。请把它放在 root 所有、权限为 600 的文件里,或者每次手动输入。

关于作者

Bob Kanokphon Thongdee,XPASS VPN 创始人

Bob Kanokphon Thongdee

  • XPASS VPN 创始人
  • eSIMonline.asia 联合创始人
  • 7 年以上网络营销经验
  • Cojourney Visa 与 Cojourney Travel 创始人

短途出行或忙碌的一个月,需要 VPN?

XPASS 提供按天数计算的预付通行证。一次付款,不会自动续费。

查看通行证

继续阅读

VPN 安全

OpenVPN 详解:TCP、UDP 与安全性

OpenVPN 如何建立隧道、TCP 与 UDP 为何手感不同、怎样的配置才算安全,以及连接失败时如何一步步排查。

阅读约 9 分钟

VPN 安全

OpenVPN 的 TCP 与 UDP 有什么区别?

OpenVPN 可以通过 UDP 或 TCP 传输隧道数据。本文说明两者的区别、默认用 UDP 的原因、什么时候该用 TCP,以及怎样自己动手测试。

阅读约 9 分钟

故障排除

OpenVPN 性能调优入门

OpenVPN 变慢多数只源于少数几个原因。本文讲解传输方式、MTU、加密算法、缓冲区与保活,并教你一次只调整一项。

阅读约 10 分钟

VPN 安全

WireGuard 与 OpenVPN 有什么区别

WireGuard 和 OpenVPN 都能建立加密隧道,但设计、复杂度和灵活性不同。本文用通俗的方式比较,并说明该怎样选择。

阅读约 9 分钟

VPN 安全

什么是 DNS 泄漏?

DNS 泄漏是指设备在 VPN 隧道之外查询网站地址。本文说明它为什么发生、如何检测,以及该怎么处理。

阅读约 10 分钟