Files
nas/docs/public-access.md
wangjia 3fc6b402cd 新增 Tailscale 公网访问方案并落地
- 调研对比 Tailscale / Cloudflare Tunnel / frp / QuickConnect,
  自用+大文件+隐藏IP 场景下选定 Tailscale(避开 CF 免费版 100MB 上限)
- NAS 已上线 tailnet(ds925 / 100.95.151.13),Gitea 与 Synology Photos
  公网访问已验证(含 >100MB 视频上传)
- 修复关键坑:mihomo fake-ip 劫持 Tailscale 控制面域名导致 tailscale up
  卡住,在 fake-ip-filter 加入 +.tailscale.com 等并提供修复脚本
- 文档:docs/public-access.md(部署/踩坑/验证)
- 可选件:docker/derp(自建 DERP 中继)
- 同步更新 CLAUDE.md(修正 git 公网地址、新增公网访问小节、端口、TODO)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 21:17:46 +08:00

5.4 KiB
Raw Permalink Blame History

NAS 公网访问(Tailscale 方案)

让外网设备(移动网络、外出、公司)安全访问 NAS 上的 Forgejo/GiteaSynology Photos(含 >100MB 视频 / RAW 大文件上传)。

选型与评分对比见仓库根目录评审记录。结论:自用/家人 + 需大文件上传 + 隐藏家庭 IP 的 场景下,TailscaleWireGuard 网格 VPN 是最优解 —— 零公网暴露、无文件大小限制、 不泄露家庭真实公网 IP。Cloudflare Tunnel 因免费版单文件 100MB 上限不适合 Photos 大文件。

现状提醒

  • git.51yanmei.com 的 DNS 记录指向 192.168.3.200(局域网私有 IP,未走 Cloudflare 代理), 目前仅在局域网可达,公网打不开
  • 家宽 WAN 实测有公网 IPnetcheck 显示 221.223.98.165,UPnP 端口映射可用),但仍用 Tailscale 走隧道,不暴露任何端口。

实际部署记录(本 NAS

  • 节点:ds925Tailscale IP 100.95.151.13MagicDNS 名 ds925.tail6e8719.ts.net
  • 账号身份:Google SSOwang880812@gmail.com)。Google 仅在「设备登录 / 进管理后台」时需要 (国内需 Shadowrocket 等代理过一下);登录后日常用 VPN 不碰 Google。NAS 已登录, 务必在后台对 ds925 关闭 key expiry,否则 ~180 天后掉线需重新过 Google。
  • 当前 iPhone ↔ NAS 走 DERP 香港中继(~115ms),够用;想要 P2P 直连更快见下方「自建 DERP / 优化」。

⚠️ 关键坑:mihomo fake-ip 会劫持 Tailscale 登录

本 NAS 出网经 mihomo 透明代理(fake-ip DNS)。默认情况下 controlplane.tailscale.com 会被解析成 fake-ip198.18.x.x),导致 tailscaled 连不上控制面、tailscale up 卡住不打印登录 URL (日志表现为 StartLoginInteractive: url=falseShutdown 死循环)。

解决:把 Tailscale 域名加入 mihomo 的 dns.fake-ip-filter,让其解析为真实 IP。 已封装为脚本 scripts/fix-mihomo-tailscale.sh(幂等、自动备份、热重载)。在 NAS 上执行:

ssh nas 'sh -s' < scripts/fix-mihomo-tailscale.sh

加入的过滤项:+.tailscale.com / +.tailscale.io / +.tailscale-dns.com

浏览器注意

Gitea 是纯 HTTP:3000)。Arc 等会强制 HTTPS-upgrade 的浏览器访问会超时—— 要么手动打全 http://,要么用 tailscale serve 给服务套上 *.ts.net 的有效 HTTPS 证书:

/var/packages/Tailscale/target/bin/tailscale serve --bg https / http://127.0.0.1:3000
# 之后用 https://ds925.tail6e8719.ts.net/ 访问,全浏览器无告警

架构

外网设备(手机/笔记本,装 Tailscale App
  └─ WireGuard 加密隧道(P2P 直连,打洞失败时回退 DERP 中继)
       └─ NASDSM 套件 TailscaleTailscale IP 100.x.y.z
            ├─ Forgejo/Gitea  :3000 (HTTP) / :2222 (SSH)
            └─ Synology Photos (走 NAS Tailscale IP,无大小限制)

无任何对外开放端口,家庭公网 IP 不出现在任何公网记录中。

部署步骤

1. NAS 安装 Tailscale

  • DSM → 套件中心 → 搜索安装官方 Tailscale 套件。
  • 打开套件 → 登录 Tailscale 账号(tailscale up)。
  • Tailscale 管理后台 → DNS → 开启 MagicDNS
  • 不需要开 subnet router(直接访问 NAS 本机即可),DSM 防火墙保持不变。

2. 各访问设备

  • 手机 / 笔记本安装 Tailscale App,登录同一账号,进入同一 tailnet。

3. 访问服务

服务 访问方式
Gitea Web http://nas:3000MagicDNS)或 http://100.x.y.z:3000
git clone (HTTPS) :3000
git clone (SSH) ssh://git@100.x.y.z:2222/...
Synology Photos App「自定义地址 / IP」填 NAS 的 Tailscale IP100.x.y.z),可上传大文件

nas 为 MagicDNS 主机名(以管理后台实际显示为准)。

可选增强

A. tailnet 内 HTTPS(免自签证书告警)

# 在 NAS 上,把 Gitea 3000 端口以 https 暴露到 tailnet(自动签发 *.ts.net 证书)
tailscale serve https / http://127.0.0.1:3000

B. 偶尔对外公开分享(对方无需装 Tailscale)

# 把服务发布到公网 443(受 Tailscale 带宽限制,适合临时分享单个链接)
tailscale funnel 3000

Funnel 仅支持 443 / 8443 / 10000 端口、且仅 HTTPS。

C. 提升中国网络稳定性:自建 DERP 中继

P2P 打洞失败时会回退到 Tailscale 官方 DERP,国内可能慢。可在已有的新加坡 EC2 (18.136.60.128)上自建 DERP 节点(见 docker/derp/),并在管理后台 ACL 的 derpMap 中登记,让回退中继走新加坡而非默认节点。

安全加固

  • 用 Tailscale ACL 限制「哪些设备能访问 NAS」,最小授权。
  • 保留 DSM 的账号 2FA 与自动封锁(IP auto-block)。
  • 不在路由器上做任何端口转发。

端到端验证

  1. 手机断开家庭 WiFi → 切 4G/5G(确保走公网)→ 开 Tailscale。
  2. 浏览器开 http://nas:3000 → Gitea 登录页能打开,能 push/clone。
  3. Synology Photos App 连 NAS Tailscale IP → 上传一个 >100MB 的视频,确认成功。
  4. 公网侧 nslookup git.51yanmei.com 仍解析到内网 IP → 确认未暴露家庭公网 IP。
  5. tailscale status 查看连接是 direct 还是 relay,评估链路质量。