用 Loon 添加本地节点,扫码添加,名称为 NAS_WireGuard,删除默认添加的 1.1.1.1 DNS 。
2. 设置 DNS 映射
因为本人有强迫症,不喜欢浏览器提示 HTTP 不安全,所以一律通过域名访问内网资源,消除安全警告,所以就需要配置本地 DNS ,这里使用 Loon 的 DNS 映射功能。
DNS 映射规则有顺序,从上到下匹配,要确保 ssid 那条在最顶。
ssid:ChinaNet-Home = server:192.168.1.1 # 当手机连入家里的 Wi-Fi:ChinaNet-Home 时,将 DNS 服务器设为路由器的 IP ,由路由器负责把 `example.com` 解析到 NAS 的内网 IP
critical-service.example.com = 192.168.1.2 # 将 critical-service 服务的主机名指向 NAS 的内网 IP
wg.example.com = 192.168.1.2 ## 将 WireGuard 管理后台的主机名指向 NAS 的内网 IP
第一条映射规则的作用是,当手机在家时,把 NAS 的域名解析到内网 IP ;
后面的规则作用是,当手机不在家时,将几个关键服务的主机名解析到内网 IP ,配合 WireGuard 隧道访问;
当手机不在家时,非关键服务的主机名还是通过云服务商解析,通过传统的 DDNS 访问,不走隧道。
写在前面
接上一个帖子([https://www.v2ex.com/t/1073068]),请教了大家如何减少暴漏 NAS 的端口,建议比较多的是使用 WireGuard ,遂尝试部署了下,踩了好多坑,终于调通,跟大家分享一下经历
我的设备情况:
NAS:群晖 1821+ ,DSM 7.2.1-69057 Update 5 ,内网 IP 是
192.168.1.2
; WireGuard 服务端:wg-easy/wg-easy v14.0.0 ; 手机:iPhone 15 ,iOS 17.6 (21G80); WireGuard 客户端:Loon 3.2.2 (749); 有动态公网 IPv4 地址,有一个域名example.com
,通过 DDNS 把公网 IPv4 地址绑定到云服务商,NAS 上安装了泛域名证书。在这个实例中,域名、端口号、密码等均为虚构,请根据你的需要修改。
一、在 NAS 安装部署 WireGuard
1. 解决内核版本过低问题
办法是安装第三方套件源,套件中心 → 设置 → 添加: https://spk7.imnks.com/
进入社群,搜索 WireGuard 下载,在 NAS 终端执行
sudo sed -i 's/package/root/g' /var/packages/WireGuard/conf/privilege
修复权限问题。2. 通过 Container Manager 构建 WireGuardEasy
2.1. 新建目录
docker/WireGuardEasy
,docker/WireGuardEasy/config
; 2.2. 新建 compose.yml 文件,上传到docker/WireGuardEasy
,内容如下:2.2. 用 Container Manager 构建项目; 2.3. 修改后台密码:在 NAS 终端执行
docker run -it ghcr.io/wg-easy/wg-easy wgpw YOUR_PASSWORD
,得到PASSWORD_HASH='$2a$12$ptdssPxwS2vKlXCPcYP3juENfkuhJPGamBQM7utsUJ8Gv7LP8tjm6'
将单引号去除,在每一个$
前再添加一个$
,加工成$$2a$$12$$ptdssPxwS2vKlXCPcYP3juENfkuhJPGamBQM7utsUJ8Gv7LP8tjm6
填入compose.yml
文件的环境变量PASSWORD_HASH
中,清除项目,再构建项目。3. 对后台管理界面配置反向代理
因为本人有强迫症,不喜欢浏览器提示 HTTP 不安全,所以都会给后台管理界面套一个 HTTPS 反代,通过域名访问,消除安全警告。
WireGuardEasy
HTTPS
wg.example.com
443
HTTP
localhost
51821
172.16.0.0/12
,这是因为容器的网络模式为bridge
,10.0.0.0/24
出容器后地址会被 NAT 成172.16.0.0/12
,本质上是容器在访问 NAS 的资源。4. 配置防火墙
网关路由器设置 UDP
51820
端口转发至群晖,群晖防火墙放行 UDP51820
端口,群晖防火墙无需再对10.0.0.0/24
,172.16.0.0/12
的来源地址放行,因为容器已经在防火墙之后了。5. 后台管理
5.1. 访问
https://wg.example.com
,密码YOUR_PASSWORD
,进入管理后台; 5.2. 新建客户端,重要!!把 IP 改为10.0.0.2
,不得占用10.0.0.1
; 5.3. 显示二维码,让手机扫码。二、在手机连接 WireGuard
我使用的是 Loon ,这是一款功能强大的网络代理工具,通过策略组、分流规则、Wi-Fi 规则可以实现内外网无缝切换,日常使用基本无感。
1. 添加本地节点
用 Loon 添加本地节点,扫码添加,名称为
NAS_WireGuard
,删除默认添加的1.1.1.1
DNS 。2. 设置 DNS 映射
因为本人有强迫症,不喜欢浏览器提示 HTTP 不安全,所以一律通过域名访问内网资源,消除安全警告,所以就需要配置本地 DNS ,这里使用 Loon 的 DNS 映射功能。
DNS 映射规则有顺序,从上到下匹配,要确保 ssid 那条在最顶。
第一条映射规则的作用是,当手机在家时,把 NAS 的域名解析到内网 IP ; 后面的规则作用是,当手机不在家时,将几个关键服务的主机名解析到内网 IP ,配合 WireGuard 隧道访问; 当手机不在家时,非关键服务的主机名还是通过云服务商解析,通过传统的 DDNS 访问,不走隧道。
3. 添加策略组
添加一个名为
服务器
的策略组。当手机连入家里的 Wi-Fi:ChinaNet-Home 时,访问 NAS 一律直连,当手机用其他 Wi-Fi 或蜂窝网络时,就走本地节点NAS_WireGuard
,隧道访问,url 是测延迟的链接。4. 设置分流规则
设置两个嵌套的分流规则: 第一条规则:当访问
wg.example.com:443
,critical-service.example.com:1234
时,交给服务器
策略组进一步处理,用来保护关键服务配合 WireGuard 隧道访问; 第二条规则:当访问file.example.com:5000
,music.example.com:5001
时,通过传统的 DDNS 访问,不走隧道,需要防火墙放行这两个端口。5. 取消默认的绕过路由 (bypass-tun) 和绕过代理 (skip-proxy)
在 bypass-tun 和 skip-proxy 中,要删除
example.com
,192.168.0.0/16
,192.168.1.0/24
,确保这些域名和内网地址通过 Loon 的处理最后的效果
只要手机的 Loon 一直开启,无论身在何处,都可以访问
wg.example.com:443
,critical-service.example.com:1234
这两个关键服务,端口在公网不可见,没有 DNS 解析问题;file.example.com:5000
,music.example.com:5001
这两个非关键服务的端口在公网仍然可见,满足资源共享的需求。唯一美中不足的是,当手机从内网切到外网时,做不到无缝衔接,需要等待几秒钟才能建立 WireGuard 连接,甚至要手动关闭 Loon 再开启,有无优化的办法?