很多站长和开发者都有这样的需求:在本地或内网运行了一个服务(比如博客、API、管理面板),想从外网访问,但没有公网 IP,或者不想暴露服务器的真实 IP。Cloudflare Tunnel 就是解决这个问题的最佳方案之一——而且完全免费。
什么是 Cloudflare Tunnel
Cloudflare Tunnel(原名 Argo Tunnel)是 Cloudflare 提供的一个免费工具,它可以在你的本地服务器和 Cloudflare 的网络之间建立一条加密隧道。通过这条隧道,外部用户可以通过你绑定的域名访问本地服务,而你的服务器不需要有公网 IP,也不需要开放任何端口。
核心优势:
- 免费:Cloudflare Tunnel 本身免费,只需要一个域名和一个 Cloudflare 账号
- 安全:不需要暴露服务器真实 IP,所有流量经过 Cloudflare 的网络
- 简单:不需要配置防火墙、端口转发、NAT 穿透
- 自动 HTTPS:自动为你的域名配置 SSL 证书
- 支持 Docker:可以容器化部署,管理更方便
准备工作
- 一个域名(可以是免费域名,但需要能修改 NS 记录)
- 一个 Cloudflare 账号(免费注册)
- 域名的 DNS 托管在 Cloudflare 上
- 一台能运行服务的机器(本地电脑、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 等工具,它不需要额外的服务器,不需要配置反向代理,而且完全免费。对于需要从外网访问本地服务的站长来说,这几乎是最佳选择。
来源:















暂无评论内容