WireGuard 配置文件使用教程
本页内容
一条 WireGuard 连接就是一个文本文件。真的就这么简单——寥寥几行,写着你的密钥、服务器地址,以及哪些流量要走隧道的规则。拿到这个文件之后,连接 WireGuard VPN 服务器只需要把它交给你所用设备上的 WireGuard 应用。
本指南做两件事。首先,逐行解读一份真实的配置文件,让你明白每项设置的作用,出问题时知道该改哪一行。然后,介绍如何在 Windows、Android、iPhone、macOS、Linux 和路由器上导入这个文件并连接,最后讲解几乎所有 WireGuard 问题背后的那几种情况:握手始终无法完成,以及隧道连上了却打不开任何网页。
.conf 文件里有什么:逐行解读
每份 WireGuard 配置都由同样的两部分组成。[Interface] 描述隧道你这一端;[Peer] 描述你要连接的那台机器。下面是一份完整的客户端配置,其中的机密信息已替换为占位符:
[Interface] PrivateKey = YOUR_PRIVATE_KEY_KEEP_THIS_SECRET Address = 10.7.0.4/32 DNS = 10.7.0.1 [Peer] PublicKey = THE_SERVER_PUBLIC_KEY_FROM_YOUR_PROVIDER Endpoint = 198.51.100.10:51820 AllowedIPs = 0.0.0.0/0, ::/0 PersistentKeepalive = 25
198.51.100.10 是 RFC 5737 保留的文档专用地址——这些内容都连不上任何东西。请使用你自己文件里的值。[Interface] 部分:你这一端
- PrivateKey——这就是你在 VPN 上的身份。谁拿到它,谁就能冒充你。它由 44 个 base64 字符组成,以
=结尾;如果你的长度不对,说明文件在复制过程中被截断了。 - Address——你的设备在隧道内部使用的 IP,而不是你的公网 IP。
/32表示“只有这一个地址”,对客户端来说很正常。 - DNS——隧道开启期间使用的解析服务器。没有这一行,设备会继续向原来的解析服务器查询,既会泄露你在查什么,也常常解析不了隧道另一端的任何地址。
- MTU——可选项,却是最值得了解的一行。大多数文件里没有它,因为默认值就是对的;默认值不对的情况请看故障排查。
[Peer] 部分:服务器那一端
- PublicKey——服务器的公钥。你自己的公钥从不出现在你的文件里,它保存在服务器上。
- Endpoint——数据包发往何处,格式为
host:port。WireGuard 只使用 UDP,51820是惯用端口,并非必须。 - AllowedIPs——哪些目的地走隧道。
0.0.0.0/0, ::/0表示全部流量,这正是隐私 VPN 的用途。范围更窄的列表——比如只包含公司内网网段——只让这部分流量走隧道,其余仍走你平常的连接。这种方式叫作分流隧道(split tunnel),是有意为之的选择,而不是坏掉的全局隧道。 - PersistentKeepalive——每 25 秒发送一个小数据包,让你和服务器之间的 NAT 设备保持回程通道畅通。只要你在 NAT 后面就需要它,而用手机或家庭宽带时你总是在 NAT 后面。
Address 和 DNS 根本不是 WireGuard 的设置——它们是给 wg-quick 这个辅助工具的指令,由它来配置你的网络接口。WireGuard 本身从来看不到这两行。你可以亲眼验证:wg-quick strip wg0 会打印出内核实际收到的配置,这两行直接消失了。如果你改用 wg setconf 而不是 wg-quick 来配置隧道,这一点就很重要,因为那样没有任何东西为你分配地址或解析服务器,隧道启动后什么也连不上。需要一份可导入的配置文件?HytHost VPN 服务为你提供现成的 WireGuard 配置,每月 €0.99 起。
查看 VPN 套餐Windows:导入隧道
Windows 有官方的 WireGuard 应用,把文件导入进去就完成了全部工作。
- 安装 WireGuard,下载地址 wireguard.com/install。
- 点击左下角的 新建隧道,会打开一个筛选为 配置文件 (*.zip, *.conf) 的文件选择框。选中你的
.conf,它就会出现在隧道列表中,名称与文件名相同。 - 也可以直接粘贴。新建隧道 旁边的箭头提供 新建空隧道… (E),会给你一个文本框——配置是通过消息发来而不是文件时很有用。文本框里会预填一个新的私钥,把那一行删掉,再把你自己的配置整段粘贴进去。
- 点击 连接 (A)。状态变为 已连接,面板开始统计传输的字节数。这个字节计数器是最快的自检手段:如果只看到数据发出、没有数据返回,说明握手没有完成。
Android 和 iPhone:扫描二维码或导入文件
在手机上有两种方式,而二维码之所以存在,正是因为在触摸屏上输入 44 个字符的密钥实在太折磨人。
Android
- 从 Play Store 安装 WireGuard,然后点按 + 按钮。
- 创建 WireGuard 隧道 界面提供 扫描二维码、导入配置或压缩包,以及从零创建。根据你拿到的东西选择对应的方式。
- 如有提示,给隧道起个名字,然后打开开关。Android 会询问一次是否允许添加 VPN 配置——这个提示来自操作系统,而不是应用。
iPhone 和 iPad
- 从 App Store 安装 WireGuard,点按 添加隧道。
- 在 新建 WireGuard 隧道 下,选择 扫描二维码 或 导入配置或压缩包。扫描界面的标题是 扫描二维码;扫描成功后会要求你为隧道命名。
- 打开开关,并在 iOS 询问时允许添加 VPN 配置。
用已有的配置文件生成二维码
二维码不一定要由服务商提供——它不过是把你的配置文件画成了一张图,你自己用一条命令就能生成。WireGuard 应用本身就给出了这个建议:
# prints the code straight into the terminal, ready to scan off the screen qrencode -t ansiutf8 < wg0.conf # or write it to an image file qrencode -o wg0.png < wg0.conf
在 Debian 或 Ubuntu 上,用 apt install qrencode 安装 qrencode;在 macOS 上,用 brew install qrencode。
macOS 和 Linux
macOS
从 Mac App Store 安装 WireGuard。Mac 版应用并不是放大了的 iPhone 版:它常驻在菜单栏,主窗口从 管理隧道 打开。点击 从文件导入隧道(菜单栏里也有同样的功能,名为 从文件导入隧道…),选中你的 .conf,然后选中该隧道并点击 启动。Mac 上没有二维码扫描功能——二维码是给手机用的——所以请直接使用文件,或选择 添加空隧道… 后把配置粘贴进去。
如果你更习惯用终端,brew install wireguard-tools 会提供和 Linux 上相同的 wg-quick 命令,下文会介绍。
Linux
- 安装工具。在 Debian 或 Ubuntu 上:
sudo apt install wireguard。大多数发行版都有同名软件包。 - 把文件放到 wg-quick 查找的位置。这是最容易出错的一步,因为文件名会变成接口名:
sudo install -m 600 -o root -g root wg0.conf /etc/wireguard/wg0.conf
600很重要——文件里有你的私钥,不应让这台机器上的其他用户读取。名称要简短简单,它必须是一个合法的网络接口名。 - 启动隧道:
sudo wg-quick up wg0 sudo wg show
wg show是最值得记住的一条命令。它会打印对端、端点、一行 latest handshake 以及流量计数。如果握手时间始终不出现,就是下一节所讲问题的典型特征。 - 开机自动启动:
sudo systemctl enable --now wg-quick@wg0。要手动关闭隧道,运行sudo wg-quick down wg0。
wg-quick: `/etc/wireguard/wg0.conf' does not exist 表示你输入的名称与该目录下的文件不匹配——你要的是 wg0,文件却叫别的名字。另外,如果隧道启动失败并报 resolvconf 相关错误,那是 DNS 这一行的问题:wg-quick 需要系统中有 resolvconf 或 systemd-resolved 才能应用它。安装其中一个,或者删掉 DNS 行、自己设置解析服务器。装在路由器上,全家设备都覆盖
把隧道放到路由器上,就能覆盖它后面的所有设备,包括那些根本装不了 VPN 应用的设备——游戏机、电视、智能音箱。能不能做到,完全取决于你的固件。
| 固件 | WireGuard 支持 | 在哪里设置 |
|---|---|---|
| OpenWrt | 支持,需安装软件包 | 安装 luci-proto-wireguard,然后添加一个协议为 WireGuard VPN 的接口,按你的文件填写各字段 |
| Asus(较新的原厂固件) | 许多型号支持 | VPN 设置中有 WireGuard 客户端,可直接导入 .conf |
| Asuswrt-Merlin | 支持 | 思路相同,路由控制更精细 |
| Mikrotik RouterOS 7 | 支持 | 内置 WireGuard;RouterOS 6 完全没有 |
| 运营商提供的普通路由器 | 通常不支持 | 没有 WireGuard,也无法添加——见下文 |
如果你的路由器就是宽带运营商给的那台,现实的办法是在它后面再接一台你能控制的路由器,或者继续在每台设备上单独配置。两者都不算失败;按设备配置往往反而更好,因为不需要隧道的设备可以不开。
在让全家流量都走隧道之前,有一件事要先想好:那样所有流量都会经过它。不喜欢境外地址的银行网站、会检查地区的流媒体,以及任何需要与你本地网络中设备通信的东西,都可能表现异常。这正是范围更窄的 AllowedIPs 发挥作用的地方——只让需要的流量走隧道,其余保持不变。
能连上但打不开网页,以及其他常见问题
WireGuard 出错时异常安静,这是有意的设计——未经认证的数据包得不到任何回应,扫描器也就无法判断是否有服务在监听。副作用是:密钥错误、端口错误和网络被封锁,在你这一端看起来一模一样——一片沉默。所以要从症状入手。
| 你看到的现象 | 通常的原因 | 检查哪里 |
|---|---|---|
| 始终没有握手;发送字节不断增加,接收一直为零 | 没有任何回应,或回应无法返回 | Endpoint、服务器的 PublicKey、UDP 是否被封锁 |
| 握手正常,小的请求能用,网页加载到一半卡住 | MTU | 在 [Interface] 中添加 MTU 行 |
| 已连接,但什么都解析不了 | DNS | DNS 行,以及 Linux 上的 resolvconf |
| 已连接,也能解析,但流量没有走隧道 | AllowedIPs 范围太窄 | [Peer] 中的 AllowedIPs |
| 能用,但闲置一两分钟后就断了 | NAT 映射过期 | PersistentKeepalive = 25 |
“Handshake did not complete”
你的设备发出了握手发起包,却没有收到任何回应。请按以下顺序检查:
- 端点。主机正确、端口正确,并且端口是 UDP。这里打错一个字,就会恰好出现这个症状,而且只有这个症状。
- UDP 是否能出去。访客 Wi-Fi、酒店网络、部分企业网络以及少数移动运营商,只允许常用端口上的 TCP。如果同一份配置在家里能用、在某个特定网络上不能用,那配置没问题,问题出在网络。
- 密钥没有放反。
[Peer]中的PublicKey是服务器的公钥,而服务器那边必须另外持有与你的PrivateKey对应的公钥。为另一台设备复制来的配置会卡在这里。 - 你的时钟。WireGuard 握手中包含时间戳,偏差太大会被拒绝。这种情况很少见,但在时间丢失的设备上确实会发生。
如果隧道在家里能用、用移动网络却从来连不上,原因可能在你的运营商那边而不在你——运营商级 NAT(CGNAT)之类的安排会改变哪些连接能到达你。端口转发指南讲解了如何在几分钟内通过自己的路由器判断这一点。
MTU 问题:值得彻底弄懂一次
这就是经典的“连上了但网络是坏的”情况,特征非常明显:ping 通、DNS 正常、小网页能打开,而任何稍大的内容都会一直卡住。
原因在于大小。为隧道封装流量会增加头部,原本刚好适合你普通连接的数据包,进入 WireGuard 后就放不下了。小包畅通无阻,大包被丢弃。正常情况下网络会通知发送方改用更小的包,但负责通知的那条消息经常被过滤掉,于是你等不到报错,只能干等。
解决办法是从一开始就让 WireGuard 使用更小的包。wg-quick 已经在尝试这么做:它取你普通路由的 MTU,减去隧道开销的 80 字节,所以在普通的 1500 字节连接上会得到 1420。如果这还是太大——某些移动网络,以及大多数本身已经跑在另一条隧道上的连接——就显式设置并逐步调低:
[Interface] MTU = 1420 # what wg-quick would have picked # still stalling? try 1380, then 1280
1280 是值得尝试的下限,因为这是 IPv6 要求所有链路都必须能承载的最小包大小,几乎在任何路径上都能通过。它会损失一点效率,但远比一条会卡死的隧道好。
隧道已开启,但没有流量经过
先检查 AllowedIPs。它不是防火墙,也不是权限列表——它决定的是哪些目的地会被路由进隧道。如果其中不包含 0.0.0.0/0,那么发往互联网其他地方的流量本来就不走隧道,你的连接正是按配置在运行。在 Linux 上,ip route show table all | grep wg0 可以显示实际路由了哪些内容。
如果路由没问题,只是域名解析不了,那就是 DNS 行的问题——要么缺失,要么写了但因为没装 resolvconf 而没有生效。
配置文件从哪里来
以上内容都假定你已经有了文件。获取文件的方式恰好只有两种。
自己搭建服务器
你生成一对密钥,在一台有公网地址的机器上安装 WireGuard,把你的设备添加为对端,再手动编写客户端配置。这并不难,也确实值得学习。代价是长期的:要为服务器付费并持续打补丁,而且每增加一台设备都要在两端手动修改——别忘了,一个对端就是一台设备。
从服务商获取
另一种方式是由服务商为你生成文件,你只需下载。使用 HytHost VPN(每月 €0.99 起),文件就在这里:
- 订购服务并登录客户中心,然后从列表中打开你的 VPN 服务。
- 找到 WireGuard Configuration 部分。这里有两个按钮——Copy to Clipboard 会把配置文本复制到剪贴板,Download Configuration 则直接给你现成的文件。
- 如果你选择了复制,把它粘贴到纯文本编辑器中,以
.conf扩展名保存——wg0.conf就是个好名字。注意编辑器没有在末尾自动加上.txt。 - 导入文件,按照上文对应你设备的部分操作。在手机上,先用
qrencode把它转成二维码。
同一个页面还会显示隧道当前是否已连接到服务器,在你开始改设置之前,就能回答“是我的问题还是他们的问题”。页面上没有二维码按钮——请自己用文件生成,这也意味着二维码永远不会被传到不该去的地方。
需要一份可导入的配置文件?HytHost VPN 服务为你提供现成的 WireGuard 配置,每月 €0.99 起。
查看 VPN 套餐常见问题解答
安装官方 WireGuard 应用,导入服务器或服务商给你的配置文件,然后打开隧道。在 Windows 上就是点击 新建隧道,再点击 连接 (A);在 Android 和 iPhone 上,你可以把文件当作二维码扫描,而不必导入;在 Linux 上,把文件放到 /etc/wireguard/,然后用它的名称运行 wg-quick up。应用中出现握手时间并有接收数据,就说明连接已建立。
一个纯文本文件,通常以 .conf 结尾,包含两个部分。[Interface] 描述你的设备:它的私钥、在隧道内使用的地址,以及要使用的解析服务器。[Peer] 描述服务器:它的公钥、主机和 UDP 端口,以及哪些目的地应通过隧道路由。这个文件就是整条连接——你的设备上不会在别处保存任何其他东西。
不能稳定使用,原因值得了解。一份配置就是一个对端,由一对密钥标识,而服务器为每个对端只记录一个当前位置。用同一个文件同时连接手机和笔记本电脑,服务器会把回程流量发给最近一次握手的那台设备,于是两边的连接都会时断时续。每台设备都需要自己的配置和自己的一对密钥。
用你已有的配置文件自己生成——WireGuard 二维码就是把这个文件编码成了图片。运行 qrencode -t ansiutf8 < wg0.conf 可以直接在终端里显示并从屏幕上扫描,运行 qrencode -o wg0.png < wg0.conf 则保存为图片。由于二维码包含私钥,应当把它和文件本身同等对待:永远不要公开发布。
不可以。私钥是你的设备在 VPN 上的身份标识,任何拿到文件的人都能以你的身份连接。它永远不应出现在聊天、论坛、问题跟踪系统或工单中,二维码和文件截图也一样。如果配置已经泄露,正确做法是生成新的密钥对并替换对端,而不是指望没人看到。
这条消息表示握手发起包已发出,却没有任何回应,而 WireGuard 无法告诉你原因,因为它从未收到回复。检查 Endpoint 的主机和端口,确认你所在的网络允许出站 UDP,并确认 [Peer] 下的 PublicKey 是服务器的公钥,同时服务器持有与你私钥对应的公钥。如果同一个文件在其他网络上能用,说明文件没问题,是当前网络在过滤 UDP。
这种情况——握手正常、ping 正常、网页卡住——几乎总是 MTU 的问题。流量为隧道封装后,每个数据包都会变大,原本放得下的包会被丢弃,而通常负责报告这一情况的消息又常被过滤。在 [Interface] 中添加一行 MTU:1420 是 wg-quick 在普通连接上会算出的值,如果仍然太大,可以用 1380 或 1280。
只是使用配置文件的话不需要。客户端向服务器发起出站 UDP 连接,回应会沿着这条连接建立的映射返回——PersistentKeepalive 保持打开的正是这条映射。只有运行 WireGuard 服务器、需要接受入站连接的那一方才需要开放端口。
找一家为你生成配置的服务商。HytHost VPN 服务每月 €0.99 起,客户中心里有 WireGuard Configuration 部分,提供复制配置文本的按钮和下载现成文件的按钮。之后即可导入任意设备上的 WireGuard 应用,同一页面还会显示隧道当前是否已连接。
这篇指南对你有帮助吗?