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。
2. 前置条件
| 条件 | 说明 |
|---|---|
| Cloudflare 账号 | 在 dash.cloudflare.com 注册 |
| 域名托管在 Cloudflare | 域名必须用 Cloudflare 管理 DNS(Nameserver 指向 Cloudflare) |
| NAS 能出站访问外网 | cloudflared 只需能访问 *.cloudflare.com 443 端口 |
| 一个用于暴露的二级域名 | 如 nas.example.com、photos.example.com |
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/
4. 创建 Named Tunnel
推荐使用**命名隧道(Named Tunnel)**而非临时 Quick Tunnel——配置持久、可多服务复用、支持自启。
4.1 登录授权(首次)
cloudflared tunnel login
这条命令会:
- 打印一个授权链接,用浏览器打开并选择你的域名;
- 下载证书到
~/.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>
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
5.1 关键配置项
| 配置 | 作用 |
|---|---|
hostname | 对外暴露的域名(需与第 6 节 DNS 记录对应) |
service | 回源的内网地址,http:// 或 https:// |
originRequest.noTLSVerify | NAS 自签 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 手动创建
- Cloudflare Dashboard → 你的域名 → DNS → Records;
- 添加 CNAME:
- Type:
CNAME - Name:
nas - Target:
<tunnel-uuid>.cfargotunnel.com - Proxy status: 必须开启橙色云朵(Proxied),走隧道。
- Type:
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
7.4 群晖具体操作
- 套件中心安装 Container Manager;
- 上传上面
docker-compose.yml(或用cloudflare/cloudflared镜像建容器); - 使用 host 网络模式,确保能直接访问
192.168.1.100各端口; - 容器随 Docker 自启即可,无需额外配置。
8. 安全加固:加一层 Cloudflare Access 认证
直接暴露 DSM 管理界面到公网非常危险——即使有隧道,任何人都能访问登录页。强烈建议用 Cloudflare Access(Zero Trust) 在隧道前加一层身份认证。
8.1 开启 Access 策略
- Cloudflare Dashboard → Zero Trust → Access → Applications → Add an application;
- Application type 选 Self-hosted,填入
nas.example.com; - 配置 Policy:
- Policy name:
NAS 访问 - Action:
Allow - Include: 登录方式选
Emails(你的邮箱)、Any Access service token,或限制国家/地区、IP 范围;
- Policy name:
- 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 加身份认证