NAS 系统
NAS 零信任远程访问实战:用 Cloudflare Tunnel 安全暴露内网服务
2026年11月9日
NAS 用 Cloudflare Tunnel 零信任远程访问,免端口映射更隐蔽安全。
NAS 零信任远程访问实战:用 Cloudflare Tunnel 安全暴露内网服务
摘要
传统端口映射和 frp 内网穿透要么把 NAS 暴露在公网 IP 下、要么依赖一台有公网 IP 的中转机。本文用 Cloudflare Tunnel 建立从 NAS 到 Cloudflare 边缘节点的加密反向隧道,配合 Zero Trust Access 做身份校验,无需开路由器端口、无需 DDNS,就能安全地从外网访问 Jellyfin、文件服务与管理后台。
一、为什么不再用端口映射和 frp
在家庭宽带没有公网 IPv4 的今天,想从外面访问 NAS 通常只有几条路:路由器做端口转发(暴露公网 IP 与端口,易被扫描)、自建 frp/ngrok 中转(需要一台有公网 IP 的服务器)、或用 Tailscale/WireGuard 组虚拟网(仅限装了客户端的设备)。
Cloudflare Tunnel 走的是另一条路:它在 NAS 上跑一个 cloudflared 守护进程,主动向外连接 Cloudflare 边缘节点并保持长连接。外部请求先到最近的 CF 节点,再由隧道"反向"送回 NAS。整个过程 NAS 不需要任何入站端口,源站 IP 对访问者完全不可见,运营商封锁 80/443 也不影响。
二、原理:cloudflared 反向隧道与 Zero Trust
Tunnel 的本质是"出站连接 + 边缘代理"。你在 Cloudflare 后台创建一个 Tunnel,会生成一对密钥(credentials.json)。cloudflared 用这把密钥和 CF 建立 mTLS 隧道,并上报一份 ingress 路由表:哪个 hostname 对应内网哪个服务。
真正让它比 frp 更省心的是 Zero Trust Access:你可以给某个 hostname 套一层 SSO 登录(支持邮箱 OTP、GitHub、Google、OIDC)。访问者先通过身份校验,才被允许把请求送到 NAS。相当于在隧道出口又加了一道门禁,即使后端服务本身没有鉴权也不会裸奔。
三、准备工作:域名与隧道创建
- 一个托管在 Cloudflare 的域名(免费版即可),并把要用的子域(如
nas.example.com)的 DNS 交给 CF 解析。 - 登录 Cloudflare Zero Trust 控制台,进入 Networks → Tunnels → Create a tunnel,选择 Cloudflared,按提示在 NAS 上安装并运行连接器。CF 会自动生成密钥并下载 credentials.json。
- 命令行方式:
cloudflared tunnel login授权域名,再cloudflared tunnel create nas-tunnel,生成的 JSON 在~/.cloudflared/下。
四、在群晖/飞牛上部署 cloudflared 容器
最省事的是用 Docker。群晖 Container Manager、飞牛的容器管理里都可直接拉 cloudflare/cloudflared,用 token 方式运行(token 由 cloudflared tunnel token nas-tunnel 导出,比挂载 credentials.json 更适合容器):
services:
cloudflared:
image: cloudflare/cloudflared:latest
command: tunnel --no-autoupdate run --token <你的TOKEN>
restart: unless-stopped
也可以写成配置文件 /etc/cloudflared/config.yml 自管路由:
tunnel: nas-tunnel
credentials-file: /etc/cloudflared/<id>.json
ingress:
- hostname: nas.example.com
service: https://192.168.1.20:5001
originRequest:
noTLSVerify: true
- hostname: jellyfin.example.com
service: http://192.168.1.20:8096
- service: http_status:404
noTLSVerify: true 用于后端是自建证书(如群晖 5001 自签)时跳过校验;纯 http 服务直接写 http:// 即可。
五、用 Zero Trust Access 加一层身份认证
回到 Zero Trust 控制台 Access → Applications → Add an application,选 self-hosted,填 nas.example.com,在 Policy 里加一条:允许邮箱后缀为 @yourdomain.com 的用户,动作选 Allow,认证方式勾选 One-Time Pin(发验证码到邮箱)。保存后,外部访问该域名会先跳到 CF 的登录页,输对验证码才放行。只给家人用的场景,也可基于 Service Auth 或 bypass 规则放行特定 IP。
六、性能、回源与常见坑
- 带宽:隧道免费额度足够管理后台、文件下载;但 4K 原盘串流走 CF 会绕远路且可能触发缓存/限速,影音大流量仍建议用 Tailscale/WireGuard 直连。
- 动态内容被缓存:CF 默认对静态资源缓存,管理后台若被缓存会串号。在 Access 或 Cache Rules 里把
nas.example.com/admin/*设为Cache Level: Bypass。 - WebSocket:Jellyfin/Plex 的实时弹幕、HA 的 WebSocket 需要隧道支持 WS,cloudflared 默认已支持,但反向代理层别再套一层会断连的 Nginx。
- 50 用户上限:免费 Zero Trust 支持 50 人,小微企业够用;超了再评估付费。
- 更新:
cloudflared偶尔强制升级,加--no-autoupdate可锁定版本,但建议定期手动升级以修复漏洞。
小结
Cloudflare Tunnel 用"出站反连"替代"入站暴露",让没有公网 IP 的 NAS 也能安全上线,再叠加 Zero Trust Access 的身份门禁,比裸端口映射和 frp 中转都更克制、更隐蔽。适合发布管理后台、文档、网盘等低频高价值服务;大流量影音则留给虚拟组网方案。