Cloudflare Tunnel 实战:在 Debian 12 上免公网 IP 安全暴露内网服务
为什么用 Cloudflare Tunnel
家里或公司内网的 Debian 机器,或者没有公网 IP 的云服务器,想把一个本地服务(比如自建笔记、文件同步、开发中的 Web 应用)安全地暴露出去,传统做法是:买公网 IP、开防火墙端口、申请证书、配反向代理。一套下来既花钱又要维护,安全暴露面还被动放大。
Cloudflare Tunnel(cloudflared)的思路是反过来的:服务器主动向 Cloudflare 边缘建立出站的加密隧道(基于 QUIC),外部流量通过你绑定的域名经 Cloudflare 网络进入隧道,再转发到内网服务。好处很实在:
- 不需要公网 IP,机器在 NAT 后面也能工作;
- 不对外开放任何入站端口,扫描器扫不到你;
- HTTPS 由 Cloudflare 自动终结,不用自己申请和续期证书;
- 可以叠加 Cloudflare Access 做身份验证,相当于给内网服务加了一道登录门。
准备工作
- 一台 Debian 12(bookworm)机器,能访问互联网即可;
- 一个已接入 Cloudflare 的域名(把 NS 切换到 Cloudflare,免费计划就够用);
- 一个 Cloudflare 账号。
先把系统更新到最新,并从官方仓库安装 cloudflared:
sudo apt update && sudo apt upgrade -y
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bookworm main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install -y cloudflared
cloudflared --version
创建并配置隧道
先登录授权(会打开浏览器做 OAuth,无桌面环境的机器可以用复制链接的方式完成):
cloudflared tunnel login
这会在 ~/.cloudflared/ 生成 cert.pem。然后创建命名隧道:
cloudflared tunnel create deb-tunnel
编写配置文件 ~/.cloudflared/config.yml:
tunnel: <隧道 ID>
credentials-file: /root/.cloudflared/<隧道 ID>.json
ingress:
- hostname: notes.example.com
service: http://localhost:8080
- hostname: ssh.example.com
service: ssh://localhost:22
- service: http_status:404
关键点:ingress 按顺序匹配,第一条命中的规则生效;最后一条兜底规则必须写,否则 cloudflared 拒绝启动。service 支持 http/https/tcp/ssh 等多种协议。
给域名加上 DNS 记录(CNAME 指向隧道):
cloudflared tunnel route dns deb-tunnel notes.example.com
cloudflared tunnel route dns deb-tunnel ssh.example.com
以系统服务运行
调试阶段可以直接前台运行看日志:
cloudflared tunnel run deb-tunnel
确认 ingress 规则无误后,安装为 systemd 服务并设为开机自启:
sudo cloudflared service install
sudo systemctl enable --now cloudflared
systemctl status cloudflared --no-pager
日志里看到 Registered tunnel connection 即表示隧道已建立。此时访问 https://notes.example.com,Cloudflare 会自动颁发证书,浏览器地址栏就是一把小绿锁。
实战中的几个坑
- QUIC 被限速或拦截:部分网络环境下 UDP 443 质量差,cloudflared 会自动回退到 http2 传输,也可以在配置里显式指定
protocol: http2做对比测试; - cloudflared 自动更新:官方仓库安装的版本会随 apt 更新,建议把它纳入
unattended-upgrades,避免隧道协议版本过旧被拒绝连接; - Access 策略别忘配:隧道只是打通了路,鉴权还得靠 Cloudflare Zero Trust 的 Access Application。给管理后台类服务加上邮箱 OTP 或 SSO 登录,再限制来源,安全性会高一个量级;
- SSH over Tunnel 的体验:
ssh.example.com这种方式需要客户端也装 cloudflared 并执行cloudflared access ssh,适合自己用;给别人用建议走 Access 短期 Token 方案; - 日志与监控:
journalctl -u cloudflared -f看实时日志;Zero Trust 控制台的 Tunnel 页面能看到多条冗余连接的状态,某条断了会自动重建,不用半夜爬起来抢修。
总结
这套方案我跑了大半年,最大的感受是「省心」:没有公网 IP 的 Debian 小机器,装一个 cloudflared、配几行 ingress,就能把内网服务安全地挂到自己的域名上,证书、DDoS 防护、访问控制都交给 Cloudflare。对于个人项目、家庭实验室或者临时演示环境,性价比非常高。
- 点赞
- 收藏
- 关注作者
评论(0)