Featured image of post 用 Cloudflare Tunnel 把 VPS 上的自建应用安全暴露,无需开放端口

用 Cloudflare Tunnel 把 VPS 上的自建应用安全暴露,无需开放端口

手把手教你用 Cloudflare Tunnel 将 VPS 上的 Docker 应用、Web 服务安全暴露到公网,无需配置 Nginx 反向代理、无需开放端口、自带免费 SSL。适合 Self-Hosted 爱好者。

如果你有自己的 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(推荐新手)

  1. 登录 Cloudflare Zero Trust Dashboard
  2. 进入 NetworksTunnels
  3. 点击 Create a tunnel
  4. 选择 Cloudflared 连接方式
  5. 给 Tunnel 起个名字,比如 my-vps-tunnel
  6. 复制安装命令(长这样):
cloudflared service install eyJhIjoiYTBiY2RlZ...
  1. 在 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 创建完成后:

  1. 进入 Tunnel 详情页
  2. 点击 Public Hostname 标签
  3. 填写域名(如 cloud.example.com
  4. 选择服务类型(HTTP/HTTPS/TCP/SSH)
  5. 填写服务地址(如 localhost:8080
  6. 点击 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:监控面板暴露给团队,但不想让外人看到?

设置步骤

  1. 在 Cloudflare Zero Trust Dashboard 进入 AccessApplications
  2. 点击 Add an applicationSelf-hosted
  3. 填写应用名称和域名
  4. 选择身份验证方式:
    • Email(最简单,用户收到验证邮件)
    • Google/Microsoft/SSO(适合团队)
    • GitHub(适合开发者)
  5. 保存后,访问你的域名就会弹出登录页面

常见故障排查

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 免费计划的限制:

限制项免费计划付费计划
隧道数量10001000
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 使用,比如:


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.