Cloudflare Tunnel 零基础部署指南:让你的 NAS 服务安全暴露到互联网
本文详细介绍如何使用 Cloudflare Tunnel 将本地服务(如博客、导航页)安全地暴露到互联网,无需公网 IP,无需担心端口暴露风险。
1. 什么是 Cloudflare Tunnel?
1.1 传统暴露服务的痛点
传统方式将服务暴露到互联网通常需要:
- 公网 IP:需要向运营商申请,部分用户无法获取
- 端口映射:在路由器上配置,存在安全风险
- 动态 DNS:网络变化时需要更新解析记录
- 防火墙规则:需要手动配置和维护
1.2 Cloudflare Tunnel 的优势
Cloudflare Tunnel 是一种反向代理技术,它可以:
| 优势 | 说明 |
|---|---|
| 无需公网 IP | 通过 Cloudflare 的网络中转流量 |
| 零端口暴露 | 不需要在路由器上开放任何端口 |
| 自动 HTTPS | 所有流量自动使用 SSL 加密 |
| 防火墙友好 | 只需要在防火墙开放 Cloudflare IP |
| 免费使用 | Cloudflare Tunnel 完全免费 |
| 穿透 NAT | 完美解决 NAT 环境下的服务暴露问题 |
1.3 工作原理
用户浏览器
↓ HTTPS
Cloudflare 全球网络
↓ 安全隧道
Cloudflare Tunnel (cloudflared)
↓ localhost
你的本地服务 (NAS 上的博客)
1.4 什么是 Docker?
Docker 是一种容器化技术,可以让开发者将应用程序及其依赖打包成一个独立的单元,确保应用在任何环境下都能一致运行。
核心概念
| 概念 | 说明 |
|---|---|
| 镜像(Image) | 应用程序的模板,包含代码、运行时环境、配置文件等 |
| 容器(Container) | 镜像的运行实例,可以启动、停止、删除 |
| 仓库(Repository) | 存储和分发镜像的地方,如 Docker Hub |
容器 vs 虚拟机
| 对比项 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | 极低(MB 级) | 较高(GB 级) |
| 隔离性 | 进程级隔离 | 完全隔离 |
| 体积 | 几十 MB | 几百 MB 到几 GB |
常用命令
# 拉取镜像
docker pull cloudflare/cloudflared:latest
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止)
docker ps -a
# 启动容器
docker start <容器名>
# 查看容器日志
docker logs -f <容器名>
# 删除容器
docker rm <容器名>
1.5 什么是反向代理?
在了解 Cloudflare Tunnel 之前,我们需要先理解反向代理的概念。
正向代理 vs 反向代理
| 类型 | 正向代理 | 反向代理 |
|---|---|---|
| 作用对象 | 客户端(代客户端请求) | 服务端(代服务端响应) |
| 典型用途 | 翻墙、缓存、访问控制 | 负载均衡、安全防护、SSL 终结 |
| 客户端感知 | 客户端知道代理存在 | 客户端不知道代理存在 |
| 代表软件 | Squid、V2Ray | Nginx、Caddy、Cloudflare |
工作流程对比
正向代理(翻墙原理):
用户浏览器 → [正向代理服务器] → 目标网站
↑ ↓
└────────── 代理返回 ──────────┘
反向代理(Cloudflare Tunnel 原理):
用户浏览器 → [Cloudflare 反向代理] → 你的本地服务
↓ 加密隧道
cloudflared
Cloudflare Tunnel 的定位
Cloudflare Tunnel 本质上是一个反向代理,但与传统反向代理不同的是:
- 传统反向代理需要你有公网服务器
- Cloudflare Tunnel 让 Cloudflare 成为你的反向代理
- 你只需在本地运行一个
cloudflared客户端
1.6 DNS 基础概念
DNS(Domain Name System)是互联网的 "电话簿",负责将域名转换为 IP 地址。
域名解析流程
当你访问 blog.example.com 时:
1. 浏览器查询本地 DNS 缓存
2. 若无缓存,向 DNS 服务器发起请求
3. DNS 服务器查询根域名服务器
4. 逐级查询直到找到 example.com 的 DNS 服务器
5. DNS 服务器返回 blog.example.com 对应的 IP 地址
6. 浏览器使用该 IP 地址建立连接
DNS 记录类型
| 记录类型 | 说明 | 示例 |
|---|---|---|
| A 记录 | 域名指向 IPv4 地址 | blog.example.com → 192.0.2.1 |
| AAAA 记录 | 域名指向 IPv6 地址 | blog.example.com → 2001:db8::1 |
| CNAME 记录 | 域名指向另一个域名 | www.example.com → example.com |
| TXT 记录 | 用于验证和 SPF | 用于域名所有权验证 |
Cloudflare Tunnel 的 DNS 配置
使用 Cloudflare Tunnel 时,你需要在 Cloudflare DNS 中添加:
| 记录类型 | 名称 | 内容 |
|---|---|---|
| CNAME | blog | @(代理到 Cloudflare) |
| CNAME | blog | 隧道服务的特殊指向 |
📝 注意:Cloudflare Tunnel 的 DNS 配置由 Cloudflare Zero Trust 自动管理,你只需在仪表板中添加路由即可。
2. 环境准备
2.1 硬件要求
| 配置级别 | CPU | 内存 | 说明 |
|---|---|---|---|
| 最低配置 | 1 核 | 256 MB | 仅隧道基础功能 |
| 推荐配置 | 1 核 | 512 MB | 稳定运行,有余量 |
📝 注意:Cloudflare Tunnel 本身资源占用极低,256MB 完全足够。
2.2 软件要求
- Docker 和 Docker Compose 已安装
- Cloudflare 账号
- 已托管到 Cloudflare 的域名(可选,但推荐)
2.3 NAS 环境说明
本文以绿联 NAS(DXP2800)为例说明,其他品牌 NAS(群晖、威联通、极空间等)可参考。
2.4 安装 Docker(NAS)
在使用 Docker 部署 Cloudflare Tunnel 之前,需要先在 NAS 上安装 Docker。
绿联 NAS 安装 Docker
- 打开 应用中心
- 搜索 Docker 或 Docker Compose
- 点击安装
- 安装完成后,可以在"应用"中找到 Docker 管理界面
📝 注意:绿联 DXP2800 基于 Debian 系统,安装 Docker 后可以通过 SSH 使用完整的 Docker 命令。
群晖 Synology 安装 Docker
- 打开 套件中心
- 搜索 Docker
- 点击安装
- 安装完成后,在主菜单中找到 Docker
极空间 安装 Docker
- 打开应用商店
- 搜索 Docker
- 点击安装
- 在"应用"中找到 Docker
Docker 安装检查
安装完成后,通过 SSH 或终端验证 Docker 是否正常工作:
# 检查 Docker 版本
docker --version
# 检查 Docker Compose 版本(V2)
docker compose version
# 查看 Docker 信息
docker info
Docker Compose 安装说明
大多数 NAS 的 Docker 套件已包含 Docker Compose(V2)。如果你的版本较旧,可能需要单独安装:
# 验证 Docker Compose
docker compose version
# 如果显示 command not found,可以手动安装
# 或使用 docker-compose(V1)命令
docker-compose --version
2.5 准备 Cloudflare 账号
在使用 Cloudflare Tunnel 之前,需要一个 Cloudflare 账号。
注册 Cloudflare 账号
- 访问 Cloudflare 官网
- 输入你的邮箱地址
- 设置密码
- 验证邮箱后完成注册
添加域名到 Cloudflare
- 登录 Cloudflare Dashboard
- 点击右上角 Add a Site
- 输入你的域名(如
example.com) - 选择套餐(免费版足够使用 Cloudflare Tunnel)
- 按照提示修改域名的 DNS 服务器
修改域名 DNS 服务器
Cloudflare 会提供两个 DNS 服务器地址,你需要到你的域名注册商处修改:
| 注册商 | 修改位置 |
|---|---|
| 阿里云 | 域名控制台 → 管理 → DNS 修改 |
| 腾讯云 | DNSPod → 域名管理 → 设置 DNS |
| GoDaddy | My Products → DNS → Manage |
修改后,等待 24-48 小时生效。可以通过以下方式验证:
# 使用 dig 命令查看 DNS 解析
dig NS yourdomain.com
# 或使用在线工具
# https://www.whatsmydns.net/
获取 Cloudflare Zero Trust 访问权限
Cloudflare Tunnel 需要通过 Cloudflare Zero Trust 访问:
- 访问 Cloudflare Zero Trust
- 使用你的 Cloudflare 账号登录
- 首次登录可能需要设置团队名称(Team Name)
📝 注意:即使你没有自己的域名,也可以使用 Cloudflare 的免费隧道服务,但功能会有所限制。
3. 创建 Cloudflare Tunnel
3.1 登录 Cloudflare Zero Trust
- 访问 Cloudflare Zero Trust
- 使用 Cloudflare 账号登录
- 进入 Networks → Tunnels
3.2 创建新隧道
- 点击 Create a tunnel
- 选择隧道类型:Cloudflared
- 输入隧道名称(如
my-tunnel) - 保存隧道 Token(后续会用到)
3.3 配置隧道路由
创建隧道后,需要配置哪些服务通过隧道暴露:
| 配置项 | 说明 |
|---|---|
| Public hostname | 你想暴露的域名,如 blog.example.com |
| Service | 本地服务地址,如 http://localhost:8090 |
4. Docker Compose 部署
4.1 目录结构
cloudflared/
├── docker-compose.yaml # 主配置文件
├── .env # 环境变量(Token 配置)
└── .gitignore # Git 忽略配置
4.2 创建 .env 文件
# Cloudflare Tunnel Token 配置
# 请勿将此文件提交到版本控制系统
# 隧道 Token(从 Cloudflare Zero Trust 获取)
TUNNEL_TOKEN=你的隧道Token
4.3 创建 docker-compose.yaml
version: '3.8'
# Cloudflare Tunnel 隧道配置
x-cloudflared_defaults: &cloudflared_defaults
image: cloudflare/cloudflared:latest
network_mode: host # 必须使用 host 模式
restart: always
command:
- tunnel
- --no-autoupdate
- --protocol=http2
- --edge-ip-version=4
- run
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
healthcheck:
test: ["CMD", "cloudflared", "tunnel", "info"]
interval: 60s
timeout: 10s
retries: 3
mem_limit: 128m
cpus: 0.5
services:
# Cloudflare Tunnel 服务
cloudflared:
<<: *cloudflared_defaults
container_name: cloudflared
env_file:
- .env
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
4.4 创建 .gitignore
# 敏感文件
.env
*.log
4.5 部署命令
# 进入目录
cd /path/to/cloudflared
# 启动服务
docker compose up -d
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f
# 重启服务
docker compose restart
5. 多服务管理
如果需要暴露多个服务,可以配置多个隧道或使用一个隧道管理多个路由。
5.1 多隧道方式
services:
# 博客服务隧道
cloudflared-blog:
<<: *cloudflared_defaults
container_name: cloudflared-blog
env_file:
- .env
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN_BLOG}
# 导航服务隧道
cloudflared-nav:
<<: *cloudflared_defaults
container_name: cloudflared-nav
env_file:
- .env
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN_NAV}
5.2 .env 文件配置
# 博客服务隧道 Token
TUNNEL_TOKEN_BLOG=你的博客隧道Token
# 导航服务隧道 Token
TUNNEL_TOKEN_NAV=你的导航隧道Token
6. 性能优化
6.1 资源限制说明
| 配置项 | 值 | 说明 |
|---|---|---|
mem_limit | 128m | 防止内存泄漏影响宿主机 |
cpus | 0.5 | 限制 CPU 占用 |
max-size | 10m | 单个日志文件最大 10MB |
max-file | 3 | 最多保留 3 个日志文件 |
6.2 网络协议选择
command:
- --protocol=http2 # 推荐:HTTP/2 协议,性能更好
# 或
- --protocol=h2mux # 备选:基于 mux 的协议
6.3 IP 版本选择
command:
- --edge-ip-version=4 # 仅 IPv4(推荐,大部分网络环境)
# 或
- --edge-ip-version=auto # 自动选择(IPv4/IPv6)
7. 故障排查
7.1 隧道无法连接
检查日志:
docker compose logs -f cloudflared
常见错误:
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
TUNNEL_TOKEN missing | Token 未配置 | 检查 .env 文件 |
| connection refused | 本地服务未启动 | 启动本地服务 |
| unauthorized | Token 无效 | 重新获取 Token |
7.2 服务无法访问
检查步骤:
# 1. 确认隧道状态
docker compose ps
# 2. 检查本地服务
curl http://localhost:8090
# 3. 查看 Cloudflare 仪表板
# Networks → Tunnels → 查看连接状态
7.3 性能问题
优化建议:
| 问题 | 解决方案 |
|---|---|
| 访问慢 | 检查 Cloudflare 边缘节点距离 |
| 连接不稳定 | 尝试更换 --protocol |
| 频繁断开 | 检查本地网络稳定性 |
8. 安全建议
8.1 网络安全
| 措施 | 说明 |
|---|---|
| 使用 Cloudflare Access | 添加身份验证(可选) |
| 限制来源 IP | 使用 Cloudflare Firewall Rules |
| 启用 2FA | Cloudflare 账号启用双因素认证 |
8.2 隧道安全
| 措施 | 说明 |
|---|---|
| 定期轮换 Token | 定期更换隧道 Token |
| 最小权限原则 | 只暴露必要的服务 |
| 监控日志 | 定期检查异常访问 |
8.3 容器安全
| 措施 | 说明 |
|---|---|
| 资源限制 | 限制内存和 CPU |
| 日志管理 | 防止日志撑满磁盘 |
| 定期更新 | 及时更新 cloudflared 镜像 |
9. 常见应用场景
9.1 博客系统
适用于 Halo、WordPress、Typecho 等博客系统:
services:
cloudflared-blog:
<<: *cloudflared_defaults
container_name: cloudflared-blog
env_file:
- .env
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN_BLOG}
9.2 导航页
适用于 Heimdall、Dashboard 等导航页面:
services:
cloudflared-nav:
<<: *cloudflared_defaults
container_name: cloudflared-nav
env_file:
- .env
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN_NAV}
9.3 NAS 管理界面
适用于绿联、群晖、威联通等 NAS 管理界面:
services:
cloudflared-nas:
<<: *cloudflared_defaults
container_name: cloudflared-nas
env_file:
- .env
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN_NAS}
10. 总结
10.1 部署要点
| 步骤 | 操作 |
|---|---|
| 1. 创建隧道 | 在 Cloudflare Zero Trust 创建 |
| 2. 配置 Token | 写入 .env 文件 |
| 3. 部署服务 | docker compose up -d |
| 4. 验证连接 | 检查日志和访问状态 |
10.2 优势回顾
- ✅ 无需公网 IP
- ✅ 零端口暴露
- ✅ 自动 HTTPS
- ✅ 免费使用
- ✅ 稳定可靠
10.3 注意事项
- 请勿将 Token 提交到版本控制
- 定期更新 cloudflared 镜像
- 监控资源使用情况
- 保持配置文件备份
延伸阅读:
本文由人工智能协会整理
2026 年 3 月
评论交流
欢迎留下你的想法