跳转到内容
View in the app

A better way to browse. Learn more.

彼岸论坛

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

[NAS] 分享一个群晖部署 WireGuard, iPhone 用 Loon 连接的实例

发表于

写在前面

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

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/WireGuardEasydocker/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,这是因为容器的网络模式为 bridge10.0.0.0/24 出容器后地址会被 NAT 成 172.16.0.0/12 ,本质上是容器在访问 NAS 的资源。

4. 配置防火墙

网关路由器设置 UDP 51820 端口转发至群晖,群晖防火墙放行 UDP 51820 端口,群晖防火墙无需再对 10.0.0.0/24172.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 = 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 访问,不走隧道。

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:443critical-service.example.com:1234 时,交给 服务器 策略组进一步处理,用来保护关键服务配合 WireGuard 隧道访问; 第二条规则:当访问 file.example.com:5000music.example.com:5001 时,通过传统的 DDNS 访问,不走隧道,需要防火墙放行这两个端口。

5. 取消默认的绕过路由 (bypass-tun) 和绕过代理 (skip-proxy)

在 bypass-tun 和 skip-proxy 中,要删除 example.com192.168.0.0/16192.168.1.0/24,确保这些域名和内网地址通过 Loon 的处理


最后的效果

只要手机的 Loon 一直开启,无论身在何处,都可以访问 wg.example.com:443critical-service.example.com:1234 这两个关键服务,端口在公网不可见,没有 DNS 解析问题; file.example.com:5000music.example.com:5001 这两个非关键服务的端口在公网仍然可见,满足资源共享的需求。

唯一美中不足的是,当手机从内网切到外网时,做不到无缝衔接,需要等待几秒钟才能建立 WireGuard 连接,甚至要手动关闭 Loon 再开启,有无优化的办法?

Featured Replies

No posts to show

创建帐户或登录来提出意见

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.