Post

NAS 公网访问完整操作手册(移动家宽 + IPv6 + 非标端口)

NAS 公网访问完整操作手册(移动家宽 + IPv6 + 非标端口) 本文是一份从零搭建的实操手册,按阶段顺序排列:路由配置 → 域名/凭据 → 证书 → 反代 → DDNS → 测试 → 排错。 方案原理与约束见 mobile-broadband-nas-guide.md;备案 + 国内 CDN

nas 阅读 21 点赞 0 评论 0

NAS 公网访问完整操作手册(移动家宽 + IPv6 + 非标端口)

本文是一份从零搭建的实操手册,按阶段顺序排列:路由配置 → 域名/凭据 → 证书 → 反代 → DDNS → 测试 → 排错。
方案原理与约束见 mobile-broadband-nas-guide.md;备案 + 国内 CDN 去端口细则见 cdn-nas-setup-guide.md
文档中所有真实域名/ IP / 密码已脱敏,部署时把占位符替换成你自己的值即可:

  • yourdomain.asia = 你的域名(用 .asia 则无法备案,详见进阶章)
  • <NAS内网IP> = NAS 在局域网内的 IPv4(如 192.168.0.201
  • <路由器管理IP> = 路由器后台地址(如 192.168.0.1
  • <NAS SSH 密码> = NAS 的 root 密码

阶段 0:方案总览与前置认知

最终架构

   手机/电脑流量 ──▶ 移动家宽公网 IPv6 :8888 (非标端口,家宽放行)
                                │
                        NAS <NAS内网IP>
                  ┌─────────────┴──────────────┐
                  │  Caddy (host 网络, 双端口)  │
                  │   :443 局域网/排查用        │
                  │   :8888 外网入口            │
                  │   :80  HTTP→HTTPS 重定向    │
                  └─────────────┬──────────────┘
                  反代 → 1panel/alist/jellyfin/...

必须接受的两个现实(移动家宽)

  1. 80 / 443 入站被封 → 外网访问必须带非标端口(本文用 :8888)。
  2. IPv6 前缀会翻转 → DDNS 必须「动态跟随当前出网源」,不能写死地址。

任何一步卡住,先跳到「阶段 7 排错」,多数问题能在那里定位。


阶段 1:家庭路由配置(前置,决定 NAS 能否拿到公网 IPv6)

NAS 要能被外网访问,前提是它在局域网里拿到的是公网 IPv6 地址(形如 2409:...),而不是路由器下发的私有 IPv6(ULA,fd00::/8)。这一步在路由器上配置。

1.1 确认拓扑与角色

典型家庭拓扑(以本文实测环境为例):

设备角色地址
光猫(ONT)路由模式(运营商下发),上联运营商管理 192.168.1.1
路由器(TP-LINK 等)NAT/DHCP,下挂局域网设备WAN 192.168.1.3,LAN 管理 <路由器管理IP>(如 192.168.0.1
NAS被访问的目标接路由器 LAN,内网 IP <NAS内网IP>

若你家是「光猫桥接 + 路由器拨号」结构,IPv6 配置在拨号的路由器上做,逻辑相同。

1.2 光猫(一般不动)

  • 保持路由模式,确认光猫 LAN 侧已开启 IPv6 下发(运营商默认开,移动家宽会给 PD 前缀)。
  • 光猫给二级路由的 WAN 分配 IPv6 前缀即可,无需额外操作。

1.3 二级路由器 IPv6 关键配置(最关键)

登录 <路由器管理IP> 后台,找到 IPv6 设置(不同品牌路径不同,TP-LINK 在「网络设置 → IPv6 设置」):

  1. 启用 IPv6 = 开启。
  2. WAN 侧 / 上网方式:选 「自动获取」/「Native」/「DHCPv6」「桥模式(Bridge)」,让路由器从光猫拿到运营商 PD 前缀。
    • ❌ 不要选「NAT6 / IPv6 转发」这类会把 LAN 设备 IPv6 再做一层 NAT 的模式——那会导致 NAS 拿到的是路由器私有前缀,外网进不来。
    • ✅ 目标是:LAN 下的 NAS 直接获得 2409: 开头的公网 IPv6。
  3. LAN 侧 IPv6 分配:开启 SLAAC / DHCPv6,让下挂设备自动获得前缀下的地址。
  4. IPv6 防火墙:确认没有手动封掉 8888 等端口(家用路由器默认对入站较宽松;少数品牌默认全阻断,需要放行 TCP 8888 入站,或依赖「全锥」模式)。
  5. 保存并重启路由器使 IPv6 生效。

1.4 (可选)固定 NAS 局域网 IPv4

虽然 NAS 公网 IPv6 是动态的(靠 DDNS 解决),但固定局域网 IPv4 方便管理:

  • 路由器后台 → DHCP 静态分配 / 地址保留 → 把 NAS 的 MAC 绑定到 <NAS内网IP>
  • 这一步非必须(Caddy 反代用的是 127.0.0.1 本地环回,DDNS 用公网 IPv6),但固定后访问 NAS 内网地址更稳定。

1.5 验证 NAS 拿到公网 IPv6

SSH 登录 NAS,执行:

ip -6 addr show | grep -E "inet6 2409|inet6 (2[0-9a-f])" | grep -v temporary

应看到形如 inet6 2409:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global 的地址(scope global、非 fd00 开头)。
再确认能出公网:

curl -6 -s https://myip.ipip.net     # 应返回你的公网 IPv6

✅ 能看到 2409: 公网地址且 curl 通 → 路由配置成功,进入阶段 2。
❌ 只看到 fe80::(链路本地)或 fd00::(私有 ULA)→ 回到 1.3 检查 IPv6 模式。


阶段 2:域名与 DNSPod 凭据

2.1 域名

  • 已有域名(如 yourdomain.asia)→ 直接进 2.2。
  • 想未来去掉端口 + 国内速度 → 注册可备案后缀.com / .cn),.asia 无法 ICP 备案(详见阶段 8)。

2.2 把域名托管到 DNSPod(腾讯云)

  1. 腾讯云控制台 → 「域名注册 / DNS 解析 DNSPod」→ 将域名 NS 改为 DNSPod(或注册时直接选 DNSPod)。
  2. 拿到 SecretIdSecretKey(控制台 → 「访问管理 → API 密钥」)。

2.3 在 NAS 保存凭据

SSH 登录 NAS,创建凭据文件:

mkdir -p /opt/nas-ddns
cat > /opt/nas-ddns/config.env <<'EOF'
SecretId=你的SecretId
SecretKey=你的SecretKey
Domain=yourdomain.asia
Subdomains=@,*
EOF
chmod 600 /opt/nas-ddns/config.env

这个文件后续 DDNS 和证书续期都会复用,权限设为 600 防止泄露。


阶段 3:NAS 证书(acme.sh + DNS-01)

用 DNS 验证签发证书,不依赖被封的 80 端口

3.1 安装 acme.sh

curl https://get.acme.sh | sh
source ~/.profile

3.2 配置腾讯云 DNS 凭据

export Tencent_SecretId="你的SecretId"
export Tencent_SecretKey="你的SecretKey"

3.3 签发通配符证书

acme.sh --issue --dns dns_tencent \
  -d yourdomain.asia -d '*.yourdomain.asia'

签发后证书在 ~/.acme.sh/yourdomain.asia_ecc/

3.4 部署到 Caddy 挂载目录 + 续期钩子

acme.sh --install-cert -d yourdomain.asia \
  --cert-file      /opt/nas-caddy/certs/fullchain.cer \
  --key-file       /opt/nas-caddy/certs/yourdomain.asia.key \
  --reloadcmd     "/opt/nas-ddns/renew_caddy.sh"

/opt/nas-ddns/renew_caddy.sh 内容(续期后自动重启 Caddy 重载证书):

#!/bin/bash
chmod 644 /opt/nas-caddy/certs/fullchain.cer /opt/nas-caddy/certs/yourdomain.asia.key
docker restart nas-caddy
chmod +x /opt/nas-ddns/renew_caddy.sh

证书有效期 90 天,acme.sh 的 cron(默认每日检查)会自动续期并触发上面的钩子。


阶段 4:Caddy 反向代理

4.1 部署 Caddy 容器(host 网络)

docker run -d --name nas-caddy --network host --restart unless-stopped \
  -v /opt/nas-caddy/Caddyfile:/etc/caddy/Caddyfile \
  -v /opt/nas-caddy/certs:/certs \
  caddy:2

⚠️ 用 host 网络 才能让 Caddy 直接监听宿主机双栈端口(含 IPv6)。
⚠️ Caddyfile 是只读 bind 挂载,改文件后必须 docker restart nas-caddy 才能重绑(reload 不生效)。

4.2 编写 Caddyfile(双端口并存)

/opt/nas-caddy/Caddyfile

{
    email you@example.com
}

# 根域 + 各子域,同时挂 443 和 :8888
yourdomain.asia, www.yourdomain.asia, yourdomain.asia:8888, www.yourdomain.asia:8888 {
    tls /certs/fullchain.cer /certs/yourdomain.asia.key
    reverse_proxy 127.0.0.1:8090
}

nas.yourdomain.asia, nas.yourdomain.asia:8888 {
    tls /certs/fullchain.cer /certs/yourdomain.asia.key
    reverse_proxy 127.0.0.1:8080
}

alist.yourdomain.asia, alist.yourdomain.asia:8888 {
    tls /certs/fullchain.cer /certs/yourdomain.asia.key
    reverse_proxy 127.0.0.1:5244
}

media.yourdomain.asia, media.yourdomain.asia:8888 {
    tls /certs/fullchain.cer /certs/yourdomain.asia.key
    reverse_proxy 127.0.0.1:8096
}

# ... 其他子域按相同格式追加
  • 每个站点同时写 域名域名:8888 → 443 和 8888 都提供 HTTPS。
  • reverse_proxy 后面填对应本地服务端口(1panel=8080、alist=5244、jellyfin=8096…按你实际填)。

4.3 启动并验证监听

docker restart nas-caddy
sleep 4
ss -tlnp | grep -E ":80 |:443 |:8888"
# 应看到 :80 :443 :8888 三条监听

4.4 本地 HTTPS 验证(NAS 上)

IP=$(curl -6 -s https://api6.ipify.org)
curl -6 -k -s -o /dev/null -w "%{http_code}\n" --resolve "nas.yourdomain.asia:8888:[$IP]" https://nas.yourdomain.asia:8888
# 应返回 200

阶段 5:DDNS(ddns-go)

5.1 安装 ddns-go(经 1panel)

1panel → 应用商店 → 搜索 ddns-go → 安装。参数:

  • 网络模式:host(取 IPv6 最准)
  • 端口:9876
  • 装完后到 主机 → 防火墙 放通 9876,来源限制为 <LAN网段>(切勿对全网开放,Web UI 能改 DNS)。

5.2 配置 ddns-go

浏览器打开 http://<NAS内网IP>:9876,首次设置用户名/密码后:

配置
DNS 服务商腾讯云
SecretId / SecretKey阶段 2.3 的同款
TTL自动
HTTP 请求网卡默认
IPv4❌ 取消启用(纯 IPv6 域名)
IPv6✅ 启用
IPv6 获取方式通过接口获取(公网 API,关键!避开前缀翻转误选)
IPv6 接口 URLhttps://v6.ident.me, https://6.ipw.cn, https://v6.yinghualuo.cn/bejson
Domains@.yourdomain.asia*.yourdomain.asia(两行)

保存,ddns-go 立即执行一次更新。

5.3 验证 DNS 记录

nslookup -query=AAAA yourdomain.asia 119.29.29.29
nslookup -query=AAAA nas.yourdomain.asia 119.29.29.29
# 两条都应返回当前 NAS 公网 IPv6(与 `ip -6 addr` 的 global 地址一致)

阶段 6:外网访问测试(铁律)

⚠️ 必须用「手机关 WiFi 走流量」测外网入站。 电脑与 NAS 同局域网时测「外网通」是假阳性(走二层直连不经运营商)。

测试设备预期
https://nas.yourdomain.asia:8888手机流量✅ 通
https://yourdomain.asia(443)手机流量❌ 卡住(运营商封 443)
https://nas.yourdomain.asia:8888电脑(LAN)✅ 通
https://yourdomain.asia(443)电脑(LAN)✅ 通(假阳性,不经运营商)

手机 8888 通 + 手机 443 不通 + 电脑 443 通 → 唯一变量是被封的 443,配置无问题


阶段 7:故障排查

外网访问不了?按序定位:

1. 手机流量测 https://nas.yourdomain.asia:8888
   ├─ 通 → 服务正常,问题在具体子域/服务
   └─ 不通 ↓
2. 手机流量测 http://[NAS活跃IPv6]:8888(临时用 --resolve 或浏览器直连)
   ├─ 通 → Caddy/端口正常,问题在 DNS(DDNS 指到旧前缀?)
   └─ 不通 ↓
3. NAS 本地测 https://nas.yourdomain.asia:8888(--resolve 强制 IP)
   ├─ 通 → NAS 服务正常,问题在运营商/网络层
   └─ 不通 → Caddy 配置/容器问题,查 docker logs nas-caddy
4. 检查监听:ss -tlnp | grep -E ":8888|:443"
5. 检查 DDNS:ddns-go 日志 + nslookup 权威 DNS(是否旧前缀)
6. 检查证书:openssl x509 -in /certs/fullchain.cer -noout -dates

常见坑速查:

  • 改 Caddyfile 后访问不变 → 只读 bind 挂载,reload 无效,需 docker restart nas-caddy
  • 电脑能开、手机不能 → 99% 是前缀翻转使 DDNS 指旧地址,或误判 443 被封(用手机流量验证)。
  • 路由器拿不到公网 IPv6 → 回阶段 1.3 检查 IPv6 模式(别用 NAT6)。
  • ddns-go 取到旧前缀 → 确认 IPv6 获取方式是「通过接口获取」而非「通过网卡获取」。

阶段 8:进阶 —— 去掉端口 + 国内速度(需备案)

仅当「无法忍受 URL 带 :8888」且接受备案流程时采用。

原理

CDN 边缘 IP 属腾讯云(非家宽),443 干净可用;它回源到 NAS :8888(非标端口,家宽放行)。用户只看到 https://yourdomain.com

前置

  • 换可备案域名.com/.cn),.asia 不在备案白名单,走不了国内 CDN。
  • ICP 备案(腾讯云代备案,约 1–3 周)。

概要步骤

  1. 注册 .com/.cn 并完成实名 + 备案。
  2. 腾讯云 CDN:加速域名 + 源站填 nas.yourdomain.com + 回源协议 HTTPS + 回源端口 8888 + 开启 IPv6 回源。
  3. 申请新域名证书(腾讯云免费 SSL 或 acme.sh dns_tencent)。
  4. DNS:域名 CNAME 到 CDN 加速域名。
  5. 手机流量测 https://yourdomain.com(干净、无端口)。

详细 9 步清单

cdn-nas-setup-guide.md

费用参考

CDN 流量 ≈ ¥0.20/GB(按量),轻度几元/月;域名 .com ≈ ¥55–75/年。


附录:关键文件与位置

位置
Caddy 配置/opt/nas-caddy/Caddyfile(只读 bind 挂载,改后需 restart)
Caddy 证书/opt/nas-caddy/certs/
证书账户~/.acme.sh/yourdomain.asia_ecc/
续期钩子/opt/nas-ddns/renew_caddy.sh
续期 cronacme.sh 默认每日检查(~/.acme.sh/account.conf
ddns-go 配置/root/.ddns_go_config.yaml(容器内)
ddns-go Web UIhttp://<NAS内网IP>:9876(仅 LAN)
DNSPod 凭据/opt/nas-ddns/config.env(权限 600)

⚠️ 安全:config.env 含 DNSPod API 密钥、ddns-go 密码可改 DNS,勿外泄;ddns-go 防火墙仅放 <LAN网段>


一句话总结

路由拿到公网 IPv6 → 证书 DNS-01 签发 → Caddy 双端口(443+8888)反代 → ddns-go 接口获取动态跟随前缀 → 手机流量验外网 8888 通。家宽封 443 不可逆,想干净 URL 只能备案 + 国内 CDN。

继续阅读

全部归档

评论