指南
如何在 Linux 上设置 VPN
使用服务商自有软件源中的客户端、利用系统自带工具导入配置文件的替代方案、在 Linux 上比其他平台更容易泄漏的 DNS 细节,以及通过终端进行的检查。本文以 Ubuntu 26.04 LTS 和 NetworkManager 为准。
开始前
本指南不会替你选择服务商
无论使用哪个服务商,下面的每一步都相同,因此这里不会点名任何服务商。选择服务商是另一项工作,应在名录中完成;依据的是已公开的得分,而不是下载页面。
请从服务商自有的软件源安装客户端,并使用服务商自有说明中的签名密钥。不要把论坛或博客中的单行安装命令粘贴到终端中:该命令会以 root 身份运行,而你根本不知道它获取了什么。来自已签名软件源的软件包可以检查;通过管道传给 shell 的脚本则无法检查。
安装客户端
Linux 上有两条路径,而且两者都没有问题。第一条是服务商自有的客户端;它自带 kill switch、服务器选择器和 DNS 处理功能。第二条是使用系统自带工具导入配置文件,本指南末尾的章节会说明这条路径需要付出什么代价。
- 登录服务商的网站,从账户区域打开其 Linux 说明。说明中会列出软件源、密钥和软件包;只按这些内容操作,不要做其他操作。
- 添加软件源及其密钥,然后安装软件包,使用发行版的软件包管理器完成。密钥让软件包管理器能够拒绝被篡改的软件包,因此添加软件源却不添加密钥,就意味着你只能自行信任这个软件源。
- 启用客户端服务,使其在启动时运行。客户端通常由以 root 身份运行的后台守护进程和与之通信的桌面应用组成;守护进程负责隧道,而要让从启动时就应生效的 kill switch 工作,它也必须从启动时运行。
- 登录客户端 — 可以从应用中登录,也可以在命令行中使用账户区域提供的令牌登录 — 并为设备设置一个不会暴露你身份的名称。
- 先不要连接。先打开设置。下面三个设置中,有两个在大多数客户端里默认关闭。
值得检查的三个设置
客户端菜单各不相同,但设置本身没有区别。如果不熟悉名称,术语表中都能找到这三个设置的条目。
Kill switch
隧道断开时阻止所有流量,而不是悄悄让连接退回普通网络。在 Linux 上,它是一组由客户端写入的防火墙规则:除隧道接口和隧道自身的端点外,其他流量全部丢弃。请打开此功能;如果客户端提供始终开启或 lockdown 模式,也应选择该模式,这样规则会从启动时生效,而不只是在已连接时生效。此开关的作用见专门页面。
隧道内的 DNS
即使其他所有流量都在隧道内,域名查询仍可能从隧道外离开设备;在 Linux 上,这种泄漏最常见,因为解析器是一个会动态变化的环节。在 Ubuntu 上,该环节是 systemd-resolved:每个接口都有自己的解析器,而承担 DNS 默认路由的接口会回答所有没有被更具体域名匹配的请求。客户端应通过隧道接口,将这个默认解析器指向服务商的解析器。请将客户端的 DNS 设置为服务商自有的解析器,而不是第三方解析器;如果只有查询被看到,那么看到查询的第二方就多了一方。DNS 泄漏的产生方式见DNS 泄漏页面。
协议
除非出现故障,否则保持现代默认协议不变 — 协议页面列出了哪些协议是当前协议,哪些已经过时。如果客户端提供较旧的选项来解决连接问题,那就是一项需要知情作出的取舍,之后应撤销该选择:名录会标出服务商仍提供的最弱协议,手动选择它就等于为自己选择了这个标记。
确认它确实正常工作
连接后不要直接假定正常,而应进行检查。按以下顺序在终端执行三项检查:
- 你的地址发生了变化。使用
curl请求任意“我的 IP 是什么”服务,或在浏览器中打开此类服务,并确认国家或地区与所选出口位置一致。对公共地址执行ip route get时,应显示隧道接口,而不是 Wi-Fi 或以太网接口。 - 查询位于隧道内。执行
resolvectl status:隧道接口应承载服务商的解析器和 DNS 默认路由;物理接口的解析器应处于未使用状态。在浏览器中进行 DNS 泄漏测试是第二种验证方式;如果结果中出现属于你的互联网服务商的内容,就说明 DNS 设置没有生效。 - Kill switch 确实按说明工作。在下载运行期间,使用
systemctl stop停止客户端服务,或使用ip link set … down将隧道接口关闭,让隧道在未要求客户端执行断开操作的情况下断开。传输应立即停止。如果仍在继续,说明这个开关只是摆设。
更完整的测试清单,以及每项测试能显示和不能显示的内容,见专门指南。
这些检查可以证明什么
+你的流量正通过所选国家或地区的出口服务器离开
+响应你查询的解析器属于服务商,并且位于隧道内
+隧道断开后会彻底中断连接,而不是悄悄退回普通网络
这些检查无法证明什么
−它们无法说明服务商会保留什么 — 这是文档问题,见留存页面
−它们不会让你匿名:你的浏览器和登录状态没有改变,参见VPN 无法保护你的内容
−今天通过测试,不代表下一次软件包更新或下一个内核仍会通过
配置文件路径,以及它的代价
大多数服务商会在账户区域为两种常见协议提供配置文件。WireGuard 文件可以从连接编辑器导入 NetworkManager,也可以使用 nmcli connection import 导入,并且同样可以在 wg-quick 下运行;OpenVPN 文件则通过 OpenVPN 插件以相同方式导入。你会得到隧道、系统自带的接口开关,以及配置文件中由服务商明确写入的其他内容。
你失去的是客户端的其余功能。除非你自行编写防火墙规则,否则没有 kill switch;导入 NetworkManager 的文件如果断开,只会将流量交还给普通网络。没有 DNS 处理功能。只有文件中的 DNS 行会生效,而没有该行的文件就是排查 DNS 问题时首先要考虑的泄漏原因。没有服务器选择器:每个文件对应一个出口位置,更换出口位置就意味着使用另一个文件。请从账户区域生成文件并妥善保密:WireGuard 文件包含私钥,而该私钥就是你向服务商证明身份的凭据。
对于服务器、无显示器设备或客户端不支持的发行版,这条路径很合适。在笔记本电脑上,优先使用客户端;客户端提供的开关正是配置文件无法提供的功能。
无法正常工作时
隧道已建立,但 DNS 仍然发送到我的互联网服务商
这是 Linux 上最典型的泄漏。如果配置文件没有设置 DNS,systemd-resolved 就会继续使用网络分配的解析器,而该解析器位于隧道之外。运行 resolvectl status:隧道接口应列出服务商的解析器,并承载 DNS 默认路由;该路由会用加号标记。
在配置中添加 DNS 行,或在 NetworkManager 中为该连接设置 DNS,然后重新连接。服务商自有客户端会自行设置 DNS,这也是应优先使用客户端的原因之一。
隧道断开时所有功能都停止了,这很烦人
这说明 kill switch 正在发挥作用:隧道断开后,连接会彻底中断,而不是悄悄退回普通网络。请重新连接,不要关闭该开关。
如果它在某个网络上经常断开,而在其他网络上很少断开,可以切换一次协议并尝试更近的出口位置。如果该网络上没有任何协议能够保持连接,那么这个网络正在阻止 VPN 流量,本指南就只能到此为止。
客户端每次都要求输入 sudo 或密码
创建网络接口是需要特权的操作,而没有安装后台服务的客户端必须每次都请求权限。大多数客户端会安装后台服务——一个以 root 身份运行的守护进程,以及一个与之通信的桌面应用——因此反复出现提示,意味着该服务没有运行或没有启用。
使用 systemctl status 和服务商说明中的服务名称进行检查,并启用该服务,使其在启动时运行。
测试页面显示了 IPv6 地址
隧道承载 IPv4,但设备仍有一条位于隧道外的 IPv6 路由,因此任何优先使用 IPv6 的流量都会绕过 VPN。不通过隧道承载 IPv6 的服务商应在接口上禁用 IPv6;较好的客户端会自动完成这项设置。
如果你是通过文件建立连接的,请在 NetworkManager 中为该连接禁用 IPv6,或使用 sysctl 将其关闭,然后再次测试。隧道如果让第二种地址族保持开放,就只是半条隧道。
同样的步骤,不同的设备
其余平台
每个平台都有自己独立的指南,而不是同一页面下的一个标签。步骤从安装程序打开的那一刻起就开始分岔,一篇试图同时回答三个平台的文章,哪一个都答不好。