用Cloudflare Tunnel免端口暴露内网服务:零成本内网穿透方案详解

传统的服务器部署方式需要在防火墙上开放 80/443 端口,真实 IP 暴露给全网扫描。而内网穿透场景(如将本地开发服务、家庭 NAS、内部管理后台暴露到公网)往往需要购买中转服务器或付费的穿透服务。Cloudflare Tunnel 提供了一个完全不同的思路:服务器主动向 Cloudflare 建立出站隧道,不需要开放任何入站端口,安全性大幅提升,且完全免费。本文提供完整的配置实战教程。


一、Cloudflare Tunnel 的工作原理

传统方式:用户 → 公网IP:443 → 服务器(需要开放入站端口,IP 暴露)

Cloudflare Tunnel 方式:

用户 → Cloudflare CDN → Tunnel(出站连接) → 服务器本地端口

核心差别:服务器上运行的 cloudflared 守护进程主动向 Cloudflare 发起出站连接建立隧道。用户的请求经过 Cloudflare 后,通过这条隧道传递到服务器。整个过程中:

  • 服务器不需要开放任何入站端口(80、443 都可以关闭)
  • 服务器真实 IP 完全隐藏在 Cloudflare 背后
  • 自动获得 HTTPS 和 DDoS 防护(Cloudflare 处理)
  • 完全免费(Cloudflare Zero Trust 免费套餐包含 Tunnel 功能)

二、适用场景

  • 🏠 内网穿透:将家庭 NAS、本地开发服务器、树莓派等暴露到公网,无需公网 IP
  • 🔒 隐藏真实 IP:防止服务器 IP 被 DDoS 攻击者直接发现
  • 🛠️ 本地开发预览:将 localhost 上的开发中应用临时暴露给客户演示
  • 🖥️ 内部管理后台安全访问:结合 Cloudflare Access,只允许特定用户访问后台
  • 🚀 无需配置 Nginx/SSL:Cloudflare 自动处理 HTTPS,简化部署流程

三、前置条件

  • 一个已托管在 Cloudflare 的域名(免费注册 Cloudflare 账号后添加域名即可)
  • 服务器或本地机器(Linux/macOS/Windows 均支持)
  • 服务器上运行的 Web 服务(如 Nginx 监听 3000 端口的 Node.js 应用)

四、安装 cloudflared

Linux(Ubuntu/Debian)

# 添加 Cloudflare APT 仓库
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb

# 验证安装
cloudflared --version

macOS

brew install cloudflared

Windows

从 Cloudflare 官方 GitHub Releases 页面下载 cloudflared-windows-amd64.exe,重命名为 cloudflared.exe 并添加到 PATH。


五、方法一:命令行快速创建临时隧道(无需登录,适合开发调试)

# 将本地 3000 端口临时暴露到公网(生成随机 trycloudflare.com 子域名)
cloudflared tunnel --url http://localhost:3000

命令运行后会输出一个类似 https://random-name.trycloudflare.com 的公网地址,任何人都可以通过这个地址访问你本地 3000 端口的服务。按 Ctrl+C 停止后链接失效。

这个方式无需 Cloudflare 账号,无需域名,适合临时演示或测试。


六、方法二:创建持久化命名隧道(生产环境推荐)

Step 1:登录 Cloudflare 账号

cloudflared tunnel login
# 会在浏览器打开 Cloudflare 授权页面,完成授权后证书保存到本地

Step 2:创建命名隧道

# 创建一个名为 "my-server" 的隧道
cloudflared tunnel create my-server

# 输出示例:
# Created tunnel my-server with id abc123de-xxxx-xxxx-xxxx-xxxxxxxxxxxx

记录输出的隧道 ID(UUID格式),后续配置会用到。

Step 3:创建隧道配置文件

sudo mkdir -p /etc/cloudflared
sudo nano /etc/cloudflared/config.yml
tunnel: abc123de-xxxx-xxxx-xxxx-xxxxxxxxxxxx    # 你的隧道ID
credentials-file: /root/.cloudflared/abc123de-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json

ingress:
  # 规则一:将 app.yourdomain.com 路由到本地 3000 端口
  - hostname: app.yourdomain.com
    service: http://localhost:3000

  # 规则二:将 admin.yourdomain.com 路由到本地 8080 端口
  - hostname: admin.yourdomain.com
    service: http://localhost:8080

  # 规则三:将 static.yourdomain.com 路由到本地文件(静态文件服务)
  # - hostname: static.yourdomain.com
  #   service: http://localhost:9000

  # 默认规则(必须存在,处理不匹配的请求)
  - service: http_status:404

Step 4:在 Cloudflare DNS 中添加 CNAME 记录

# 自动创建 DNS CNAME 记录(推荐)
cloudflared tunnel route dns my-server app.yourdomain.com
cloudflared tunnel route dns my-server admin.yourdomain.com

或者手动在 Cloudflare DNS 面板添加:app.yourdomain.com → CNAME → abc123de-xxxx-xxxx-xxxx-xxxxxxxxxxxx.cfargotunnel.com

Step 5:启动隧道

# 测试启动(前台运行,可以看到日志)
cloudflared tunnel run my-server

# 访问 https://app.yourdomain.com 测试是否正常

七、设置 cloudflared 为系统服务(开机自启)

# 安装为 systemd 服务
sudo cloudflared service install

# 启动服务
sudo systemctl start cloudflared
sudo systemctl enable cloudflared

# 查看运行状态
sudo systemctl status cloudflared

设置完成后,服务器重启后隧道会自动重新建立连接,无需人工干预。


八、进阶:结合 Cloudflare Access 保护内部服务

Cloudflare Access 可以为通过 Tunnel 暴露的服务添加访问控制,只有通过身份验证的用户才能访问:

  1. 登录 Cloudflare Zero Trust 控制台(one.dash.cloudflare.com
  2. 进入 Access → Applications → Add an application
  3. 选择 "Self-hosted",填写你的应用 URL(如 admin.yourdomain.com
  4. 配置访问策略:允许指定邮箱域名(如只允许 @yourcompany.com 邮箱登录)
  5. 用户访问时,Cloudflare 会要求发送验证码到邮箱,验证通过后才能访问

这个方案特别适合将后台管理页面(如 Grafana、phpMyAdmin、内部工具)安全暴露,无需 VPN,任何地方通过浏览器即可访问,但只有授权用户才能通过验证。


九、常见问题排查

隧道无法建立连接

# 检查 cloudflared 日志
sudo journalctl -u cloudflared -n 50

# 测试 cloudflared 能否连接 Cloudflare
cloudflared tunnel ingress validate

访问显示 502 Bad Gateway

说明隧道建立成功,但本地服务未运行或端口错误。检查:

# 确认本地服务正在运行
ss -tlnp | grep 3000   # 检查 3000 端口是否在监听

HTTPS 证书问题

Cloudflare Tunnel 自动处理 HTTPS,你的本地服务只需用 HTTP 即可,Cloudflare 会在边缘自动加密。


总结

Cloudflare Tunnel 是目前最优雅的内网穿透和 IP 隐藏方案,核心优势:

  • 🔒 零端口暴露:服务器防火墙可以完全关闭入站端口
  • 🌐 自动 HTTPS:无需申请 SSL 证书,Cloudflare 自动处理
  • 🛡️ DDoS 防护:流量经过 Cloudflare 清洗,真实 IP 隐藏
  • 💰 完全免费:Cloudflare Zero Trust 免费套餐足够大多数场景使用

无论是部署在后浪云香港云服务器上的生产服务,还是本地开发环境,Cloudflare Tunnel 都是提升安全性和访问便利性的绝佳工具。

THE END