跳到主要内容

Arch Linux 不会替你选择网络组件,这既是它的魅力,也是它的陷阱。刚装好的系统只有内核、shell 和几乎什么都没有的其余部分,所以 VPN 设置中的每一环都是你自己的决定:用哪个网络管理器、哪个 DNS 解析器、哪个防火墙工具。当有人说 VPN“在 Arch 上不能用”,实际情况往往是这些选择里有两个互相冲突。

本文讲的是 Arch Linux 上的 VPN,使用 WireGuard 搭配 NetworkManager,这也是大多数桌面用户最终选择的组合。先讲关键的选择,再用 pacman 安装,导入配置,处理 DNS,最后介绍让滚动更新的机器不出意外的习惯。示例假设你有来自自己掌控的服务器、雇主或实验室的 WireGuard 配置。如果你是通过 XPASS 通行证使用 VPNclient 桌面应用,请看 Linux 设置指南,那是另一条独立的路径。

为什么 Arch 在 VPN 上与众不同

三个事实决定了其余的一切。

  • 没有可依赖的默认配置。 别的发行版出厂就把 NetworkManager 和解析器接在一起。Arch 上你可能用 NetworkManager、搭配 iwd 的 systemd-networkd、netctl,或者纯粹的 ip 命令。一篇不说明假设哪一种的 VPN 教程,其实是在猜。
  • WireGuard 在内核里。 标准的 linux 和 linux-lts 内核已包含它,不需要编译模块。用户态软件包只多提供 wg 和 wg-quick 两个命令。
  • 系统是滚动更新的。 每次运行 pacman -Syu,内核、NetworkManager 和 systemd 都会前进一步。上周二还正常的隧道,周五可能就碰上了新内核。这不是缺陷,但意味着你需要一套简短的更新后检查流程。

实际的做法是:在复制任何一行配置之前,先花五分钟确认自己的网络组件。

选择并确认你的网络组件

运行下面的只读检查。

systemctl is-active NetworkManager
systemctl is-active systemd-networkd
systemctl is-active systemd-resolved
ls -l /etc/resolv.conf

按下表理解结果。

看到的情况 含义 建议做法
NetworkManager 正在运行 带菜单和 nmcli 的桌面环境 把 WireGuard 文件导入 NetworkManager
systemd-networkd 运行,NetworkManager 未运行 极简或服务器风格 使用 .netdev 与 .network 文件,或用 wg-quick
两者都在运行 它们会争夺接口 选一个,停用另一个
resolv.conf 是指向 stub 文件的链接 systemd-resolved 管理 DNS 把 DNS 写在配置里,NetworkManager 会交给它
resolv.conf 是普通文件 有别的程序在写它 有意识地安装并启用一个解析器

如果有两个网络管理器同时运行,先解决它,再动 VPN。两个程序同时去启动同一块 Wi-Fi 网卡,会造成随机断线,看上去就像 VPN 的问题。

用 pacman 安装软件包

在使用 NetworkManager 的桌面上,需要的软件包很小。

sudo pacman -S wireguard-tools networkmanager
sudo systemctl enable --now NetworkManager

如果想要图形小程序,network-manager-applet 可在许多窗口管理器里提供托盘图标,GNOME 和 KDE 则自带前端。OpenVPN 配置需要的插件是 networkmanager-openvpn,WireGuard 本身不需要插件,因为 NetworkManager 直接支持。

确认内核能运行 WireGuard。

sudo modprobe wireguard
lsmod | grep wireguard

如果在自定义内核上失败,请安装 DKMS 包和对应内核的头文件。在官方内核上会立即成功。请记住,内核更新会替换磁盘上对应的模块;在重启之前,对尚未加载的模块执行 modprobe 可能因找不到文件而失败。内核更新后重启即可解决。

创建或获取配置文件

客户端文件大致如下,所有大写的值都是占位符,请换成你自己的。

[Interface]
PrivateKey = YOUR_PRIVATE_KEY
Address = 10.8.0.2/32
DNS = 10.8.0.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = vpn.example.net:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

把私钥当作密码对待。将文件保存为 wg0.conf,用 chmod 600 wg0.conf 限制权限,绝不要贴到聊天窗口或公开仓库里。如果自己生成密钥,wg genkey | tee private.key | wg pubkey > public.key 会生成一对密钥,服务器管理员只需要公钥。

有两行要特别留意。AllowedIPs = 0.0.0.0/0, ::/0 会把所有 IPv4 和 IPv6 流量都送进隧道;范围更窄的列表(比如一个子网)只送该部分流量,其余保持不变。PersistentKeepalive = 25 用来保持家用路由器上的通路,对位于 NAT 之后的笔记本很重要。

导入 NetworkManager

NetworkManager 可以直接读取标准的 WireGuard 文件。

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

配置会存放在 /etc/NetworkManager/system-connections,之后你可以在托盘菜单里切换,或使用 nmcli connection up 和 down。要让它自动启动,执行 nmcli connection modify wg0 connection.autoconnect yes 即可。当你从一个 Wi-Fi 切换到另一个时,NetworkManager 还会重新应用隧道,这是 wg-quick 自己做不到的。

如果想逐项填写,nm-connection-editor 里有 WireGuard 标签页。关于配置、插件和路由如何配合的整体介绍,请阅读 在 Linux NetworkManager 中添加 VPN。

wg-quick 方案

wg-quick 读取同样的文件,一条命令就能启动接口并设置路由和 DNS。

sudo cp ~/wg0.conf /etc/wireguard/wg0.conf
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

两条路线的选择,可以这样老实地比较。

问题 NetworkManager wg-quick 加 systemd
经常换网络的笔记本 更好,会响应网络变化 需要额外脚本
家里常开的服务器或桌面 可用 简单且可预测
为不懂技术的用户提供托盘开关 有 没有
用 PostUp 之类的钩子加防火墙规则 有限 完整支持
冲突风险 低 如果同时把文件导入 NetworkManager,则风险高

绝不要在启用 wg-quick@wg0 的同时,又把同一个接口导入 NetworkManager。两者都会尝试创建 wg0,你会看到类似“device already exists”的错误。每个接口只能有一个管理者。如果想添加阻止隧道之外流量的防火墙规则,wg-quick 的钩子是常见位置,详见 Linux VPN kill switch 配置 中的谨慎说明。

Arch 上的 DNS:把它明确下来

由于 Arch 默认不带解析器,如果没有程序去读取,配置文件里的 DNS = 行不会产生任何效果。最干净的方案是 systemd-resolved 加上 stub 链接。

sudo systemctl enable --now systemd-resolved
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
resolvectl status

NetworkManager 与 systemd-resolved 搭配时,配置里的 DNS 服务器会登记到隧道链路上,resolvectl status wg0 应该能列出它们。如果你更喜欢 openresolv,wg-quick 会自动使用它,但这时不要同时启用 systemd-resolved。连接后,用 resolvectl query example.org 测试,并看是哪条链路在应答。为什么要这样做,可以回顾 DNS 泄漏是什么;IPv6 方面见 IPv6 泄漏。

路由、MTU 与握手

剩下的问题大多属于三类。

  1. 没有握手。 运行 sudo wg show。如果三十秒后仍没有 “latest handshake”,说明数据包没有到达服务器,或者密钥不匹配。检查 endpoint 地址、公钥和服务器防火墙。VPN 握手一文解释了这些数字的含义。
  2. 有握手但没有流量。 检查 ip route 和 ip rule。当 AllowedIPs 为 0.0.0.0/0 时,NetworkManager 和 wg-quick 都会添加策略路由,避免隧道自身的数据包形成回环。如果你自己加过路由,先删掉再重试。
  3. 大页面卡住而小页面能加载。 这指向 MTU 问题。WireGuard 常用的 1420 适合大多数链路,但额外封装较多的连接可能需要更小的值,例如 1380。在 Interface 部分加入 MTU = 1380 后重试。原因可参见 RFC 1191 关于路径 MTU 发现的说明。

滚动更新的固定流程

每次大规模 pacman -Syu 之后,都建议做下面的检查。

  1. 如果内核或 systemd 有更新,先重启再连接。
  2. 运行 sudo find /etc -name "*.pacnew",合并 NetworkManager 和解析器文件的改动。
  3. 运行 nmcli connection show 确认配置还在,然后启动它。
  4. 用 sudo wg show 检查最近的握手,用 resolvectl status 检查 DNS。
  5. 以上都通过后,再打开泄漏测试。

如果更新让某些东西坏了,journalctl -b -u NetworkManager 是最先该读的日志。可以从 pacman 缓存降级软件包,但读日志通常更快找到解决办法。

常见错误

  • 让 NetworkManager 与 systemd-networkd 同时管理同一个接口。
  • 没安装解析器,却复制了带有 DNS = 行的配置。
  • 让私钥文件对所有用户可读。
  • 开机启用 wg-quick,同时又把同一个文件导入 NetworkManager。
  • 内核更新后忘记重启,然后责怪 WireGuard。
  • AllowedIPs 里只有 IPv4,却以为隧道也保护了 IPv6。

总结

在 Arch 上,VPN 的可靠程度取决于它下面的各项选择。先确认只有一个网络管理器和一个 DNS 解析器在负责,用 pacman 安装 wireguard-tools 和 NetworkManager,导入文件,在信任隧道之前先检查握手和 DNS。养成简短的更新后检查习惯,你就能放心使用滚动发行版,不再被意外打断。

如果你更想用现成的应用搭配预付通行证,可以在下载页面和价格页面了解选项。

常见问题

在 Arch 上使用 WireGuard 需要安装内核模块吗?

使用标准的 linux 或 linux-lts 内核不需要,因为 WireGuard 已经是主线内核的一部分。只需安装 wireguard-tools 软件包,获得 wg 和 wg-quick 命令即可。只有不含该模块的特殊内核才需要 DKMS 包。

在 Arch 上应该用 wg-quick 还是 NetworkManager?

如果你已经用 NetworkManager 管理 Wi-Fi,并希望有菜单开关和换网络后自动重连,就用 NetworkManager。服务器或极简环境更适合 wg-quick 加 systemd。不要对同一个接口同时使用两者。

为什么隧道已经建立但 DNS 解析失败?

Arch 不会替你选择 DNS 管理器。如果配置里有 DNS 行,却没有 systemd-resolved 或 resolvconf 之类的程序去应用它,域名查询仍会使用旧服务器或直接失败。请启用一个解析器,并用 resolvectl 测试。

pacman 更新后通常会坏什么?

更新内核后不重启,可能让正在运行的内核与磁盘上的模块不匹配,pacnew 文件也可能覆盖你调整过的配置。内核更新后请重启,并合并 NetworkManager 和解析器的 pacnew 文件。

可以在 Arch 上使用 VPNclient 应用吗?

VPNclient 为桌面 Linux 提供 .run 安装文件,并以 Ubuntu 为例。它没有为 Arch 打包,所以请自行测试,并参考本站的 Linux 设置指南。本文讨论的是由你自己掌控的配置。

关于作者

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 分钟

设备指南

如何在 Linux 上设置 VPN

分步说明:下载 Linux 版 VPNclient 安装程序,在终端中运行,用 My Pass 上的信息登录并连接。

阅读约 6 分钟

VPN 安全

什么是 VPN 断网保护(Kill Switch)?

Kill Switch 能防止 VPN 断开时设备悄悄改用不受保护的连接。本文介绍它的原理,以及如何检查它是否有效。

阅读约 12 分钟

VPN 安全

IPv6 泄漏与 VPN:实用指南

一份动手指南:两套地址体系为何会造成缺口、怎样测试和解读结果,以及按顺序可以尝试的修复办法。

阅读约 10 分钟

VPN 安全

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

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

阅读约 10 分钟