跳到主要内容

WireGuard 是一种小巧而快速的 VPN 协议,已经集成在 Linux 内核中,所以 Ubuntu 是最容易运行它的系统之一。一个能用的客户端只需要寥寥几条命令和一个很短的文本文件。需要注意的是,一切都靠手动完成,没有可以点击的应用,密钥或地址里错一个字符,就会静默失败。

本文是写给 Ubuntu 用户的实操步骤,前提是你手上有 VPN 服务商提供的 WireGuard 配置,或者有自己搭建的服务器。内容包括安装工具、编写客户端配置、启动并验证隧道、开机自启、正确处理 DNS,以及握手一直不发生时如何找原因。本文不比较各种协议,如需了解请读 WireGuard 与 OpenVPN 对比。如果你是 XPASS 用户,受支持的连接方式是免费的 VPNclient 应用,My Pass 页面会显示适用于你账号的方式,Linux 帮助指南 介绍的就是那条路线。

开始之前需要准备什么

先备齐下面这些东西,避免做到一半中断。

  • 一台 Ubuntu 机器:使用当前版本,并有可以用 sudo 的账户。下面的命令适用于 Ubuntu 22.04 及更新版本,也适用于大多数较新的 Debian 系系统。
  • 一份 WireGuard 配置:来自服务商或你自己的服务器。至少需要服务器公钥、服务器地址和 UDP 端口、分配给你的隧道地址,以及要使用的 DNS 服务器。
  • 你自己的密钥对:在本机生成,私钥绝不能离开这台机器。
  • 可用的基础网络:添加隧道之前先确认普通上网正常,这样以后出现问题才知道是否属于 VPN。

关于你将看到的数字,简单说明一下。隧道地址通常是 RFC 1918 中规定的私有地址段,例如 10.x.x.x。它们只存在于隧道内部,不是你的公网地址。WireGuard 项目官网 记录了设计与密码学细节,白皮书则解释了为什么配置可以这么短。

安装软件包

打开终端,先更新软件包列表,再安装工具。

sudo apt update
sudo apt install wireguard wireguard-tools resolvconf

在当前的 Ubuntu 上,wireguard 会把需要的东西一并装上,模块本身已在内核中。resolvconf 软件包不是必需的,但很有用,因为隧道启动时 wg-quick 会调用它来设置 DNS。如果你已经在用 systemd-resolved(Ubuntu 桌面版默认如此),只有在之后遇到 DNS 错误时才需要安装 resolvconf,我们会在 DNS 一节说明。

确认工具已就绪:

wg --version
wg-quick --help

两条命令都有响应,说明安装完成。此时还没有任何东西在运行,只有启动之后才会出现接口。

生成密钥并编写配置文件

WireGuard 的身份就是密钥对。生成时使用严格的文件掩码,保证只有你能读取私钥。

umask 077
wg genkey | tee ~/privatekey | wg pubkey > ~/publickey
cat ~/publickey

把公钥发给运行服务器的人,或粘贴到服务商要求提供公钥的页面。私钥文件保留在原处,绝不要贴进聊天、工单或公开的代码仓库。

接着创建配置文件。文件名就是接口名,所以 wg0.conf 会得到一个名为 wg0 的接口。

sudo nano /etc/wireguard/wg0.conf

客户端文件大致如下,大写的占位符要换成你自己的值:

[Interface]
PrivateKey = YOUR_PRIVATE_KEY
Address = 10.0.0.2/32
DNS = 10.0.0.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = 203.0.113.10:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

每一行的作用:

  • PrivateKey:你的私钥文件内容。
  • Address:服务器分配给你的隧道地址。
  • DNS:隧道开启期间使用的解析器。
  • PublicKey(在 Peer 下):服务器的公钥,不是你的。
  • Endpoint:服务器地址和 UDP 端口。
  • AllowedIPs:决定哪些流量进入隧道。0.0.0.0/0, ::/0 表示全部流量;范围更窄的列表则只发送这些网络。
  • PersistentKeepalive:每 25 秒发一个小包,让家用路由器保持连接开放。

然后收紧权限,因为文件里有机密:

sudo chmod 600 /etc/wireguard/wg0.conf

启动隧道并检查

用 wg-quick 启动接口:

sudo wg-quick up wg0

它会逐步输出创建接口、分配地址、设置 DNS 和添加路由的过程。接着查看状态:

sudo wg show

输出里要看三件事。

  1. peer 下的 latest handshake 一行:如果显示若干秒之前,说明双方已经通信。
  2. 传输计数器:你上网时它应当增长。如果 received 始终为零而 sent 在增加,说明服务器没有回应。
  3. endpoint 是你预期的那个。

然后验证它确实起作用。用你平时的方法查看自己可见的地址,与启用隧道之前对比,再打开几个网站。更完整的测试清单可见指南 如何检查 VPN 是否正常工作。要停止隧道:

sudo wg-quick down wg0

执行 up 之后马上 ping 一个已知地址,看流量是否通。如果第一个 ping 失败而后面的成功,这是握手的正常耗时,不是故障。

让隧道开机自启

如果希望每次重启后自动恢复连接,启用软件包自带的 systemd 单元:

sudo systemctl enable --now wg-quick@wg0

用 systemctl status wg-quick@wg0 检查状态。@ 后面是你的配置名。以后想改行为,编辑文件后用 sudo systemctl restart wg-quick@wg0 重启即可。

想一想笔记本上是否真的需要常开。如果你经常在不同网络间切换,开机时的隧道可能在 Wi-Fi 就绪之前启动而失败,然后一直等待。在有稳定网线的台式机或服务器上,自启很方便;在笔记本上,许多人更喜欢手动启动,或使用对漫游支持更好的 NetworkManager。

在 Ubuntu 上正确处理 DNS

在 Ubuntu 上,大多数“连上了却什么都加载不出来”的情况都源于 DNS。配置里的 DNS = 一行,会由 wg-quick 通过系统里存在的工具来应用。

情形 会发生什么 该怎么办
已安装 resolvconf wg-quick 通过它设置 DNS 通常无需额外改动
只有 systemd-resolved,没有 resolvconf wg-quick 可能无法设置 DNS 或报错 安装 resolvconf,或用 resolvectl 设置 DNS
自己修改过 /etc/resolv.conf wg-quick 可能覆盖或忽略 先备份文件,用后检查
配置中没有 DNS 行 系统继续使用本地 DNS 想让 DNS 查询跟随隧道,就加上 DNS 行

查看系统实际在用哪些服务器:

resolvectl status

找到隧道接口及其 DNS 服务器。如果原来 Wi-Fi 的解析器对所有域名仍排在首位,你的查询可能绕开了隧道。文章 DNS 泄漏 解释了为什么这很重要以及如何测试。

在桌面版使用 NetworkManager

在 Ubuntu 桌面版上,可以把同一个文件导入 NetworkManager,从网络菜单里管理隧道,很适合经常移动的笔记本。

sudo nmcli connection import type wireguard file /etc/wireguard/wg0.conf
nmcli connection up wg0

之后 NetworkManager 会把隧道当作普通连接,你可以在系统托盘里开关。有两点要注意。第一,不要同时用 wg-quick 和 NetworkManager 运行同一个隧道,它们会争抢接口名。第二,导入文件之后,可以停用 wg-quick 的单元,让只有一个工具来启动它。

排查“握手无响应”

当 wg show 列出了 peer 却没有握手时,请按下面的顺序检查。

  1. 检查 endpoint:地址或端口错误是最常见的问题,请从服务商处重新复制。
  2. 核对密钥:你的公钥必须登记在服务器上;Peer 段里的 PublicKey 必须是服务器的,而不是你自己的。
  3. 检查时钟:运行 timedatectl。时钟偏差太大可能让握手失败。
  4. 测试 UDP 是否可达:有些网络会拦截 UDP 端口。换一个网络(例如手机热点)试试,看握手是否出现。
  5. 看防火墙:Ubuntu 的 UFW 如果启用,默认允许出站,但你之前加的规则可能拦住了它。路由器或公司网络也可能丢弃该流量。
  6. 检查 MTU:如果握手正常但较大的网页卡住,可以在 Interface 下加入 MTU = 1380 并重启隧道。症状仍在时再进一步调低。
  7. 检查隧道地址:两台设备使用同一地址会导致奇怪的故障,每台设备都需要自己的地址。

如果接口一直在但无法上网,先 ping -c 3 10.0.0.1 测隧道网关,再 ping -c 3 1.1.1.1 用数字地址测试,最后用域名测试。这个顺序一分钟内就能分清是路由问题还是 DNS 问题。

安全习惯与限制

  • 保护好私钥:放在只有 root 能读的文件里,安全地备份,一旦怀疑泄露就重新生成密钥对。
  • 一台设备一对密钥:不要把配置复制到第二台设备。
  • 弄清 AllowedIPs 的作用:把全部流量送入隧道会改变整台机器的流量路径;只送部分网络,则其余流量仍在隧道之外。
  • 隧道不是防火墙:WireGuard 加密的是你与服务器之间的流量,它拦不住恶意软件或钓鱼。请读 VPN 无法保护你的哪些方面。
  • 更新很重要:定期运行 sudo apt update && sudo apt upgrade,让内核和工具保持最新。
  • 公平地测速:如果想衡量性能,请按 WireGuard 测速指南 来做,这样得到的数字才有意义。

总结

在 Ubuntu 上配置 WireGuard 客户端只有三步:安装软件包,生成密钥对并写一个简短的配置文件,然后用 wg-quick up 启动。用 wg show 确认有最近的握手,需要开机运行就启用 systemd 单元,并通过 resolvconf 或 systemd-resolved 有意识地处理 DNS。出问题时,常见原因是 endpoint、密钥、时钟、被拦截的 UDP 端口或 MTU 不匹配。

如果你更喜欢用应用而不是命令行,可以看看 价格页面,用免费的 VPNclient 应用搭配预付通行证,无需手动编辑配置文件。

常见问题

哪些 Ubuntu 版本可以运行 WireGuard?

当前的 Ubuntu 版本内核已自带 WireGuard 支持,标准软件源里的 wireguard 软件包会安装命令行工具。较旧版本可能需要额外软件包,开始前请用 lsb_release -a 确认系统版本。

为什么 wg show 能看到 peer 却没有握手记录?

只有在双方交换了第一批数据包之后才会出现握手记录。如果一直没有,请检查 endpoint 的地址和端口、双方的公钥、系统时间,以及防火墙或路由器是否拦截了你与服务器之间的 UDP 端口。

使用 wg-quick 需要 root 权限吗?

需要。创建网络接口和修改路由都要管理员权限,所以请用 sudo 运行 wg-quick。配置文件含有私钥,应只允许 root 读取。

怎样让隧道不再开机自启?

运行 sudo systemctl disable wg-quick@wg0 取消开机自启,用 sudo systemctl stop wg-quick@wg0 立即关闭隧道。把 wg0 换成你自己的配置文件名。

手机和笔记本可以共用同一份配置吗?

不可以。每台设备都应有自己的密钥对和隧道地址。两台设备共用同一身份,会争夺同一个 peer 位置,导致两边的连接都失效。

关于作者

Bob Kanokphon Thongdee,XPASS VPN 创始人

Bob Kanokphon Thongdee

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

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

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

查看通行证

继续阅读

VPN 安全

WireGuard 与 OpenVPN 有什么区别

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

阅读约 9 分钟

VPN 基础

什么是 VPN 协议?

VPN 协议规定了你的设备与 VPN 服务器如何连接并保护流量。本文用通俗的语言讲清楚它的含义和主要取舍。

阅读约 9 分钟

VPN 安全

什么是 VPN 握手?有哪些步骤

握手发生在你点击连接到看到“已连接”图标之间。本文拆解各个阶段、往返次数带来的耗时、旁观者能看到的内容,以及不同类型失败的诊断方法。

阅读约 10 分钟

故障排除

WireGuard 速度测试:应该测哪些指标

吞吐量只是测试 WireGuard 隧道时六项指标之一。本文提供可重复的方法、计算示例,以及会让结果失真的陷阱。

阅读约 10 分钟

VPN 安全

什么是 DNS 泄漏?

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

阅读约 10 分钟