· 技术备忘录 · 8 min read
不用公网IP!Cloudflare Tunnel 内网穿透NAS完整指南
没有公网IP也能让家庭NAS对外提供服务?Cloudflare Tunnel免费方案比frp/ngrok更安全、更稳定。手把手教你配置Docker、Cloudflare Access零信任认证,附带安全加固最佳实践。
如果你在家里部署了 NAS(群晖、TrueNAS、Unraid),一定遇到过这个痛点:
出门在外想访问家里的文件,但没有公网 IP。
传统的解决方案有三种:
- 端口映射:需要公网 IP,还要暴露端口到互联网,容易被扫描攻击。
- frp/ngrok:需要自己有一台云服务器做中转,维护成本高。
- Tailscale/ZeroTier:每台设备都要安装客户端,不方便分享给朋友。
2026年,我找到了更好的方案:Cloudflare Tunnel。
它完全免费、无需公网 IP、自动 HTTPS 加密、还能隐藏真实 IP。 最重要的是:配置简单到令人发指。
什么是 Cloudflare Tunnel?
简单来说,它是在你的本地服务和 Cloudflare 边缘网络之间建立一条加密隧道。
你的浏览器 → Cloudflare CDN → Cloudflare Tunnel → 你的NAS外界只能看到 nas.yourdomain.com 指向 Cloudflare,完全不知道你的真实 IP 在哪里。
前置条件
- ✅ 一个域名(在 Cloudflare 管理 DNS)
- ✅ 一台运行 Docker 的设备(NAS、树莓派、N100 迷你主机都可以)
- ✅ Cloudflare 免费账户
不需要:
- ❌ 公网 IP
- ❌ 端口映射
- ❌ 云服务器
第一步:创建 Tunnel
1. 登录 Cloudflare Zero Trust 控制台
访问 https://one.dash.cloudflare.com,用你的 Cloudflare 账号登录。
2. 创建 Tunnel
- 点击左侧菜单 Access → Tunnels
- 点击 Create a tunnel
- 输入名称(如
home-nas) - 选择你的域名
3. 安装 Connector
Cloudflare 会提供一段 Docker 命令,类似这样:
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <YOUR_TOKEN>复制这段命令,在你的 NAS 或服务器上执行。
第二步:配置 Public Hostname
Tunnel 创建后,你需要告诉 Cloudflare:“当用户访问 nas.yourdomain.com 时,转发到我本地的哪个服务”。
1. 添加 Public Hostname
在 Tunnel 配置页面,点击 Public Hostnames → Add a public hostname。
2. 填写配置
- Subdomain:
nas(最终域名是nas.yourdomain.com) - Domain: 选择你的域名
- Service:
http://192.168.1.100:5000(你 NAS 的局域网 IP 和端口)
保存。
3. 测试访问
现在,在任何地方访问 https://nas.yourdomain.com,应该能看到你的 NAS 登录界面。
就这么简单!
第三步:安全加固(必须做)
虽然 Tunnel 本身很安全,但你还得保护 NAS 不被未授权访问。
方案一:Cloudflare Access(推荐)
这是 Cloudflare 提供的零信任访问控制,可以要求用户登录才能访问。
配置步骤:
- 在 Zero Trust 控制台,点击 Access → Applications
- 点击 Add an application → Self-hosted
- 填写应用名称(如
Home NAS) - Session duration: 设置为
24 hours(每天登录一次即可) - Authentication: 选择登录方式
- One-time PIN: 发送验证码到邮箱(最简单)
- GitHub/Google: 使用第三方账号登录
- Policies: 添加允许访问的邮箱地址
效果:
任何人访问 nas.yourdomain.com,都会先跳转到 Cloudflare 登录页面。 只有你授权的邮箱才能通过验证。
即使 NAS 密码泄露,黑客也进不来。
方案二:HTTP Basic Auth
如果你的 NAS 不支持复杂的认证,可以在 Tunnel 层面加一层密码保护。
在 cloudflared 配置文件中添加:
tunnel: your-tunnel-id
credentials-file: /etc/cloudflared/creds.json
ingress:
- hostname: nas.yourdomain.com
service: http://192.168.1.100:5000
originRequest:
noTLSVerify: true
- service: http_status:404然后通过 Nginx 反向代理添加 Basic Auth。
方案三:IP 白名单
如果你只在固定地点访问(如公司、咖啡厅),可以限制只允许特定 IP 访问。
在 Cloudflare Access Policies 中添加规则:
- Include: IP Address → 你的公网 IP
性能优化
问题:延迟高怎么办?
Cloudflare Tunnel 的流量会经过 Cloudflare 的边缘节点,理论上会增加延迟。
但在实际使用中,我发现:
- 国内访问欧洲 NAS: 延迟从 200ms 降到 150ms(因为走了 Cloudflare CDN 优化线路)
- 文件传输速度: 取决于你的上行带宽,Tunnel 本身几乎没有损耗
优化建议:
- 启用 Argo Smart Routing(Cloudflare Pro 功能,$5/月)
- 自动选择最优路由,降低延迟
- 缓存静态资源
- 在 Cloudflare Dashboard 开启缓存,减少重复传输
- 使用 QUIC 协议
- 现代浏览器默认支持,提升弱网环境下的体验
常见问题
Q1: Tunnel 断了怎么办?
A: cloudflared 会自动重连。你也可以用 Docker 的 --restart=always 确保容器崩溃后自动重启。
Q2: 可以暴露多个服务吗?
A: 可以。在同一个 Tunnel 下添加多个 Public Hostname:
nas.yourdomain.com→ 192.168.1.100:5000jellyfin.yourdomain.com→ 192.168.1.100:8096uptime.yourdomain.com→ 192.168.1.100:3001
Q3: 免费版的限制是什么?
A: Cloudflare Tunnel 免费版没有任何限制。 你可以创建无限个 Tunnel,暴露无限个服务。 唯一的限制是 Cloudflare 的速率限制(正常人类用不到)。
Q4: 和 frp 比哪个更好?
A:
- Cloudflare Tunnel: 免费、无需服务器、自动 HTTPS、隐藏 IP
- frp: 需要自己的服务器、配置复杂、但可以点对点直连(延迟更低)
对于大多数家庭用户,Cloudflare Tunnel 完胜。
我的实际架构
我现在是这样用的:
域名: zsx.one
Tunnel: home-services
├── nas.zsx.one → 群晖 DSM (192.168.1.100:5000)
│ └── 保护: Cloudflare Access (仅我的邮箱)
├── jellyfin.zsx.one → Jellyfin (192.168.1.100:8096)
│ └── 保护: Cloudflare Access (家人邮箱白名单)
├── uptime.zsx.one → Uptime Kuma (192.168.1.100:3001)
│ └── 保护: HTTP Basic Auth + IP 白名单
└── vaultwarden.zsx.one → Vaultwarden (192.168.1.100:8080)
└── 保护: Cloudflare Access + MFA所有服务都通过同一个 Tunnel 暴露,管理非常方便。
ZSX 的斩杀线建议
使用 Cloudflare Tunnel,如果:
- ✅ 你没有公网 IP
- ✅ 你不想维护 frp 服务器
- ✅ 你重视安全性(隐藏真实 IP)
- ✅ 你需要分享给家人/朋友访问
- ✅ 你能接受 10-50ms 的额外延迟
使用 frp/ngrok,如果:
- ✅ 你有公网 IP 但不想端口映射
- ✅ 你对延迟极其敏感(如远程桌面)
- ✅ 你已经有一台云服务器闲置
- ✅ 你需要点对点直连(不走 CDN)
绝对不要直接端口映射,如果:
- ❌ 你没有防火墙经验
- ❌ 你的 NAS 固件很久没更新
- ❌ 你存储了敏感数据
延伸阅读
- 《Tailscale vs ZeroTier》 - 另一种内网访问方案
- 《Uptime Kuma 监控服务》 - 监控你的 Tunnel 是否在线
- 《N100迷你主机搭建家庭服务器》 - 运行 cloudflared 的理想硬件
最后的提醒: Cloudflare Tunnel 不是万能的。 如果你的上行带宽只有 5Mbps,再好的隧道也救不了你的传输速度。
但它解决了最核心的安全问题——让你在不暴露真实 IP 的前提下,享受公网访问的便利。
这才是真正的”斩杀线”思维:用最简单的方案,解决最关键的问题。