群晖可以通过 QC、DDNS 这些来达到公网访问服务的目的,但是这几种方式也有弊端,QC 比较慢,有时候基本上没法用,DDNS 需要路由器桥接拨号,折腾起来也比较麻烦,更不用说部分地区可能还不支持。
这时候可以采用一些 VPN 技术来实现目的,如 WireGuard。本文是关于群晖 920+ 在 DSM7.0 系统上面安装 WireGuard 客户端的教程。
搭建固定 IP 的 WireGuard 服务端
WireGuard 没有区分客户端和服务端,但是我们可以在有固定 IP 的设备上面搭建,其他设备的 WireGuard 连接到该该设备,实现互相访问。这里固定 IP 的设备可以考虑云主机。
1. 部署
这里使用开源项目 wg-easy 来快捷部署 WireGuard 并管理连接。可自行参考 wg-easy 项目搭建。地址:https://github.com/WeeJeWel/wg-easy
采用 Docker Compose 部署
docker-compose.yml
version: "3.8"
services:
wg-easy:
environment:
- WG_HOST=你的固定IP或者域名
- PASSWORD=你的密码
- WG_DEFAULT_ADDRESS=10.8.1.x
- WG_DEFAULT_DNS=114.114.114.114
- WG_ALLOWED_IPS=10.8.1.0/24
image: weejewel/wg-easy
container_name: wg-easy
volumes:
- .:/etc/wireguard
ports:
- "51820:51820/udp"
- "51821:51821/tcp"
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
注意
- WG_HOST:你的固定IP或者域名
- PASSWORD:wg-easy 管理面板密码
- WG_DEFAULT_ADDRESS:WireGuard 默认网段,建议和已有的云主机及设备不冲突
- WG_ALLOWED_IPS:和 WG_DEFAULT_ADDRESS 配置有关,同步更新即可
使用 docker-compose up -d
部署服务,防火墙开放对应的端口
2. 使用
访问 IP:51821 打开 wg-easy 管理界面,输入密码
第一次进入 Clients 列表应该为空,这时候点击 New 按钮创建一个 Client,输入名字即创建成功,在列表中找到刚刚创建好的配置,点击右边下载按钮,会下载一份 xxx.conf 的配置文件,将该文件导入到 WireGuard 客户端即可连上。
群晖安装 WireGuard 客户端
WireGuard 官方提供了很多系统的客户端,但是群晖暂时还没有,有开发者打包了对应的安装包,但是 DSM 7.0 中,群晖插件机制有改动,造成无法简单安装使用。
1. 打包群晖安装包
在 Linux Docker 环境下打包,这里可以使用 WSL2。如果你的系统是 DSM7.0 以下,直接访问仓库,安装开发者已打包好的客户端就可以了。
# 克隆客户端仓库
git clone https://github.com/runfalk/synology-wireguard.git
cd synology-wireguard/
# 创建环境
sudo docker build -t synobuild .
# 打包客户端
sudo docker run --rm --privileged --env PACKAGE_ARCH=你的群晖架构 --env DSM_VER=群晖系统版本 -v $(pwd)/artifacts:/result_spk synobuild
注意
- 打包客户端的
PACKAGE_ARCH
:你的群晖处理器架构,可以通过官方网站查询,我的是群晖 920+,也就是geminilake
- 打包客户端的
DSM_VER
:你的群晖系统版本,我这里是 DSM7.0,所以填上 7.0 - 最终群晖 920+ DSM7.0 的打包命令就是
sudo docker run --rm --privileged --env PACKAGE_ARCH=geminilake --env DSM_VER=7.0 -v $(pwd)/artifacts:/result_spk synobuild
- 打包比较慢,耐心等待即可,大约需要 15分钟
打包完成后,我们就可以得到一个 spk 安装包,目录为 synology-wireguard/artifacts/
2. 群晖上面安装 WireGuard
将 WireGuard 的 spk 安装包复制到群晖上面,群晖开启 SSH,连接 SSH 后
# 安装
sudo synopkg install WireGuard.spk
# 执行初始化脚本
sudo /var/packages/WireGuard/scripts/start
将 wg-easy 配置文件复制到群晖目录 /etc/wireguard/
下面,重命名为 wg0.conf
将其中的 DNS 一项删除,如下:
原 conf 文件示例
[Interface]
PrivateKey = 123456789
Address = 10.8.1.2/24
DNS = 114.114.114.114
[Peer]
PublicKey = 123456789
PresharedKey = 123456789
AllowedIPs = 10.8.1.0/24, 10.0.4.0/24
Endpoint = ip:51820
包含 DNS 114.114.114.114,将该行删除。因为群晖缺少对应的功能,如果不删除,会导致连接有问题。
同时添加定期心跳 PersistentKeepalive
,不然偶尔会失联。
修改后的文件示例
[Interface]
PrivateKey = 123456789
Address = 10.8.1.2/24
[Peer]
PublicKey = 123456789
PresharedKey = 123456789
AllowedIPs = 10.8.1.0/24, 10.0.4.0/24
PersistentKeepalive = 25
Endpoint = ip:51820
以上操作完成后,需要启动我们的配置
# 启动
sudo wg-quick up wg0
# 关闭
sudo wg-quick down wg0
查看连接状态
sudo wg show wg0
设置开机启动,群晖上面该命令和 Linux 的有区别,注意区分
# 开启
sudo wg-autostart enable wg0
# 关闭
sudo wg-autostart disable wg0
电脑访问
去 WireGuard 下载对应系统的客户端,在 wg-easy 管理面板新建 Client 并下载配置文件,导入到电脑上面的客户端中,如图
面板中查看群晖 Client 分配的 WireGuard IP,此时即可连接上,方便起见,可以在 hosts 中配置一下解析。