跳到主要内容

Cloudflare Tunnel 内网 NAS 穿透部署指南

家里或公司的 NAS 需要在外网访问,传统做法是向运营商申请公网 IP + 路由器端口转发 + DDNS。Cloudflare Tunnel 提供了一条免公网 IP、免端口转发、免费且自带 TLS 的替代方案:在 NAS 上运行一个轻量客户端 cloudflared,与 Cloudflare 边缘节点建立出站连接,外部流量经 Cloudflare 网络转发进来。

本文记录了把内网 NAS 通过 Cloudflare Tunnel 安全暴露到公网的完整部署过程:隧道创建、多服务配置、开机自启、Access 认证加固与故障排查。


1. 方案对比:为什么选 Cloudflare Tunnel​

方案公网 IP端口转发费用隐藏源站自带 HTTPS
DDNS + 端口转发需要需要域名费❌ 源站 IP 暴露❌ 需自配证书
frp / nps需要一台有公网 IP 的中转机可选服务器费用⚠️ 依赖中转机❌
Tailscale / WireGuard不需要不需要免费档够用✅ 但需装客户端✅
Cloudflare Tunnel不需要不需要免费✅ 只暴露指定域名✅ 自动

Cloudflare Tunnel 的核心优势:

  • 零入站端口:cloudflared 主动出站连接 Cloudflare 边缘,家庭宽带 / 移动网络 / CGNAT 后都能用;
  • 免公网 IP:不依赖动态公网地址,路由器上无需任何端口映射;
  • 自动 HTTPS:由 Cloudflare 签发并管理证书,无需自配证书与续期;
  • 隐藏源站:外部只知道 Cloudflare 域名,探测不到你家的真实 IP。
协议限制

Cloudflare Tunnel 免费版原生只支持 HTTP/HTTPS/WS 协议。NAS 上的 SMB 文件共享(445 端口)、FTP、NFS 等非 Web 协议无法直接穿透(TCP 流量需要付费的 Spectrum 功能)。所以隧道适合暴露 NAS 的 Web 管理界面、WebDAV、相册、下载工具 UI、反向代理服务等 HTTP 类应用。


2. 前置条件​

条件说明
Cloudflare 账号在 dash.cloudflare.com 注册
域名托管在 Cloudflare域名必须用 Cloudflare 管理 DNS(Nameserver 指向 Cloudflare)
NAS 能出站访问外网cloudflared 只需能访问 *.cloudflare.com 443 端口
一个用于暴露的二级域名如 nas.example.com、photos.example.com
免费版足够

免费套餐即可使用 Named Tunnel。域名本身需要注册(几十元/年),隧道服务本身不收费。


3. 安装 cloudflared​

3.1 Linux(Debian / Ubuntu)​

# 添加 Cloudflare 软件源
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list

sudo apt-get update
sudo apt-get install -y cloudflared

cloudflared --version

3.2 macOS​

brew install cloudflared

3.3 其他平台​

# 官方一键脚本(Windows / Linux 均可)
# 详见 https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/
国内网络加速

如果 pkg.cloudflare.com 或 GitHub 下载慢,可以:

  1. 从 Cloudflare Releases 下载二进制后直接放入 /usr/local/bin/;
  2. 或用代理临时加速下载,二进制是单文件、无依赖。

4. 创建 Named Tunnel​

推荐使用**命名隧道(Named Tunnel)**而非临时 Quick Tunnel——配置持久、可多服务复用、支持自启。

4.1 登录授权(首次)​

cloudflared tunnel login

这条命令会:

  1. 打印一个授权链接,用浏览器打开并选择你的域名;
  2. 下载证书到 ~/.cloudflared/cert.pem(该证书允许你管理该账户下的隧道)。

4.2 创建隧道​

cloudflared tunnel create nas

成功后会生成:

~/.cloudflared/
├── cert.pem # 登录证书(授权凭证)
└── <tunnel-uuid>.json # 隧道凭据文件(连接身份)

并输出隧道的 UUID 和隧道 ID,记下来。验证:

cloudflared tunnel list
# NAME ID CREATED ...
# nas <uuid>
凭据文件要保留

<tunnel-uuid>.json 是这条隧道的连接凭据,删除后隧道无法启动。建议一并备份;NAS 换机迁移时,把 cert.pem 和凭据 json 一起拷贝即可。


5. 配置 config.yml:暴露 NAS 的多个服务​

新建 ~/.cloudflared/config.yml,通过 ingress 规则把不同域名路由到内网不同服务。

tunnel: nas # 隧道名称
credentials-file: /home/user/.cloudflared/<tunnel-uuid>.json

ingress:
# 群晖 DSM Web 管理界面(https 端口 5001)
- hostname: nas.example.com
service: https://192.168.1.100:5001
originRequest:
noTLSVerify: true # NAS 自签证书,跳过校验

# WebDAV(http 端口 5005)
- hostname: webdav.example.com
service: http://192.168.1.100:5005

# 相册 / 照片应用(如群晖 Synology Photos 反向代理或容器)
- hostname: photos.example.com
service: http://192.168.1.100:8080

# 兜底规则:所有未匹配的请求返回 404
- service: http_status:404
回源地址

service 指向 NAS 的内网地址(192.168.1.100)而不是公网地址。cloudflared 会在内网直接访问目标服务,速度快且不绕公网。若 NAS 上运行了反向代理(如 Nginx / Caddy / 群晖反代),也可以只开一条到反代的 ingress,由反代继续分发。

5.1 关键配置项​

配置作用
hostname对外暴露的域名(需与第 6 节 DNS 记录对应)
service回源的内网地址,http:// 或 https://
originRequest.noTLSVerifyNAS 自签 HTTPS 证书时跳过校验,避免 502
http_status:404必须作为最后一条兜底,未匹配的请求返回 404

6. 配置 DNS 路由​

让域名解析到隧道,两种方式任选其一:

6.1 命令行自动创建(推荐)​

cloudflared tunnel route dns nas nas.example.com
cloudflared tunnel route dns nas webdav.example.com
cloudflared tunnel route dns nas photos.example.com

这会自动创建 CNAME 记录:

nas.example.com CNAME <tunnel-uuid>.cfargotunnel.com

6.2 Dashboard 手动创建​

  1. Cloudflare Dashboard → 你的域名 → DNS → Records;
  2. 添加 CNAME:
    • Type: CNAME
    • Name: nas
    • Target: <tunnel-uuid>.cfargotunnel.com
    • Proxy status: 必须开启橙色云朵(Proxied),走隧道。
必须开代理(橙色云)

CNAME 记录必须保持 Proxied(橙色云朵) 状态,流量才会经 Cloudflare 转发到隧道。如果关掉代理(DNS only),请求会直接回源,隧道不生效。


7. 启动隧道并设置开机自启​

7.1 前台验证(先确认通了再上服务)​

cloudflared tunnel run nas

看到日志 Registered tunnel connection 后,用手机流量(不要用家里 WiFi)访问 https://nas.example.com 验证。

7.2 systemd 开机自启(Linux)​

# 安装为系统服务
sudo cloudflared service install

# 启动并设置开机自启
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

# 查看状态
sudo systemctl status cloudflared

7.3 Docker 方式(群晖 / 威联通推荐)​

在 NAS 上用 Container Manager / Docker 跑 cloudflared 是最通用、最不易污染系统环境的方式:

# docker-compose.yml
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run --token <tunnel-token> # 见下方说明
network_mode: host
# 或使用 config.yml 挂载:
# command: tunnel --no-autoupdate run --config /etc/cloudflared/config.yml
# volumes:
# - ./cloudflared:/etc/cloudflared
两种配置方式
  • Token 方式:在 Cloudflare Dashboard → Zero Trust → Networks → Tunnels 中创建隧道时,会生成一段 --token <TOKEN>,一条命令即可运行,无需 config.yml;
  • config.yml 方式:把第 5 节的配置文件挂载进容器,适合已用 CLI 创建隧道的场景。

7.4 群晖具体操作​

  1. 套件中心安装 Container Manager;
  2. 上传上面 docker-compose.yml(或用 cloudflare/cloudflared 镜像建容器);
  3. 使用 host 网络模式,确保能直接访问 192.168.1.100 各端口;
  4. 容器随 Docker 自启即可,无需额外配置。

8. 安全加固:加一层 Cloudflare Access 认证​

直接暴露 DSM 管理界面到公网非常危险——即使有隧道,任何人都能访问登录页。强烈建议用 Cloudflare Access(Zero Trust) 在隧道前加一层身份认证。

8.1 开启 Access 策略​

  1. Cloudflare Dashboard → Zero Trust → Access → Applications → Add an application;
  2. Application type 选 Self-hosted,填入 nas.example.com;
  3. 配置 Policy:
    • Policy name: NAS 访问
    • Action: Allow
    • Include: 登录方式选 Emails(你的邮箱)、Any Access service token,或限制国家/地区、IP 范围;
  4. Save。

8.2 效果​

配置后,访问 https://nas.example.com 会先弹出 Cloudflare 登录页,验证通过后才会放行到 NAS。未授权用户连 DSM 登录页都看不到。

8.3 其他安全建议​

  • 最小暴露:只暴露需要的子域名,不要配 *.example.com 泛解析;
  • 强密码 + 2FA:NAS 本身的管理员账号开启强密码与两步验证;
  • 定期检查 Access 日志:Zero Trust → Access → Logs 查看访问记录,发现异常 IP 及时收紧;
  • 不暴露高危端口:SSH(22)、FTP 等非 Web 服务不要通过隧道暴露,确需远程登录用 VPN(Tailscale/WireGuard)更安全;
  • 区分管理员与只读:如果只是外网看照片,可以只把相册服务暴露出来,DSM 管理界面通过 Access 严格控制。

9. 常见问题排查​

现象可能原因处理
访问返回 502 Bad Gateway回源地址/端口不对、服务没监听、自签证书未跳过检查 config.yml 的 service 与 originRequest.noTLSVerify;内网先 curl http://192.168.1.100:端口 验证
此站点无法访问 / DNS 未生效CNAME 未创建或未开代理(灰色云)cloudflared tunnel route dns 检查记录,确认橙色云朵
隧道日志 Unable to establish connection出站 443 被防火墙/运营商拦截检查 NAS 是否限制出站端口,放行 *.cloudflare.com:443
访问偶尔失败、不稳定家庭宽带出站抖动确认 restart: unless-stopped 已配置;观察 cloudflared 日志连接状态
内网访问慢走了 Cloudflare 回环内网直接用 192.168.1.100,或加 DNS 分流(见下)
cloudflared: command not found服务以不同用户启动,PATH 不含二进制systemd 服务中写绝对路径 /usr/local/bin/cloudflared

内网访问走局域网(可选优化)​

隧道对外网有效,但内网设备访问 nas.example.com 也会绕到 Cloudflare 再回来,速度慢。可接受的话不管;想优化可在内网 DNS(路由器 / AdGuard / 群晖 DNS Server)加一条:

nas.example.com → 192.168.1.100 (内网解析为内网 IP)

10. 完整配置速查​

部署流程一句话:
login → create tunnel → 写 config.yml → route dns → 启动并自启 → Access 加认证
# 1. 登录授权
cloudflared tunnel login

# 2. 创建隧道
cloudflared tunnel create nas

# 3. 编辑 ~/.cloudflared/config.yml(见第 5 节)

# 4. 绑定域名
cloudflared tunnel route dns nas nas.example.com

# 5. 验证运行
cloudflared tunnel run nas

# 6. 安装为系统服务
sudo cloudflared service install
sudo systemctl enable --now cloudflared

# 7.(强烈建议)Zero Trust → Access 加身份认证

参考资料​