一、痛点:为什么内网服务暴露这么难?
传统方案的烦恼
很多开发者和个人用户都有这样的困扰:
- 🤖 跑了个 HomeAssistant,想远程控制智能家居
传统做法:
买云服务器 → 配端口映射 → 搞 DDNS → 开防火墙 → 担心被攻击 → 焦虑
每一步都在增加安全风险,而且没有公网 IP 的家庭宽带基本没法玩。
Cloudflared 的颠覆性思路
Cloudflared 换了一个完全不同的角度:
不是让别人连你,而是你主动连出去。
你的内网服务不需要开任何端口,不需要公网 IP。Cloudflared 在本地建立一个出站连接到 Cloudflare 的全球边缘网络,然后 Cloudflare 把你的服务"挂载"到它们的域名下。
核心优势:
- ✅ 自带 HTTPS:自动申请和管理 SSL 证书
- ✅ DDoS 防护:背后是 Cloudflare 的全球 CDN
二、Cloudflared 是什么?
Cloudflared 是 Cloudflare 官方出品的 Tunnel 客户端,GitHub 星标 14,600+,是内网穿透领域的标杆项目。
它的工作原理:
┌─────────────────────────────────────────────────────┐
│ 你的内网环境 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ NAS │ │ Web │ │ API │ │
│ │ :8080 │ │ :3000 │ │ :8000 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ └───────────────┴───────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Cloudflared │ ← 主动出站连接 │
│ │ (Docker 容器) │ │
│ └────────┬────────┘ │
└───────────────────────┼─────────────────────────────┘
│ (出站 HTTPS/WSS)
▼
┌──────────────────┐
│ Cloudflare Edge │ ← 全球 300+ 节点
│ (免费 CDN + DNS) │
└────────┬─────────┘
│
▼
your-site.trycloudflare.com
或 subdomain.yourdomain.com
关键点: 整个过程中,你的内网服务器不需要监听任何外部端口,所有连接都是 Cloudflared 主动向外发起的出站连接。
三、核心特性一览
1. 多种 Tunnel 类型
| |
|---|
| 公共 DNS | |
| 公共 Load Balancer | |
| 私有路由 | |
2. 支持多种协议
- HTTP/HTTPS:Web 应用、API、Dashboard
3. 安全特性
- 🔒 自动 HTTPS:每个 Tunnel 自动获得有效的 SSL 证书
- 🛡️ DDoS 防护:所有流量经过 Cloudflare 边缘网络
- 👤 Zero Trust 集成:支持身份认证、MFA、IP 限制
4. 高可用部署
支持多实例部署,当某个 Tunnel 节点下线时,流量自动切换到其他节点,保证服务不中断。
四、Docker 一键部署
最简单的方式:TryCloudflare
Cloudflare 提供了一个免注册的试用域名 *.trycloudflare.com,适合测试:
# docker-compose.yml
version:"3"
services:
cloudflared:
image:cloudflare/cloudflared:latest
container_name:cloudflared
restart:unless-stopped
command:tunnel--no-autoupdatecloudflaredtry
networks:
-default
ports:
-"8080:8080"# 用于访问 trycloudflare 诊断页面
启动后访问 http://随机生成的.trycloudflare.com 就能看到 Cloudflared 的诊断页面。
正式使用:绑定自有域名
# docker-compose.yml
version:"3"
services:
cloudflared:
image:cloudflare/cloudflared:latest
container_name:cloudflared
restart:unless-stopped
volumes:
-./cloudflared:/etc/cloudflared
command:tunnelrun
networks:
default:
webapp:
networks:
webapp:
driver:bridge
配合 Caddy 一起用
version: "3"
services:
# 你的 Web 应用
myapp:
image:nginx:alpine
networks:
-webapp
# Cloudflared Tunnel
cloudflared:
image:cloudflare/cloudflared:latest
container_name:cloudflared
restart:unless-stopped
volumes:
-./cloudflared:/etc/cloudflared
command:tunnel--config/etc/cloudflared/config.ymlrun
depends_on:
-myapp
networks:
-webapp
# 不需要暴露任何端口!
Caddy 反向代理 + Cloudflared
version: "3"
services:
caddy:
image:caddy:2-alpine
container_name:caddy
restart:unless-stopped
ports:
-"80:80"
-"443:443"
volumes:
-./Caddyfile:/etc/caddy/Caddyfile
-caddy_data:/data
-caddy_config:/config
networks:
-proxy
cloudflared:
image:cloudflare/cloudflared:latest
container_name:cloudflared
restart:unless-stopped
volumes:
-./cloudflared:/etc/cloudflared
command:tunnel--config/etc/cloudflared/config.ymlrun
depends_on:
-caddy
networks:
-proxy
volumes:
caddy_data:
caddy_config:
Caddyfile 配置示例:
yourdomain.com {
reverse_proxy cloudflared:8080
}
五、实际使用场景
场景 1:把 NAS 暴露到外网
cloudflared:
image: cloudflare/cloudflared:latest
command: >
tunnel --no-autoupdate run
--token YOUR_TUNNEL_TOKEN
restart: unless-stopped
配置路由:
# /etc/cloudflared/config.yml
tunnel:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
credentials-file:/etc/cloudflared/xxxx.json
ingress:
-hostname:nas.yourdomain.com
service:http://localhost:5000
-service:http_status:404
效果: 在外网访问 nas.yourdomain.com 就能直接访问家里的群晖 NAS,无需任何端口映射。
场景 2:HomeAssistant 远程访问
ingress:
- hostname: ha.yourdomain.com
service: http://homeassistant.local:8123
- service: http_status:404
配合 Zero Trust 策略,还可以加上身份认证——只有登录了你的 Cloudflare 账号才能访问。
场景 3:SSH 安全远程连接
ingress:
- hostname: ssh.yourdomain.com
service: ssh://localhost:22
# 在外网安全连接
ssh -p 22 user@ssh.yourdomain.com
不需要在防火墙上开 22 端口,SSH 流量通过 Cloudflare 加密隧道传输。
场景 4:API 服务供第三方调用
ingress:
-hostname:api.yourdomain.com
service:http://myapi:3000
-hostname:webhook.yourdomain.com
service:http://webhook:8080
-service:http_status:404
第三方只需要调用 https://api.yourdomain.com,你的服务器完全隐藏在内网后面。
六、安全加固建议
1. 启用 Zero Trust 访问策略
Cloudflare Dashboard → Zero Trust → Access → Policies
设置规则:
2. 使用 Token 认证
# 创建 Tunnel 并获取 Token
cloudflared tunnel create my-tunnel
cloudflared tunnel credentials
# 用 Token 方式运行(无需完整配置)
cloudflared tunnel --no-autoupdate run --token YOUR_TOKEN
3. 多实例高可用
version: "3"
services:
cloudflared-1:
image:cloudflare/cloudflared:latest
command:tunnel--config/etc/cloudflared/config.ymlrun
volumes:
-./cloudflared-1:/etc/cloudflared
cloudflared-2:
image:cloudflare/cloudflared:latest
command:tunnel--config/etc/cloudflared/config.ymlrun
volumes:
-./cloudflared-2:/etc/cloudflared
在不同地域部署多个 Tunnel 实例,自动故障切换。
七、常见问题
Q1:Cloudflared 免费吗?
完全免费。 公共 Tunnel 功能没有任何费用,包括无限 Tunnel 数量、无限 DNS 记录、无限请求。唯一收费的是 Cloudflare Zero Trust 的企业级功能。
Q2:会不会很慢?
Cloudflare 在全球有 300+ 边缘节点,大部分地区的延迟在 10-50ms 以内。对于个人应用、NAS 访问、HomeAssistant 等场景,体验几乎无感知。
Q3:Cloudflare 能看到我的流量吗?
Tunnel 内的流量是端到端加密的。Cloudflare 作为反向代理可以看到请求头,但无法解密你的后端服务与客户端之间的内容(除非你使用不加密的后端服务)。建议始终使用 HTTPS。
Q4:和 frp / ngrok 比有什么优势?
最大优势: 不需要自己维护中继服务器,Cloudflare 帮你搞定一切。
Q5:国内能用吗?
Cloudflare 的边缘节点在国内的覆盖有限,延迟可能较高。但对于海外用户访问或对延迟不敏感的场景(如 NAS 管理、HomeAssistant 控制),完全够用。如果对国内访问速度有要求,可以考虑搭配 CDN 或使用其他方案。
八、总结
Cloudflared 改变了我们暴露内网服务的方式。它用最简单的思路解决了最复杂的问题:
你不需要打开任何端口,不需要公网 IP,不需要维护中继服务器。
核心价值:
如果你有一台内网服务想暴露到外网,或者厌倦了折腾端口映射和 DDNS,Cloudflared 值得你花 10 分钟试试。
有时候,最好的安全措施就是——什么都不开。
🔥 行动建议: 打开 Docker Compose,粘贴上面的配置,5 分钟内让你的服务安全地上线。
先到 Cloudflare Tunnel 文档[1] 注册你的第一个 Tunnel,然后回来跑 Docker。
该文章在 2026/7/6 16:47:43 编辑过