如果你有自己的 VPS 并跑着 Docker 容器(Nextcloud、Home Assistant、n8n、WordPress),你一定遇到过这个问题:怎么从外网安全访问这些服务?
传统做法是配置 Nginx 反向代理 + Let’s Encrypt SSL 证书 + 防火墙开放 80/443 端口。听起来简单,实际操作中 SSL 过期、端口冲突、DDoS 攻击、IP 被封……每个坑都够新手折腾几天。
Cloudflare Tunnel 是另一种思路:完全不需要开放任何端口,不需要配置 Nginx,自带免费 SSL,还能蹭到 Cloudflare 的全球 CDN 和 DDoS 防护。
今天这篇手把手教程,带你用 Cloudflare Tunnel 把 VPS 上的自建服务安全暴露到公网。整个过程不超过 15 分钟。
先准备好什么
| 需要什么 | 说明 | 花费 |
|---|---|---|
| 一台 VPS | 推荐 1GB 内存以上的服务器 | RackNerd 2GB 套餐 $3/月 点击查看 |
| Cloudflare 账号 | 免费注册即可 | 免费 |
| 一个域名 | 可以在 Cloudflare 上买,也可以从别的 registrar 迁移 | ~$10/年 |
| Docker(可选) | 用于运行 Web 应用 | 免费 |
💡 VPS 选择建议: Cloudflare Tunnel 本身资源消耗极低(cloudflared 进程通常只占 10-30MB 内存),所以 1GB 内存的 VPS 就能跑多个隧道。但如果你还打算在 VPS 上跑 Docker 应用,建议直接选 RackNerd 2GB 套餐,性价比最高。
Cloudflare Tunnel 是什么?和 Nginx 有什么区别?
Cloudflare Tunnel(原名 Argo Tunnel)的核心原理是:在你的服务器和 Cloudflare 边缘节点之间建立一个加密的出站连接。
换句话说,流量是这样的:
用户 → Cloudflare 全球网络 → 加密隧道 → 你的 VPS 本地服务
你的 VPS 不需要开放任何端口,因为连接是从 VPS 主动发起的出站连接(通常走 443 端口,几乎所有防火墙都放行)。
和 Nginx 反向代理对比
| 特性 | Nginx 反向代理 | Cloudflare Tunnel |
|---|---|---|
| 需要开放端口 | 是(80/443) | 否(出站连接即可) |
| SSL 证书 | 需手动配置/续期 | Cloudflare 自动管理 |
| 防火墙配置 | 需配置 iptables/UFW | 无需配置 |
| DDoS 防护 | 需额外配置 | 自带 Cloudflare 防护 |
| 公网 IP 暴露 | 你的服务器 IP 直接暴露 | 你的服务器 IP 完全隐藏 |
| 免费额度 | 完全免费 | 免费计划:1000 个隧道、500 个 Access 应用 |
| 性能 | 本地处理,延迟低 | 经过 Cloudflare 网络,全球 CDN 加速 |
| 适合场景 | 高性能生产环境 | Self-Hosted、个人项目、测试环境 |
结论: 个人项目、Self-Hosted 场景,Cloudflare Tunnel 是更好的选择。生产级高流量场景,Nginx 可能更合适。
第一步:安装 Cloudflared
cloudflared 是 Cloudflare Tunnel 的命令行客户端,运行在你的 VPS 上。
在 Ubuntu/Debian 上:
# 添加 Cloudflare 官方 GPG 密钥和仓库
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 update && sudo apt install cloudflared
安装完成后验证:
cloudflared --version
# 输出类似:cloudflared version 2026.x.x (built ...)
如果是 CentOS/RHEL:
sudo rpm -ivh https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
第二步:创建 Tunnel
有两种方式创建 Tunnel:
方式 A:通过 Cloudflare Zero Trust Dashboard(推荐新手)
- 登录 Cloudflare Zero Trust Dashboard
- 进入 Networks → Tunnels
- 点击 Create a tunnel
- 选择 Cloudflared 连接方式
- 给 Tunnel 起个名字,比如
my-vps-tunnel - 复制安装命令(长这样):
cloudflared service install eyJhIjoiYTBiY2RlZ...
- 在 VPS 上运行这条命令
方式 B:通过命令行(推荐进阶用户)
# 登录 Cloudflare(需要 API Token)
cloudflared tunnel login
# 创建隧道
cloudflared tunnel create my-vps-tunnel
# 输出类似:
# Created tunnel my-vps-tunnel with id abc123def456
第三步:配置 DNS 和路由
创建 DNS 记录
在你的 Tunnel 配置中(YAML 文件),定义哪些域名要映射到哪些本地服务:
# ~/.cloudflared/<tunnel-id>.json 或 /etc/cloudflared/config.yml
tunnel: abc123def456
credentials-file: /root/.cloudflared/<tunnel-id>.json
ingress:
# 主域名 → Docker 中的 Nextcloud
- hostname: cloud.example.com
service: http://localhost:8080
# 子域名 → Docker 中的 Home Assistant
- hostname: home.example.com
service: http://localhost:8123
# 默认规则 → 404
- service: http_status:404
通过 Dashboard 创建 DNS 记录
如果你用的是方式 A(Dashboard),在 Tunnel 创建完成后:
- 进入 Tunnel 详情页
- 点击 Public Hostname 标签
- 填写域名(如
cloud.example.com) - 选择服务类型(HTTP/HTTPS/TCP/SSH)
- 填写服务地址(如
localhost:8080) - 点击 Save
Cloudflare 会自动添加 DNS CNAME 记录。
第四步:启动 Tunnel 并设为开机自启
通过 systemd 守护
# 方式 A(Dashboard 方式)
sudo cloudflared service install
# 方式 B(命令行方式)
sudo cloudflared service install my-vps-tunnel
启动并启用:
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
查看运行状态:
sudo systemctl status cloudflared
查看日志:
sudo journalctl -u cloudflared -f
第五步:验证你的服务
打开浏览器,访问 https://cloud.example.com。如果一切正常,你应该能看到你的 Docker 容器里运行的应用。
测试连通性:
cloudflared tunnel route dns my-vps-tunnel test.example.com
curl -I https://test.example.com
# 应返回 200 OK
进阶:用 Cloudflare Access 给服务加登录认证
Cloudflare Tunnel 最强大的功能是 Cloudflare Access——它允许你设置基于身份的身份验证(OAuth、SSO、Magic Link 等),让你的自托管应用只有授权用户才能访问。
使用场景
- Nextcloud:不想让全世界扫描到?加一个邮件验证登录
- Home Assistant:远程访问时不想裸奔?加一个 Google/Microsoft 账号登录
- Grafana/Prometheus:监控面板暴露给团队,但不想让外人看到?
设置步骤
- 在 Cloudflare Zero Trust Dashboard 进入 Access → Applications
- 点击 Add an application → Self-hosted
- 填写应用名称和域名
- 选择身份验证方式:
- Email(最简单,用户收到验证邮件)
- Google/Microsoft/SSO(适合团队)
- GitHub(适合开发者)
- 保存后,访问你的域名就会弹出登录页面
常见故障排查
1. 连接失败,日志报 “DNS resolution failed”
# 检查 DNS 配置
cat /etc/resolv.conf
# 确保有有效的 DNS 服务器,添加 Cloudflare DNS 试试:
echo "nameserver 1.1.1.1" | sudo tee -a /etc/resolv.conf
2. Tunnel 频繁断连
# 检查 cloudflared 进程是否正常运行
sudo systemctl status cloudflared
# 查看最近 100 行日志
sudo journalctl -u cloudflared -n 100 --no-pager
3. 访问速度很慢
Cloudflare Tunnel 的流量会经过 Cloudflare 全球网络,通常会有加速效果。如果速度慢,可能是:
- 你的 VPS 到 Cloudflare 节点的网络质量差
- 考虑换一个 Cloudflare 上买了域名的 VPS(同生态网络优化更好)
- 在 Cloudflare Dashboard 检查 Analytics 看是否有流量瓶颈
4. HTTPS 证书报错
Cloudflare 自动管理证书,一般不会有这个问题。如果碰到:
- 确保你的域名 DNS 记录指向 Cloudflare
- 在 Tunnel 配置中不要手动指定
originServerName(除非你有特殊需求)
性能与限制
Cloudflare Tunnel 免费计划的限制:
| 限制项 | 免费计划 | 付费计划 |
|---|---|---|
| 隧道数量 | 1000 | 1000 |
| Access 应用数 | 500 | 更多(依计划而定) |
| 带宽 | 无硬限制 | 无硬限制 |
| DDoS 防护 | 基础 | 高级 |
| 自定义证书 | ❌ | ✅ |
| 日志保留 | 7 天 | 30 天+ |
| 价格 | 免费 | $20/月起 |
对于绝大多数个人 Self-Hosted 用户,免费计划完全够用。即使是小团队,1000 个隧道的上限也非常慷慨。
总结:什么时候该用 Cloudflare Tunnel?
✅ 推荐用 Tunnel 的场景
- 个人博客、Nextcloud、Home Assistant 等 Self-Hosted 服务
- 不想折腾 Nginx、SSL 证书、防火墙规则
- 需要从外网临时访问内网服务
- 希望获得 Cloudflare 的 CDN 和 DDoS 防护
- 想让应用有基本的访问控制(用 Access)
❌ 不推荐用 Tunnel 的场景
- 高并发生产环境(考虑 Nginx + 原生 IP)
- 需要极低延迟的场景(Tunnel 会增加一跳)
- 已有成熟 Nginx 反向代理架构
下一步:搭配 VPS 搭建完整的 Self-Hosted 体系
Cloudflare Tunnel 是你的 VPS 上的自建应用安全暴露到公网的最佳选择。推荐搭配一台便宜稳定的 VPS 使用,比如:
- RackNerd 2GB KVM — $3/月:性价比之王,跑多个 Docker 容器毫无压力
- Hostinger VPS — $4.99/月起:自带管理面板,新手友好
- Vultr Cloud Compute — $2.50/月起:全球节点丰富,性能稳定
FAQ
Q: Cloudflare Tunnel 安全吗?
A: 非常安全。Tunnel 使用 mTLS(双向 TLS)加密通信,你的 VPS 公网 IP 对互联网完全不可见,Cloudflare 充当了反向代理和防火墙的角色。
Q: 需要域名在 Cloudflare 上吗?
A: 不需要。只要你的域名 DNS 可以解析到 Cloudflare(即把 Nameserver 改成 Cloudflare),任何 registrar 买的域名都可以使用 Tunnel。
Q: 一个 Tunnel 可以绑定多个子域名吗?
A: 可以。在 config.yml 中配置多条 ingress 规则即可。
Q: Cloudflare Tunnel 会影响网站速度吗?
A: 通常不会。Cloudflare 的全球 CDN 网络会让访问更快,尤其是当你的 VPS 在海外而用户在另一大洲时。
Q: 我的 VPS 没有公网 IP 怎么办?
A: 只要有出站网络连接就行。Cloudflare Tunnel 使用的是出站连接,所以即使是在 NAT 后面或内网环境也可以正常使用。
免责声明:As an Amazon Associate and an affiliate of various hosting providers, I earn from qualifying purchases. This means if you click on a link and make a purchase, I may receive a small commission at no additional cost to you. I only recommend products and services that I have personally used or thoroughly researched. All opinions and recommendations are my own.
