# NAS 公网访问(Tailscale 方案) 让外网设备(移动网络、外出、公司)安全访问 NAS 上的 **Forgejo/Gitea** 和 **Synology Photos**(含 >100MB 视频 / RAW 大文件上传)。 > 选型与评分对比见仓库根目录评审记录。结论:自用/家人 + 需大文件上传 + 隐藏家庭 IP 的 > 场景下,**Tailscale(WireGuard 网格 VPN)** 是最优解 —— 零公网暴露、无文件大小限制、 > 不泄露家庭真实公网 IP。Cloudflare Tunnel 因免费版单文件 100MB 上限不适合 Photos 大文件。 ## 现状提醒 - `git.51yanmei.com` 的 DNS 记录指向 `192.168.3.200`(局域网私有 IP,未走 Cloudflare 代理), **目前仅在局域网可达,公网打不开**。 - 家宽 WAN 实测有公网 IP(netcheck 显示 `221.223.98.165`,UPnP 端口映射可用),但仍用 Tailscale 走隧道,不暴露任何端口。 ## 实际部署记录(本 NAS) - 节点:`ds925`,Tailscale IP **`100.95.151.13`**,MagicDNS 名 `ds925.tail6e8719.ts.net`。 - 账号身份:Google SSO(`wang880812@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-ip(`198.18.x.x`),导致 **tailscaled 连不上控制面、`tailscale up` 卡住不打印登录 URL** (日志表现为 `StartLoginInteractive: url=false` → `Shutdown` 死循环)。 **解决**:把 Tailscale 域名加入 mihomo 的 `dns.fake-ip-filter`,让其解析为真实 IP。 已封装为脚本 **`scripts/fix-mihomo-tailscale.sh`**(幂等、自动备份、热重载)。在 NAS 上执行: ```bash 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 证书: ```bash /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 中继) └─ NAS(DSM 套件 Tailscale,Tailscale 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 管理后台](https://login.tailscale.com/admin) → DNS → 开启 **MagicDNS**。 - 不需要开 subnet router(直接访问 NAS 本机即可),DSM 防火墙保持不变。 ### 2. 各访问设备 - 手机 / 笔记本安装 Tailscale App,登录**同一账号**,进入同一 tailnet。 ### 3. 访问服务 | 服务 | 访问方式 | |------|----------| | Gitea Web | `http://nas:3000`(MagicDNS)或 `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 IP(`100.x.y.z`),可上传大文件 | `nas` 为 MagicDNS 主机名(以管理后台实际显示为准)。 ## 可选增强 ### A. tailnet 内 HTTPS(免自签证书告警) ```bash # 在 NAS 上,把 Gitea 3000 端口以 https 暴露到 tailnet(自动签发 *.ts.net 证书) tailscale serve https / http://127.0.0.1:3000 ``` ### B. 偶尔对外公开分享(对方无需装 Tailscale) ```bash # 把服务发布到公网 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`,评估链路质量。