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/...
必须接受的两个现实(移动家宽)
- 80 / 443 入站被封 → 外网访问必须带非标端口(本文用
:8888)。 - 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 设置」):
- 启用 IPv6 = 开启。
- WAN 侧 / 上网方式:选 「自动获取」/「Native」/「DHCPv6」 或 「桥模式(Bridge)」,让路由器从光猫拿到运营商 PD 前缀。
- ❌ 不要选「NAT6 / IPv6 转发」这类会把 LAN 设备 IPv6 再做一层 NAT 的模式——那会导致 NAS 拿到的是路由器私有前缀,外网进不来。
- ✅ 目标是:LAN 下的 NAS 直接获得
2409:开头的公网 IPv6。
- LAN 侧 IPv6 分配:开启 SLAAC / DHCPv6,让下挂设备自动获得前缀下的地址。
- IPv6 防火墙:确认没有手动封掉
8888等端口(家用路由器默认对入站较宽松;少数品牌默认全阻断,需要放行 TCP 8888 入站,或依赖「全锥」模式)。 - 保存并重启路由器使 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(腾讯云)
- 腾讯云控制台 → 「域名注册 / DNS 解析 DNSPod」→ 将域名 NS 改为 DNSPod(或注册时直接选 DNSPod)。
- 拿到 SecretId 和 SecretKey(控制台 → 「访问管理 → 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 接口 URL | https://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 周)。
概要步骤
- 注册
.com/.cn并完成实名 + 备案。 - 腾讯云 CDN:加速域名 + 源站填
nas.yourdomain.com+ 回源协议 HTTPS + 回源端口 8888 + 开启 IPv6 回源。 - 申请新域名证书(腾讯云免费 SSL 或 acme.sh
dns_tencent)。 - DNS:域名 CNAME 到 CDN 加速域名。
- 手机流量测
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 |
| 续期 cron | acme.sh 默认每日检查(~/.acme.sh/account.conf) |
| ddns-go 配置 | /root/.ddns_go_config.yaml(容器内) |
| ddns-go Web UI | http://<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。
评论