如何将 WireGuard 隧道作为 systemd 服务启动
wg-quick@ 模板会拉起具名配置并安装路由、DNS 与钩子。请校验该单元、只保留一个管理者,并测试拆除。
你在 /etc/wireguard/wg0.conf 有一个 WireGuard 配置,希望每次重启后无需手动敲 wg-quick up 就能把它拉起来。随包提供的 systemd 模板正是这么做的:[email protected] 会为名为 wg0 的配置运行 wg-quick。它还会安装地址、路由、DNS 以及配置声明的任何钩子,这比只把密钥加载进内核要多。在假定模板存在之前,请先确认你的系统里确实有它。
本教程的其余部分按照你实际操作的顺序展开。
找到单元以及它读取的配置
用 systemctl list-unit-files 'wg-quick*' 列出单元文件。在打包它的发行版上你会看到 [email protected],实例名取自配置。实例解析为 /etc/wireguard/<name>.conf,因此 wg-quick@wg0 只读取 wg0.conf,不读别的。如果列表为空,说明工具包没有安装,再怎么启用也无济于事。
把配置保持为 600 模式并归 root 所有。它含有私钥,而你若放手不管,单元会心安理得地以更差的权限运行。
拉起并读取日志
用 systemctl start wg-quick@wg0 启动实例,然后检查 systemctl status wg-quick@wg0 与 journalctl -u wg-quick@wg0 -b。启动后立刻退出的单元通常是配置有错,日志会指明那一行。用 wg show 确认接口存在、最近一次握手是新的。wg-quick 手册 列出了脚本在接口之外还做了什么。
配置好的接口却没有握手,是路径或密钥问题,不是服务问题。
只留一个管理者
如果 NetworkManager 或其他客户端已经占用该隧道,启动 systemd 单元会为同一接口、路由和 DNS 造出第二个主人。症状令人困惑:隧道起来了,随后路由消失,或者几秒后 DNS 又翻回去。选一个管理者,并为该配置禁用另一个。日志通常在单元报告成功之后,立刻把这次接管显示为路由或解析器的变更。
两个管理者并不共享所有权。它们互相覆盖。
测试停止、重启与开机
运行 systemctl stop wg-quick@wg0,确认接口消失、路由被移除。然后再启动它,确认路由回来,因为拆除的缺陷表现为残留路由,而不是启动失败。最后用 systemctl enable --now wg-quick@wg0 在开机时启用,并重启一次。
开机时,端点名称必须在单元运行之前解析完成。如果 DNS 还没起来,单元就会失败,并且一直失败,直到你手动启动它。
记录主人
写下单元读取哪个配置、哪个管理者拥有这个接口,以及文件从哪来。日后有人把同一条隧道导入桌面客户端时,这份记录决定了那是一次迁移,还是两个部署在争同一个地址。也把接口名记下来,因为两个名字相近的配置正是混淆的常见来源。
有两个主人的隧道能撑到第一次重启,之后就成谜。所以这份记录该进仓库,而不是留在聊天串里。