⛅️Cloudflare Tunnel
约 903 字大约 3 分钟
CloudflareIntranet Penetration
2025-12-18
Cloudflare Tunnel 是免费的内网穿透方案,无需公网 IP,通过安全隧道将本地服务暴露到互联网。
原理概述
传统内网穿透需要公网 IP 或端口映射,Cloudflare Tunnel 反转这一逻辑:
- 本地主动外连:
cloudflared主动连接 Cloudflare 边缘节点 - 无入站端口:本地防火墙无需开放任何端口
- 流量代理:用户请求先到 Cloudflare,再通过隧道转发到本地
核心优势
| 特性 | 说明 |
|---|---|
| 无需公网 IP | 适用于家庭宽带、NAT 网络 |
| 零配置防火墙 | 无入站端口,减少攻击面 |
| 自动 HTTPS | Cloudflare 自动签发证书 |
| 全球加速 | 边缘节点就近接入 |
| 完全免费 | 个人使用无费用 |
快速部署
安装 cloudflared
# macOS brew install cloudflared # Windows winget install Cloudflare.cloudflared # Linux curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared chmod +x cloudflared登录 Cloudflare
cloudflared tunnel login浏览器自动打开授权页面,选择要使用的域名
创建隧道
cloudflared tunnel create my-tunnel配置 DNS
cloudflared tunnel route dns my-tunnel app.example.com编写配置文件
创建
~/.cloudflared/config.yml:tunnel: my-tunnel credentials-file: /path/to/credentials.json ingress: - hostname: app.example.com service: http://localhost:3000 - service: http_status:404启动隧道
cloudflared tunnel run my-tunnel
Docker Compose 部署
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel run
environment:
- TUNNEL_TOKEN=your-tunnel-token使用 Dashboard 创建隧道可直接获取 Token,无需本地配置文件。
多服务路由
单个隧道可代理多个服务:
ingress:
- hostname: app.example.com
service: http://localhost:3000
- hostname: api.example.com
service: http://localhost:8080
- hostname: ssh.example.com
service: ssh://localhost:22
- service: http_status:404 # 兜底规则,必须存在常见问题
隧道断开后能自动重连吗?
能。cloudflared 内置重连机制,网络恢复后自动重建隧道。
与 frp/ngrok 相比如何?
- frp:需自建服务端,可控性强
- ngrok:免费版域名随机,付费较贵
- Cloudflare Tunnel:免费、稳定、自带 CDN 和 DDoS 防护
支持 TCP/UDP 吗?
支持。可代理 SSH、RDP、Minecraft 等非 HTTP 协议。
延伸阅读
Cloudflare Tunnel 文档
官方配置与 API 参考
Q&A
Cloudflare Edge 是什么?
Cloudflare 在全球 300+ 城市部署的边缘节点服务器。用户访问域名时,DNS 解析到最近的边缘节点,再通过隧道转发到本地 cloudflared。
域名映射需要在 Cloudflare 上配置吗?
两种方式:
- Dashboard 配置(推荐):在 Zero Trust 网页上配置,本地只需运行
cloudflared tunnel run --token YOUR_TOKEN - 本地配置文件:编写
~/.cloudflared/config.yml,映射关系写在本地
Dashboard 方式更简单,改域名、加服务都在网页上操作。
除了 Immich,其他 Docker 应用也能用吗?
任何能通过端口访问的服务都可以:
| 应用 | 本地端口 | 配置的 Service |
|---|---|---|
| Immich | 2283 | http://localhost:2283 |
| Jellyfin | 8096 | http://localhost:8096 |
| Home Assistant | 8123 | http://localhost:8123 |
| Nextcloud | 11000 | http://localhost:11000 |
一个隧道可添加多个 Public Hostname,分别指向不同端口。
本地需要部署什么?
需要运行 cloudflared 客户端。推荐 Docker 部署:
services:
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel run
environment:
- TUNNEL_TOKEN=your-tunnel-tokencloudflared 是连接 Cloudflare 边缘节点和本地服务的桥梁,必须在本地运行。
