Cloudflare Tunnel 免费暴露本地服务教程:不用公网 IP 也能对外提供服务

很多站长和开发者都有这样的需求:在本地或内网运行了一个服务(比如博客、API、管理面板),想从外网访问,但没有公网 IP,或者不想暴露服务器的真实 IP。Cloudflare Tunnel 就是解决这个问题的最佳方案之一——而且完全免费。

什么是 Cloudflare Tunnel

Cloudflare Tunnel(原名 Argo Tunnel)是 Cloudflare 提供的一个免费工具,它可以在你的本地服务器和 Cloudflare 的网络之间建立一条加密隧道。通过这条隧道,外部用户可以通过你绑定的域名访问本地服务,而你的服务器不需要有公网 IP,也不需要开放任何端口。

核心优势:

  • 免费:Cloudflare Tunnel 本身免费,只需要一个域名和一个 Cloudflare 账号
  • 安全:不需要暴露服务器真实 IP,所有流量经过 Cloudflare 的网络
  • 简单:不需要配置防火墙、端口转发、NAT 穿透
  • 自动 HTTPS:自动为你的域名配置 SSL 证书
  • 支持 Docker:可以容器化部署,管理更方便

准备工作

  1. 一个域名(可以是免费域名,但需要能修改 NS 记录)
  2. 一个 Cloudflare 账号(免费注册)
  3. 域名的 DNS 托管在 Cloudflare 上
  4. 一台能运行服务的机器(本地电脑、VPS、树莓派都可以)

方法一:使用 cloudflared 命令行

1. 安装 cloudflared

# Debian/Ubuntu
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb

# CentOS/RHEL
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm -o cloudflared.rpm
sudo rpm -i cloudflared.rpm

# macOS
brew install cloudflared

# Docker
docker pull cloudflare/cloudflared

2. 登录 Cloudflare

cloudflared tunnel login

这会打开浏览器,让你选择要管理的域名。登录成功后,证书会保存在本地。

3. 创建隧道

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

# 记录返回的隧道 ID(类似 550e8400-e29b-41d4-a716-446655440000)

4. 配置 DNS 路由

# 将 tunnel.example.com 指向你的隧道
cloudflared tunnel route dns my-tunnel tunnel.example.com

5. 创建配置文件

# ~/.cloudflared/config.yml
tunnel: 550e8400-e29b-41d4-a716-446655440000
credentials-file: /root/.cloudflared/550e8400-e29b-41d4-a716-446655440000.json

ingress:
  - hostname: tunnel.example.com
    service: http://localhost:8080
  - service: http_status:404

这个配置的含义是:当用户访问 tunnel.example.com 时,请求会被转发到本地的 localhost:8080。最后一条规则是默认路由,所有不匹配的请求返回 404。

6. 启动隧道

cloudflared tunnel run my-tunnel

现在访问 https://tunnel.example.com 就能看到你的本地服务了!

方法二:Docker 部署(推荐)

使用 Docker 部署更简单,也更容易管理:

# docker-compose.yml
version: '3'
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    environment:
      - TUNNEL_TOKEN=your-tunnel-token
    volumes:
      - cloudflared-data:/root/.cloudflared

volumes:
  cloudflared-data:

如果你使用 DockFlare(一个自动化管理 Cloudflare Tunnel 的 Docker 工具),可以通过 Docker Labels 自动创建和管理隧道:

# 在你的服务容器上添加 labels
labels:
  - "cloudflare.tunnel.enable=true"
  - "cloudflare.tunnel.hostname=app.example.com"
  - "cloudflare.tunnel.service=http://localhost:8080"

多服务配置

一个隧道可以代理多个服务:

# config.yml
tunnel: your-tunnel-id
credentials-file: /root/.cloudflared/your-tunnel-id.json

ingress:
  - hostname: blog.example.com
    service: http://localhost:80
  - hostname: api.example.com
    service: http://localhost:3000
  - hostname: admin.example.com
    service: http://localhost:8080
  - service: http_status:404

安全建议

  • 结合 Cloudflare Access:为管理面板等敏感服务添加身份验证
  • 限制访问 IP:在 Cloudflare 控制面板中设置 IP 白名单
  • 监控流量:定期查看 Cloudflare Analytics,发现异常流量
  • 使用 Service Auth:对于 API 服务,使用 Cloudflare Service Token 进行认证

常见问题

Q: 免费版有什么限制?

A: Cloudflare Tunnel 免费版没有带宽限制,但有并发连接数限制。对于个人站点和小型项目完全够用。

Q: 能代理 TCP/UDP 服务吗?

A: 可以,Cloudflare 支持 TCP 和 UDP 隧道,但需要企业版。免费版主要支持 HTTP/HTTPS。

Q: 延迟怎么样?

A: 因为流量经过 Cloudflare 的全球网络,延迟会比直连略高,但对于 Web 应用来说影响不大。

简评

Cloudflare Tunnel 是目前最优雅的内网穿透方案之一。相比 frp、ngrok 等工具,它不需要额外的服务器,不需要配置反向代理,而且完全免费。对于需要从外网访问本地服务的站长来说,这几乎是最佳选择。

来源:

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容