Cloudflare Tunnel 配置速查:把本地服务安全暴露到公网,一行端口转发都不用配
结论先行:想把本地或内网服务(开发环境、Home Lab、Docker 容器)安全暴露到公网,且不想在路由器折腾端口映射与动态 DDNS,首选 Cloudflare Tunnel。由本机轻量守护进程主动向 Cloudflare 边缘建立加密出站,服务器公网 IP 与入站端口(80/443/22)全程零暴露,自动获赠全球 CDN 加速、免费 SSL 证书与 DDoS 防御,个人 50 席位内完全免费。
0、写在前面
出海做独立开发,你的本地机器或私有小主机常常跑着各类服务:正在调试的 Web 客户端、Home Lab 控制面板、跑在 Docker 里的自动化运维脚本、或者是私有数据库。
要将它们安全、稳定地暴露至公网供客户验收或外部调用,传统方案极其繁琐:
- 路由器端口映射:把外网 80/443 转发给内网设备,家庭宽带还常遭运营商封锁常用端口
- 动态域名解析(DDNS):家庭 IP 频繁刷新,解析同步存在延迟
- SSL 证书申请与定时续签:配置 Let’s Encrypt 证书并写 cron 脚本
- 安全风险暴露:在公网全端口敞开,数分钟内就会招来全球自动化扫描器的字典爆破
Cloudflare Tunnel(旧称 Argo Tunnel)颠覆了这一被动接收流量的模型:
本地服务器主动向 Cloudflare 边缘网络建立出站加密长连接,由 Cloudflare 负责全球路由调度与安全过滤。本地机器在防火墙上关闭全部入站端口,真实公网 IP 完全被隐藏。
本指南提供一份生产级配置速查,助你在 10 分钟内完成全套落地。
1、期望目标与落地清单
阅读并实践本指南后,你将完成以下实操目标:
- [ ] 域名接入:完成域名在 Cloudflare 上的托管与 DNS 托管就绪
- [ ] 极速部署:使用开源脚本或手动流程,一键安装
cloudflared守护进程 - [ ] 隧道认证:完成跨端鉴权或通过 Zero Trust Token 免登录绑定
- [ ] 路由编排:编写基于域名与 URL 前缀匹配的
ingress路由表 - [ ] HTTPS 验证:无证书配置负担,公网无缝接入 TLS 端到端加密访问
- [ ] 服务守护:注册为 systemd 系统级服务,实现宕机重启与开机自愈
2、计划思考与原理架构
传统穿透方案 vs Cloudflare Tunnel
工作原理解析
3、操作步骤
3.1 一键极速部署(推荐):使用 ITTinker 开源自动化脚本
如果你在 Linux(Ubuntu / Debian / CentOS / Rocky)环境下部署,可以直接使用 ITTinker 维护的开源自动化工具 cloudflare-tunnel-setup。
为什么优先推荐该脚本?
- 0 端口暴露:系统防火墙不需要开放 80 / 443 甚至 22 端口,所有流量均由本地向 Cloudflare 主动建立出站连接。
- 无公网 IP 限制:家用 NAS、开发笔记本或无独立 IPv4 的低配小鸡均可瞬时接入。
- 防止 IP 封锁与端口扫描:外部黑客无法嗅探到源站的真实 IP 与内部架构。
快速使用命令
登录 Cloudflare Zero Trust 控制台获取 Tunnel Token 后,直接在终端执行:
1 | sudo bash setup.sh --token "你的Cloudflare_Tunnel_Token" |
该脚本将自动执行以下动作:
- 校验当前机器系统架构并下载最新官方
cloudflared二进制包 - 安装至
/usr/local/bin/cloudflared并赋权 - 生成并配置 systemd 守护进程单元,注入你的 Token
- 启动服务并设置开机自启,输出当前运行状态日志
3.2 手动标准部署流程(CLI 本地化配置)
如果你偏好完全手动管理配置文件或将配置纳入 Git 仓库,可遵循以下标准 CLI 流程。
步骤一:安装客户端
Ubuntu / Debian:
1 | sudo mkdir -p --mode=0755 /usr/share/keyrings |
macOS:
1 | brew install cloudflare/cloudflare/cloudflared |
验证版本:
1 | cloudflared --version |
步骤二:登录与授权
1 | cloudflared tunnel login |
执行后终端会打印认证 URL。在浏览器中打开并选择已接入 Cloudflare 的域名进行授权。授权完成后,Cloudflare 会在 ~/.cloudflared/cert.pem 保存证书秘钥。
步骤三:创建命名隧道
1 | cloudflared tunnel create dev-tunnel |
终端返回如下信息:
1 | Tunnel credentials written to /home/developer/.cloudflared/4e0b5182-3d89-4e0e-9271-92b0c48e89f1.json |
请妥善保存返回的 Tunnel ID 以及生成的凭据文件路径。
步骤四:编写 Ingress 路由规则
创建主配置文件 /etc/cloudflared/config.yml:
1 | sudo mkdir -p /etc/cloudflared |
写入精细化分流规则:
1 | # 隧道 ID(替换为你实际生成的 UUID) |
将家目录下的凭据文件同步到系统目录并赋权:
1 | sudo cp ~/.cloudflared/*.json /etc/cloudflared/ |
语法自检:
1 | cloudflared tunnel ingress validate /etc/cloudflared/config.yml |
步骤五:绑定 DNS 记录
将定义的子域名通过 CNAME 自动挂载到隧道上:
1 | cloudflared tunnel route dns dev-tunnel app.yourdomain.com |
执行后,Cloudflare DNS 列表中会自动注入对应的 CNAME 记录,指向 4e0b5182-xxxx.cfargotunnel.com。
步骤六:注册系统服务与自启动
1 | sudo cloudflared service install |
3.3 特殊场景进阶实战
1. 穿透私有 HTTPS 接口(跳过自签证书检验)
若本地服务自身已启用自签 TLS 证书,直接转发会触发证书校验失败。在 originRequest 中显式忽略即可:
1 | - hostname: internal-nas.yourdomain.com |
2. 结合 Cloudflare Access 挂载零信任认证网关
针对 monitor.yourdomain.com 这类内部管理面板,无需在应用代码层编写登录鉴权,可直接在 Cloudflare 控制台添加零信任防护:
- 登录 Cloudflare 控制台,进入 Zero Trust → Access → Applications
- 点击 Add an Application,选择 Self-hosted
- 填入域名
monitor.yourdomain.com - 配置 Policy:设置只允许指定邮箱后缀(如
@yourcompany.com)输入一次性验证码(PIN)或通过 GitHub / Google SSO 登录访问
在用户到达你的本地服务之前,非法请求已在 Cloudflare 边缘节点被拦截,构建起高强度的防线。
4、总结与生产核对清单
核心收益回顾
- 绝对的源站隐匿性:由于不依赖端口监听与入站映射,全网无从推演源站真实物理 IP。
- 极低的运维损耗:告别 Nginx 反向代理手写 SSL 证书与定时脚本刷新。
- 零信任能力外挂:随开随用的 Access 认证,为任何未加鉴权的本地 Demo 瞬间穿上企业级防弹衣。
生产核对清单
- [ ] 域名已接入 Cloudflare 且 SSL/TLS 加密模式设置为 Full 或 Full (Strict)
- [ ] 生产机上使用
chmod 600保护credentials-file,严禁提交进公共 Git 仓库 - [ ] Ingress 规则文件最后一行保留且仅保留一条
- service: http_status:404兜底规则 - [ ] 本地服务监听地址若设为
127.0.0.1,确保cloudflared跑在同一宿主机系统网络中 - [ ] 使用
systemctl status cloudflared确认守护进程常驻并具备自愈能力
5、常见异常排查手册
Q1:访问域名提示 Error 502 Bad Gateway?
排查方向:
- 本地服务尚未运行或端口未在监听:执行
curl -I http://localhost:3000验证。 - 端口号配置不符:检查
/etc/cloudflared/config.yml中的端口配置与本地实际监听端口是否完全对齐。
Q2:访问域名提示 Error 1033: Argo Tunnel error?
排查方向:
cloudflared守护进程意外崩溃或未启动:执行sudo systemctl status cloudflared查看进程状态。- 本地网络向外阻断了 UDP/TCP 7844 端口:确认出站网络未受极端防火墙封锁。
Q3:本地是 HTTPS 服务,访问报 x509: certificate signed by unknown authority?
排查方向:
- 本地自签证书未被上游信任。在
config.yml中对应服务下方加入:1
2originRequest:
noTLSVerify: true
6、FAQ(独立开发者核心问答)
Q1:Cloudflare Tunnel 对上传大文件有限制吗?
受 Cloudflare 免费计划边缘代理限制,通过免费 CDN 边缘代理的单次 HTTP POST 请求体上限默认为 100MB。对于大文件分发或大体积数据上传,可开启分片直传或利用私有存储桶预签名 URL。
Q2:没有已购买的独立域名,能直接用吗?
可以。终端直接执行 cloudflared tunnel --url http://localhost:8080(Quick Tunnel 模式),Cloudflare 会自动即时下发一个临时 *.trycloudflare.com 地址,适合 5 分钟内的紧急联调。
Q3:可以用一条隧道穿透跨网段的局域网其他主机吗?
可以。在同一局域网的 Linux 宿主机上部署 cloudflared,Ingress 规则中的 service 直接填写同局域网其他机器的内网 IP 即可(例如 service: http://192.168.1.120:8080)。
相关资源与开源仓库
- Cloudflare Tunnel 官方架构文档:https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/
- ITTinker 自动化工具箱:
cloudflare-tunnel-setup- Cloudflare Tunnel 自动化部署与托管脚本cloudflare-domain-baseline- Cloudflare 域名黄金实践基线配置脚本
