因为配置了公网 ip,为了安全,使用 WireGuard 控制访问。

本文参考自:群晖DS220+安装 WireGuard 保姆级教程

本文为《群晖NAS公网访问配置》系列文章的第二篇。全部文章请参考:

群晖NAS公网访问配置(一):配置DDNS
群晖NAS公网访问配置(二):配置WireGurad
群晖NAS公网访问配置(三):配置Nginx访问Docker服务
群晖NAS公网访问配置(四):配置云服务器

安装 WireGuard 套件


开启 SSH

因为 WireGuard 安装后需要通过 SSH 执行相关命令,所以我们需要先开启群晖的 SSH 功能。

在群晖 “终端机和SNMP -> 终端机” 中勾选 启动SSH功能,端口号使用默认即可。然后点击应用即可完成开启。

随后您可以尝试在终端中通过内网或公网ip/域名访问群晖。

如果您还没有公网ip,那么您需要在内网环境下完成后续操作,因为群晖的 QC 是不支持 SSH 访问的。

安装 WireGuard 套件

首先在 “套件中心 -> 设置 -> 套件来源” 中添加 spk7.imnks.com/ 矿神源。随后搜索 WireGuard,找到对应套件后点击安装。

安装完成后我们通过 SSH 访问群晖NAS。

我这里为了方便,首先执行了 sudo su 命令,避免后续权限问题。

SSH 登录群晖 NAS 后,我们执行下面的命令:

# 赋予Wireguard套件权限,在安装群晖套件时,我们在简介处也看到了该命令。
sudo sed -i 's/package/root/g' /var/packages/WireGuard/conf/privilege

至此 WireGuard 套件安装完成。

配置 WireGuard 服务端

依次执行下面的命令进入 WireGuard 配置文件夹:

# 创建相关目录,该目录可能已经存在,无视相关报错即可。
mkdir /etc/wireguard/

# 进入Wireguard文件夹,后续操作都将在该文件夹中进行。
cd /etc/wireguard/

创建公私钥

在该文件夹中,我们需要生成服务端公私钥以及客户端公私钥

#生成服务器端私钥
wg genkey > server_privateKey 

#生成服务器端私钥对应的公钥
wg pubkey < server_privateKey > server_publicKey

# 生成客户端私钥及对应的公钥
wg genkey | tee client_privateKey | wg pubkey > client_publicKey

# 使用 cat 命令查看对应内容。
cat server_privateKey
cat server_publicKey
cat client_privateKey
cat client_publicKey

复制好这些秘钥,后面配置文件时需要用到。

创建服务端配置文件

按照注释,将下面配置中的内容替换为您在上一步中生成的内容。

[Interface]
PrivateKey = serverprivatekey # 替换为服务器私钥
Address = 10.8.0.1/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE
ListenPort = 51820 # 端口默认 51820,也可以自定义
MTU = 1420


[Peer]
PublicKey = clientpublickey # 替换为客户端公钥
AllowedIPs = 10.8.0.2/32

说明:
上述配置文件中的 Address 和 AllowedIPs,前三位需要在同一局域网内对齐。最后一位详见后文 添加新的客户端 一节。

编辑后内容后回到终端,使用 vim 或其他手段在 /etc/wireguard/ 路径下创建 wg0.conf 文件,其内容为上述配置。

启动服务

先回到群晖套件中心,启动 WireGuard 套件。

之前启动了也无所谓,顺序不重要

再回到SSH终端,使用下面的命令加载配置文件:

# 使用 `up` 命令加载 wg0 配置
sudo wg-quick up wg0

# 使用 `down` 命令停止 wg0,当前不执行
# sudo wg-quick down wg0

随后我们使用 wg 命令即可查看当前状态:

说明:
有客户端连接的时候 peer 才会显示 keepalive,此时我们还没有配置客户端连接,能够展示出来对应的配置即可。

最后我们为 wg0 服务添加开机自启动:

sudo wg-autostart enable wg0 # 开启自启动

# sudo wg-autostart disable wg0 # 关闭自启动

备注:群晖的 WireGuard 套件无法通过 systemctl 来配置开启自启动,不知道是 DSM 的问题还是套件的问题,这里没有进一步深究。

路由器设置监听端口号转发

为了更好的理解后面的操作,我们先大致讲一下借助 WireGuard 要做的事情:

我们之前在 群晖NAS配置DDNS 一文中配置了 DDNS,在后面的操作中,我们将借助上面的域名来构建 WireGuard 隧道。等到隧道建立好了之后,我们再借助端口转发,通过隧道走内网服务。

腾讯云上的配置

因为之前我们创建的记录被我们用来建立隧道,所以我们需要新建一条记录来作为 NAS 真正的入口。

所以这里我们新建一条记录,主机记录随你定,注意记录值需要填写为 NAS 在内网中的 IP 地址。

后文我们使用以下域名作为示例:
用于创建 WireGuard 隧道的域名:gwa.baidu.com,记录值为公网 ip(39.156.66.10)
作为 NAS 入口的域名:sana.baidu.com,记录值为 NAS 内网 ip(192.168.47.29)

路由器静态 IP 分配

因为路由器重启会导致 ip 变化,而我们需要 NAS 内网的 IP 值。好在现在大部分路由器都支持 DHCP 静态 IP 分配。

登录路由器后台,根据你的路由器的设置,将群晖对应设备的 IP 添加到 DHCP 静态 IP 列表,使其拥有固定的 IP 值。

通过 NAS 设置端口转发

我这里选择的方案是通过群晖设置端口转发,而不是通过路由器。如果你希望通过路由器进行转发,则可以在路由器后台上进行设置。

先留在路由器管理后台,我们需要开启路由器的 UPnP 功能,这样我们才能使用 NAS 来设置端口转发。

开启路由器的 UPnP 之后,我们回到 NAS,来到 “控制面板 -> 外部访问 -> 路由器配置” 页面,如下图所示:

点击新增按钮,选择 “自定义端口”,点击下一步。

在接下来的步骤中,通讯协议我们选择 UDP,端口设置为 创建服务端配置文件 一节中,ListenPort 的值。

最后点击完成。完成后我们可以回到路由器的 UPnP 页面,刷新看看是否有对应的记录。

配置 WireGuard 客户端

下载客户端

WireGuard 客户端下载参考:WireGuard客户端。Apple 平台均需要国外的 Apple ID。

创建客户端配置文件

安装客户端的间隙,我们先准备好客户端配置文件:

[Interface]
PrivateKey = clientprivatekey # 替换为客户端私钥
Address = 10.8.0.2/32 # 这里需要对应上文 [创建服务端配置文件] 一节中,peer.AllowedIPs 里对应的值 
MTU = 1420

[Peer]
PublicKey = serverpublickey # 替换为服务端公钥
Endpoint = gwa.baidu.com:51820 # 用于创建 WireGuard 隧道的域名,加上上文设置的 ListenPort 端口
AllowedIPs = 10.8.0.1/24, 192.168.47.29/24 # 分别是 [创建服务端配置文件] 一节中,Interface.Address,以及 NAS 内网 IP
PersistentKeepalive = 25

将上述内容保存为 wgnas.conf(文件名随意)。之后我们打开 WireGuard 客户端,选择通过文件创建隧道,选择 wgnas.conf,即可完成配置设置。

至此,您的域名配置应该符合下面的情况:

WireGuard 开启状态 gwa.baidu.com sana.baidu.com
开启 无法访问 能访问 NAS
关闭 无法访问 无法访问

即只有在开着 WireGuard 的前提下,可以通过 sana.baidu.com 访问您的 NAS 服务。

添加新的客户端

上面的步骤里我们只添加了一个客户端,因为同一时间 WireGuard 只能识别一个隧道,如果您有多台设备,或者多人公用同一台 NAS,则需要设置多个 WireGuard 客户端配置,不能多台设备同时使用同一个配置文件。

让我们打开 创建服务端配置文件 中的创建的配置文件。
其中 Peer 的部分代表着每个客户端。当我们需要新增客户端时,服务端需要添加一套新的 Peer 配置。

[Interface]
PrivateKey = serverprivatekey
Address = 10.8.0.1/24
...
ListenPort = 51820
MTU = 1420
# 上述内容保持不变

[Peer]
PublicKey = clientpublickey
AllowedIPs = 10.8.0.2/32

[Peer] # 新的 Peer 配置
PublicKey = clientpublickey01 # 一套新的客户端公钥
AllowedIPs = 10.8.0.3/32 # 注意这里需要修改 ip 地址最后一位,一般+1即可

随后按照 创建客户端配置文件 中的方法,在新的客户端中加载新的配置文件即可。