# 写在前面

接上一个帖子([https://www.fshex.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. 解决内核版本过低问题

> WireGuard 要求 Linux 内核版本高于 5.6 ,但是群晖不满足这个要求,在 NAS 终端执行 `uname -r` 后看到 `4.4.302+`

办法是安装第三方套件源,套件中心 → 设置  →  添加: 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`,内容如下:
```
services:
  wg-easy:
    environment:
      - LANG=chs
      - WG_HOST=example.com                # NAS 的域名
      - PASSWORD_HASH=$$2y$$10$$hBCoykrB95WSzuV4fafBzOHWKu9sbyVa34GJr8VV5R/pIelfEMYyG                # 哈希后的密码,下面有介绍怎么生成
      - PORT=51821                # WireGuardEasy 的后台管理端口,TCP 协议的
      - WG_PORT=51820                #WireGuardEasy 的连接端口,UDP 协议的,需要映射暴露到外网。
      - WG_DEFAULT_ADDRESS=10.0.0.1
      - WG_ALLOWED_IPS=10.0.0.0/24,192.168.1.0/24
      - WG_PERSISTENT_KEEPALIVE=25
      - UI_TRAFFIC_STATS=true
      - MAX_AGE=30
      - UI_ENABLE_SORT_CLIENTS=true

    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    volumes:
      - /volume1/docker/WireGuardEasy/config:/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
      
    network_mode: "bridge"
```
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`
- 启用 HSTS
- 目的地协议:`HTTP`
- 目的地主机名:`localhost`
- 目的地端口:`51821`
- 如果设置了访问控制文件,且允许远程登后台的话,需要放行 `172.16.0.0/12`,这是因为容器的网络模式为 `bridge`,`10.0.0.0/24` 出容器后地址会被 NAT 成 `172.16.0.0/12` ,本质上是容器在访问 NAS 的资源。

### 4. 配置防火墙

网关路由器设置  UDP `51820` 端口转发至群晖,群晖防火墙放行 UDP `51820` 端口,群晖防火墙无需再对 `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 那条在最顶。
```
ssid:ChinaNet-Home = serfer: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 访问,不走隧道。

### 3. 添加策略组

```
服务器 = ssid,default=NAS_WireGuard,cellular=NAS_WireGuard,"ChinaNet-Home"=DIRECT,url = http://www.gstatic.com/generate_204
```
添加一个名为 `服务器` 的策略组。当手机连入家里的 Wi-Fi:ChinaNet-Home 时,访问 NAS 一律直连,当手机用其他 Wi-Fi 或蜂窝网络时,就走本地节点 `NAS_WireGuard`,隧道访问,url 是测延迟的链接。

### 4. 设置分流规则

```
AND,((OR,((DEST-PORT,1234),(DEST-PORT,443))),(DOMAIN-SUFFIX,example.com)),服务器
AND,((OR,((DEST-PORT,5000),(DEST-PORT,5001))),(DOMAIN-SUFFIX,example.com)),DIRECT
```
设置两个嵌套的分流规则:
第一条规则:当访问 `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 再开启,有无优化的办法?
举报· 229 次点击
登录 注册 站外分享
12 条回复  
Jhma 小成 2024-9-15 23:08:50
有二次认证的 VPN 才比较安全,特别是 PC 上的各类 vpn 配置文件包括 wg 别人拿到也能连接,像这位老兄的二次认证还可以,https://www.bilibili.com/video/BV1YDWpe6EQg
Ja22 小成 2024-9-16 00:05:58
太麻烦了,不如直接挂 ss ,[看我写的]( https://blog.liqiye.com/posts/76168112/)
MYDB 小成 2024-9-16 04:21:33
有公网,应该 nas 上起个 xui docker 更好
SenLief 小成 2024-9-16 10:40:04
用公网的情况下我直接用的是的 socks5
bigshawn 初学 2024-9-16 10:41:14
我是直接 docker 跑 ss ,1 分钟不到就部署完成了。
l4ever 小成 2024-9-16 22:13:48
wg 是 udp ,国内运营商都限速的,特别是跨省 udp 流量。不建议你折腾。
ljsh093 小成 2024-9-16 23:38:57
Wg 不会被限速阻断吗,我的 hk 小鸡半天被断
Jays 小成 2024-9-17 11:32:07
@Autonomous 如何实现的访问 内网其他主机或设备呢?
nt0p 小成 2024-9-17 19:43:20
“WireGuard 要求 Linux 内核版本高于 5.6”,并不对。wg 国内阻断严重。
12下一页
返回顶部