[点晴永久免费OA]Cloudflare Tunnel 内网穿透完全指南
当前位置:点晴教程→点晴OA办公管理信息系统
→『 经验分享&问题答疑 』
🎯 一、前置准备1.1 准备好这些"装备"在开始我们的隧道之旅之前,确保你有以下"装备":
1.2 先了解工作原理在动手之前,让我们先理解一下 Cloudflare Tunnel 的魔法是如何工作的: 简单来说:你的内网服务通过一条加密隧道连接到 Cloudflare 的全球网络,用户访问你的域名时,Cloudflare 会通过这条隧道把请求转发给你的内网服务。整个过程对用户透明,无需端口映射,无需公网 IP! 🔧 二、域名解析迁移至 Cloudflare2.1 第一步:备份原有 DNS 记录在开始迁移之前,我们首先要做好"备份"——就像搬家前要打包行李一样。 登录阿里云控制台,进入 云解析 DNS → demo.com → 解析设置,记录当前所有解析记录(A、CNAME、MX、TXT 等)。
2.2 第二步:在 Cloudflare 添加域名现在让我们把你的域名"搬家"到 Cloudflare:
2.3 第三步:修改域名 NS 服务器这是关键的一步——我们要告诉互联网世界,你的域名现在由 Cloudflare 管理! 在阿里云域名控制台找到 路径:域名列表 → 管理 → DNS 修改(或查看 DNS 服务器) 将原有阿里云 NS: 替换为 Cloudflare 分配的两个 NS(以实际分配为准):
2.4 第四步:验证 NS 生效如何知道迁移成功了?用这个命令检查: 预期输出(成功标志): 看到 Cloudflare 的 NS 服务器,恭喜你!迁移成功!🎉 2.5 迁移后的温馨提示
⚙️ 三、Cloudflare 网站配置3.1 确认域名状态进入 Cloudflare 面板 → 3.2 设置 SSL/TLS 加密模式路径:SSL/TLS → 概述 根据你的内网服务情况选择合适的加密模式:
3.3 创建你的专属隧道现在我们开始创建隧道——这是连接内网和外网的桥梁! 路径:Zero Trust → Networks → Tunnels → Create a tunnel
3.4 获取隧道凭证(三选一)🖥️ 方式 A:浏览器授权(适合有图形界面的机器)这是最简单的方式: 浏览器会弹出授权页面,选择 💻 方式 B:API Token(适合纯 SSH 无图形界面)如果你在纯命令行环境下工作: 路径:Cloudflare 面板 → My Profile → API Tokens → Create Token → Custom token 权限设置:
生成 Token 后,在服务器上: 📡 方式 C:证书文件上传(推荐)最灵活的方式——在本地有浏览器的机器执行
3.5 绑定 DNS 路由隧道创建后,我们需要告诉 Cloudflare 哪些子域名应该通过这个隧道访问: 这会在 Cloudflare DNS 自动创建 CNAME 记录,指向 🛠️ 四、服务器端 cloudflared 安装4.1 Ubuntu/Debian 官方仓库安装(推荐)使用官方仓库安装可以确保你获得最新版本和自动更新: 如果 4.3 验证安装成功看到版本号输出,说明安装成功!下一步就是配置了。🎯 🎛️ 五、内网穿透配置5.1 配置文件结构配置文件路径: 这是整个隧道配置的核心文件,让我们看看它长什么样: 5.2 关键规则说明让我们逐行解释这个配置文件:
5.3 ⚠️ 最常见的配置错误(必看!)这是新手最容易犯错的地方,请仔细阅读! ❌ 错误写法( |
http://localhost:8080 | |||
https://localhost:8443 | |||
tcp://localhost:3306 | |||
ssh://localhost:22 | |||
rdp://localhost:3389 | |||
smb://localhost:445 |
💡 提示:标记为 ❌ 的协议需要额外配置(如 Cloudflare WARP 客户端)才能访问,但 HTTP/HTTPS 可以直接通过浏览器访问。
激动人心的时刻到了!让我们启动隧道看看效果:
cloudflared tunnel run --protocol http2 home-nas
如果一切正常,你会看到类似这样的输出:
INF Starting metrics server on 127.0.0.1:20241/metrics
INF Registered tunnel connection connIndex=0 connection=xxxx event=0 ip=198.41.200.193 location=sjc07 protocol=http2
INF Registered tunnel connection connIndex=1 connection=xxxx event=0 ip=198.41.192.227 location=sjc01 protocol=http2
INF Registered tunnel connection connIndex=2 connection=xxxx event=0 ip=198.41.200.23 location=sjc07 protocol=http2
INF Registered tunnel connection connIndex=3 connection=xxxx event=0 ip=198.41.192.167 location=sjc06 protocol=http2
看到 4 条 Registered tunnel connection,恭喜你!隧道已成功注册到 Cloudflare 边缘网络!🎊
现在你可以在浏览器中访问 https://iot-deploying.demo.com 试试看!
现象:
WRN Failed to dial a quic connection error="failed to dial to edge with quic: timeout: no recent network activity"原因:国内网络对 UDP/QUIC 协议有限制
解决方案:强制使用 HTTP/2 协议
cloudflared tunnel run --protocol http2 home-nas或者在 config.yml 顶部添加 protocol: http2。
现象:
curl -v https://iot-deploying.demo.com
# Could not resolve host: iot-deploying.demo.com
解决方案:清除 DNS 缓存
# macOS
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
# Linux (systemd-resolved)
sudo systemd-resolve --flush-caches
# Windows
ipconfig /flushdns
现象:浏览器显示 525/526 错误
解决方案:调整加密模式
Cloudflare 面板 → SSL/TLS → 将加密模式从 Full (strict) 改为 Full 或 Flexible。
现象:HTTP 403,但服务明明在运行
排查步骤:
# 1. 确认本地服务正常
curl -I http://localhost:8080
# 2. 确认域名解析到 Cloudflare
dig iot-deploying.demo.com
# 应返回 Cloudflare IP(如 104.21.x.x / 172.67.x.x)
为了让隧道在服务器重启后自动运行,我们需要配置 systemd 服务。
将配置文件和凭证文件移到系统级目录(避免权限问题):
sudo mkdir -p /etc/cloudflared
sudo cp /home/user/.cloudflared/config.yml /etc/cloudflared/
sudo cp /home/user/.cloudflared/tunnel-001.json /etc/cloudflared/
# 修改 config.yml 中的 credentials-file 路径
sudo sed -i 's|/home/user/.cloudflared|/etc/cloudflared|g' /etc/cloudflared/config.yml
sudo tee /etc/systemd/system/cloudflared.service << 'EOF'
[Unit]
Description=Cloudflare Tunnel
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/cloudflared tunnel run --config /etc/cloudflared/config.yml --protocol http2
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 重载 systemd 配置
sudo systemctl daemon-reload
# 设置开机自启并立即启动
sudo systemctl enable --now cloudflared
# 查看服务状态
sudo systemctl status cloudflared
正常状态输出:
● cloudflared.service - Cloudflare Tunnel
Loaded: loaded (/etc/systemd/system/cloudflared.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-05-12 15:30:00 CST; 2min ago
Main PID: 1234567 (cloudflared)
Tasks: 12 (limit: 9407)
Memory: 34.2M
CPU: 1.234s
CGroup: /system.slice/cloudflared.service
└─1234567 /usr/local/bin/cloudflared tunnel run --config /etc/cloudflared/config.yml --protocol http2
sudo journalctl -u cloudflared -f
sudo systemctl stop cloudflared # 停止服务
sudo systemctl restart cloudflared # 重启服务
sudo systemctl disable cloudflared # 禁用开机自启
完成配置后,让我们逐一验证每个环节是否正常工作:
# 确认内网服务在监听
curl -I http://localhost:8080
curl -I http://localhost:7070
curl -I http://localhost:5001
所有服务都应该返回 HTTP/1.1 200 OK 或类似的正常响应。
# 确认域名指向 Cloudflare
dig iot-deploying.demo.com
# 预期返回 Cloudflare IP
iot-deploying.demo.com. 300 IN A 104.21.24.99
iot-deploying.demo.com. 300 IN A 172.67.218.43
看到 Cloudflare 的 IP 地址(104.21.x.x 或 172.67.x.x)说明 DNS 解析正确!
curl -I https://iot-deploying.demo.com
# 预期返回 HTTP/2 200 或 403(服务正常但需认证)
HTTP/2 200
date: Tue, 12 May 2026 06:59:41 GMT
server: cloudflare
cf-cache-status: DYNAMIC
看到 server: cloudflare 说明请求通过了 Cloudflare!
# 在服务器上查看 metrics
curl -s http://127.0.0.1:20241/metrics | grep tunnel
应该看到各种隧道相关的指标数据。
路径:Zero Trust → Networks → Tunnels → home-nas
状态:🟢 Healthy
活动副本:1
路由:显示已绑定的所有子域名
看到绿色状态,恭喜你,整个系统运行正常!🎉
把常用命令记在这里,方便随时查阅:
sudo apt-get install cloudflared | |
cloudflared tunnel login | |
cloudflared tunnel create home-nas | |
cloudflared tunnel route dns home-nas sub.demo.com | |
cloudflared tunnel run --protocol http2 home-nas | |
cloudflared tunnel list | |
sudo systemctl status cloudflared | |
sudo journalctl -u cloudflared -f | |
sudo systemctl restart cloudflared |
单服务模板(适合只有一个内网服务的场景):
tunnel: abcd1234-5678-90ab-cdef-example11111
credentials-file: /etc/cloudflared/tunnel-001.json
protocol: http2
ingress:
- hostname: app.demo.com
service: http://localhost:8080
- service: http_status:404
多服务模板(适合有多个内网服务的场景):
tunnel: abcd1234-5678-90ab-cdef-example11111
credentials-file: /etc/cloudflared/tunnel-001.json
protocol: http2
ingress:
- hostname: jenkins.demo.com
service: http://localhost:8080
- hostname: nas.demo.com
service: http://localhost:5000
- hostname: ssh.demo.com
service: ssh://localhost:22
- service: http_status:404
为了保护隐私,本文档所有示例已按以下规则脱敏:
guushu.com | demo.com | |
192.0.2.1 | ||
howardsteve | user | |
abcd1234-5678-90ab-cdef-example11111 | ||
server | ||
xxxx | ||
恭喜你完成了 Cloudflare Tunnel 的配置!现在你可以:
如果你在配置过程中遇到问题,不要慌张,仔细检查配置文件,查看日志,大多数问题都能通过调整配置解决。
文档版本:v1.0
更新日期:2026-05-12
祝你使用愉快! 🚀
适用 cloudflared 版本:2026.3.0+