用 sing-box 在群晖 NAS 上搭建家庭内网接入服务

用 sing-box 在群晖 NAS 上搭建家庭内网接入服务

场景:没有公网 IPv4,只有公网 IPv6,通过 Lucky 做端口转发,在群晖 NAS 上用 Docker 部署 sing-box,实现在外网用 Shadowrocket / Clash Meta / Clash Verge 连回家庭内网。


环境说明

项目
NAS 型号 群晖 SA6400
内网 IP 192.168.18.8
公网条件 公网 IPv6,无 IPv4
端口转发工具 Lucky(IPv6 → 内网 IPv4)
容器平台 Docker(Container Manager)
服务域名 gohome.ddns.vanjay.cn
工作目录 /volume3/MyDocker/singbox

方案架构

外网客户端
(Shadowrocket / Clash Meta / Clash Verge)
        │
        │  公网 IPv6 + 各协议端口
        ▼
   Lucky 端口转发
   (IPv6 端口 → 群晖 192.168.18.8)
        │
        ▼
   群晖 Docker
   sing-box 服务端(host 网络模式)
        │
        │  直接路由
        ▼
   家庭内网 192.168.18.0/24

为什么用 sing-box?

  • 单进程支持所有主流协议(VLESS、VMess、Hysteria2、TUIC、AnyTLS)
  • 配置清晰,JSON 格式
  • 主流客户端(Clash Meta、Shadowrocket)全部支持
  • Docker 镜像官方维护,更新及时

协议选型

同时开启五种协议,覆盖所有主流客户端:

协议 特点 传输层
VLESS + XTLS-RPRX-Vision + Reality 无需证书,抗检测最强,首选 TCP
VMess + WebSocket + TLS 兼容性最广,穿透能力强 TCP
Hysteria2 基于 UDP/QUIC,弱网表现好 UDP
TUIC5 + BBR QUIC 协议,低延迟 UDP
AnyTLS 新兴协议,灵活 TCP

端口规划

Lucky 外部监听 IPv6 端口(不能与已有规则重复),转发到群晖内网端口:

协议 Lucky 外部端口 群晖内部端口 协议类型
VLESS + Reality 4537 4437 TCP+UDP
VMess + WS + TLS 8543 8443 TCP+UDP
Hysteria2 8544 8444 TCP+UDP
TUIC5 8545 8445 TCP+UDP
AnyTLS 8546 8446 TCP+UDP

注意:VLESS 用 4437 而不是 443,是因为群晖本身已占用 443 端口。


目录结构

/volume3/MyDocker/singbox/
├── setup.sh                 ← 一键生成脚本
├── docker-compose.yml       ← 由脚本生成
├── client-config.txt        ← 脚本生成的客户端信息摘要
├── config/
│   └── config.json          ← 由脚本生成
├── cert/
│   ├── gohome.ddns.vanjay.cn.pem   ← 自行放入
│   └── gohome.ddns.vanjay.cn.key   ← 自行放入
└── subscribe/               ← 由脚本生成,放到 Web 服务暴露即可订阅
    ├── GoHome.yaml          ← Clash Meta / Clash Verge 订阅
    └── GoHome.conf          ← Shadowrocket 订阅

一键配置脚本

在群晖 SSH 中执行,一次性自动完成:

  • 生成 Reality 密钥对、UUID、随机密码
  • 写入 config.jsondocker-compose.ymlclient-config.txt
  • 生成 **subscribe/GoHome.yaml**(Clash Meta / Clash Verge 订阅)
  • 生成 **subscribe/GoHome.conf**(Shadowrocket 订阅,含完整分流规则)
  • 拉取镜像并启动容器

前置条件:先将 TLS 证书放到 /volume3/MyDocker/singbox/cert/ 目录下。

脚本较长(含 base64 嵌入的 Shadowrocket 规则段),直接下载 setup.sh 使用。

执行方法:

# 1. 先放好证书
mkdir -p /volume3/MyDocker/singbox/cert
# 将证书复制到:
#   /volume3/MyDocker/singbox/cert/gohome.ddns.vanjay.cn.pem
#   /volume3/MyDocker/singbox/cert/gohome.ddns.vanjay.cn.key

# 2. 上传 setup.sh 并执行
chmod +x /volume3/MyDocker/singbox/setup.sh
/volume3/MyDocker/singbox/setup.sh

执行完毕输出:

================================================================
  ✅ 全部完成!

  订阅文件目录: /volume3/MyDocker/singbox/subscribe
  ├── GoHome.yaml  (Clash Meta / Clash Verge)
  └── GoHome.conf  (Shadowrocket)

  将 subscribe/ 目录通过 Web 服务暴露出去即可订阅
  客户端信息详见: /volume3/MyDocker/singbox/client-config.txt
================================================================

Lucky 端口转发配置

在 Lucky 的「端口转发」功能中添加以下五条规则:

规则名 类型 监听端口 目标
GoHome-Vless tcp6/udp6 4537 192.168.18.8:4437
GoHome-VMess-WS-TLS tcp6/udp6 8543 192.168.18.8:8443
GoHome-HY2 tcp6/udp6 8544 192.168.18.8:8444
GoHome-TUIC5 tcp6/udp6 8545 192.168.18.8:8445
GoHome-AnyTLS tcp6/udp6 8546 192.168.18.8:8446

踩坑记录:Lucky 同一实例下端口转发规则的监听端口不能重复,即使协议不同也不行。所以外部端口和内部端口错开了编号(如 4537→4437,8543→8443 等)。


验证服务正常运行

# 查看实时日志
docker compose -f /volume3/MyDocker/singbox/docker-compose.yml logs -f

# 验证 host 网络模式
docker inspect sing-box | grep NetworkMode
# 期望输出: "NetworkMode": "host"

# 验证容器能访问内网
docker exec sing-box ping -c 3 192.168.18.1

正常运行的日志特征:

INFO  inbound/vless[vless-reality-in]: inbound connection from x.x.x.x:xxxxx
INFO  inbound/vless[vless-reality-in]: [0] inbound connection to pancake.apple.com:443
INFO  outbound/direct[direct]: outbound connection to pancake.apple.com:443

network_mode: host 是关键配置,容器直接共享宿主机网络栈,才能访问 192.168.18.0/24 整个内网段。


客户端订阅

脚本执行后,subscribe/ 目录下会生成两个订阅文件,通过 Web 服务暴露后直接填链接订阅即可,无需手动填写节点参数。

暴露方式(群晖 Web Station 或 Nginx):

# Nginx 示例:将 subscribe/ 目录映射到某个路径
location /singbox/ {
    alias /volume3/MyDocker/singbox/subscribe/;
    autoindex off;
}

订阅链接格式:

  • Clash Meta:https://你的域名/singbox/GoHome.yaml
  • Shadowrocket:https://你的域名/singbox/GoHome.conf

Clash Meta / Clash Verge(GoHome.yaml)

proxies:
  - name: "Home-VLESS"
    type: vless
    server: gohome.ddns.vanjay.cn
    port: 4537
    uuid: <UUID_VLESS>
    flow: xtls-rprx-vision
    tls: true
    servername: www.apple.com
    reality-opts:
      public-key: <PublicKey>
      short-id: <ShortID>
    network: tcp
    udp: true

  - name: "Home-VMess"
    type: vmess
    server: gohome.ddns.vanjay.cn
    port: 8543
    uuid: <UUID_VMESS>
    alterId: 0
    cipher: auto
    tls: true
    network: ws
    ws-opts:
      path: /vmess
    udp: true

  - name: "Home-Hysteria2"
    type: hysteria2
    server: gohome.ddns.vanjay.cn
    port: 8544
    password: <PW_HY2>
    udp: true

  - name: "Home-TUIC"
    type: tuic
    server: gohome.ddns.vanjay.cn
    port: 8545
    uuid: <UUID_TUIC>
    password: <PW_TUIC>
    congestion-controller: bbr
    alpn: [h3]
    udp: true

  - name: "Home-AnyTLS"
    type: anytls
    server: gohome.ddns.vanjay.cn
    port: 8546
    password: <PW_ANYTLS>
    udp: true

proxy-groups:
  - name: "🏠 Home"
    type: select
    proxies:
      - Home-VLESS
      - Home-VMess
      - Home-Hysteria2
      - Home-TUIC
      - Home-AnyTLS

rules:
  - IP-CIDR,192.168.18.0/24,🏠 Home,no-resolve
  - MATCH,DIRECT

Shadowrocket(GoHome.conf)

GoHome.conf 是完整的 Shadowrocket 配置文件,包含:

  • 五个 GoHome 节点的 [Proxy]
  • [Proxy Group]🏠 GoHome(五节点可选)+ 🚀 PROXY
  • 完整分流规则,关键改动:
    • 192.168.18.0/24🏠 GoHome(内网走隧道)
    • 其余私有段(10.0.0.0/8 等)仍然 DIRECT
    • 国内域名 DIRECT,被墙域名 PROXY,其余 FINAL PROXY
  • 原有 [URL Rewrite][MITM] 证书完整保留

在 Shadowrocket 中添加订阅链接后,内网 192.168.18.x 会自动走 GoHome 节点,无需手动配置。


常见问题

443 端口被占用

FATAL: listen tcp 0.0.0.0:443: bind: address already in use

群晖 DSM 默认占用 443,VLESS 改用其他端口(本文用 4437)。

Lucky 端口冲突

以下 1 个端口监听失败,请更换端口 [udp:8444]

Lucky 内同实例下监听端口不能重复,外部端口与内部端口错开即可(如 8544→8444)。

流量通了但某些域名超时

ERROR: dial tcp x.x.x.x:443: i/o timeout

这是目标服务器本身网络问题,不影响代理服务正常运行。日志里看到 inbound connection from 就说明连接成功。


关键设计决策总结

  1. **network_mode: host**:容器直接使用宿主机网络,无需额外路由配置即可访问整个内网段。
  2. Reality 协议:VLESS 首选,伪装成正常 TLS 握手,无需证书,抗检测能力强。
  3. 多协议并行:同时开启 5 种协议,适配不同客户端和网络环境,弱网首选 Hysteria2。
  4. 脚本化部署:所有密钥、UUID、密码全部自动生成,避免手动填写出错。
  5. IPv6 + Lucky:无公网 IPv4 也能实现完整的外网接入,Lucky 的端口转发对 IPv6 支持良好。
  6. 订阅文件生成:脚本同时输出 GoHome.yaml(Clash)和 GoHome.conf(Shadowrocket),放到 Web 可访问路径即可订阅,更换密钥后重跑脚本即可更新。GoHome.conf 的 Shadowrocket 规则段以 base64 嵌入脚本,确保 192.168.18.0/24 走 GoHome 而不直连。

部署日期:2026-05-26
服务版本:sing-box latest(ghcr.io/sagernet/sing-box)