Cloudflare Tunnel 零公网 IP 安全外网访问教程

标签: post Cloudflare | 发表时间:2025-12-18 23:30 | 作者:十点还有几分钟
出处:https://xlog.app/

前言

家里的 NAS、自建博客、开发环境想从外网访问,但你没有公网 IP? 运营商不给力,DDNS 又不稳定,端口映射还有安全风险?Cloudflare Tunnel 提供了一个优雅的解决方案: 零公网 IP、零入站端口、默认 HTTPS, 还能和 Zero Trust 深度集成做身份验证

简单来说,你在内网跑一个轻量级的 cloudflared 进程,它主动向 Cloudflare 边缘网络建立加密隧道。当用户访问你的域名时,流量先到 Cloudflare, 经过 WAF、Access 等安全检查后,再通过隧道转发到你的内网服务。整个过程,你的源站 IP 完全不暴露,防火墙也不用开任何入站端口。

本文适合:

  • 想从外网访问家里 NAS / 自建服务的个人用户
  • 需要为团队提供安全内网访问的小团队运维
  • 不想折腾端口映射和动态 DNS 的开发者

读完你将学会:

  • 两种部署方式:快速上手的控制台 Token 模式 vs 灵活的命名隧道配置模式
  • 如何配置多服务、非 HTTP 协议 (SSH/RDP) 支持
  • 结合 Zero Trust Access 做身份验证,让敏感服务更安全
  • 常见问题排查和安全加固最佳实践

工作原理

在传统方式中,要从外网访问内网服务,你需要:公网 IP → 端口映射 → 防火墙放行。这意味着你的源站直接暴露在互联网上,容易被扫描、攻击。

Cloudflare Tunnel 反其道而行: 由内网主动连出去, 建立一条加密隧道到 Cloudflare 边缘。用户访问你的域名时:

Copy
   用户浏览器 
    ↓ HTTPS
Cloudflare 边缘服务器(WAF / Access / TLS 终止)
    ↓ 加密隧道
cloudflared 连接器(内网)
    ↓ HTTP/SSH/RDP 等
你的本地服务(NAS/博客/面板)

核心优势:

  • 无需公网 IP、CGNAT 环境都能用
  • 默认 HTTPS 自动签发证书
  • 隐藏源站 IP 防护自带
  • Zero Trust 集成: 可以加身份验证、设备态势检查等安全策略

准备工作

开始之前,确保你有:

  1. Cloudflare 账号: 免费计划即可,访问 dash.cloudflare.com 注册
  2. 域名托管在 Cloudflare: 需要将域名的 NS 记录指向 Cloudflare (在域名注册商处修改)
  3. Cloudflare Zero Trust 开通: 首次开通可能需要绑定支付方式 (用于防滥用), 但免费计划不会扣费
  4. 一台内网设备 / Linux /macOS 或支持 Docker 的环境都可以

路径选择:快速 vs 灵活

Cloudflare Tunnel 提供两种配置方式:

路径 A - 控制台托管 (推荐新手):

  • 在 Zero Trust 控制台创建隧道,复制 Token 命令直接跑
  • 适合快速验证、单个服务、不需要复杂配置的场景
  • 配置都在控制台可视化管理,重装机器只需复制命令

路径 B - 命名隧道 + config.yml (推荐进阶):

  • 本地创建隧道并生成凭据文件,写 YAML 配置管理多服务
  • 适合多服务编排、非 HTTP 协议、私网路由、需要版本控制的场景
  • 更灵活,但需要手动管理配置文件

建议: 先走路径 A 快速跑通,确认效果;长期使用或需要高级功能,再切换到路径 B。


路径 A: 控制台托管隧道 (10 分钟上手)

这是最简单的方式,几乎不需要写配置文件。

A1. 创建隧道

  1. 登录 Cloudflare Zero Trust
  2. 左侧导航: Networks → Tunnels
  3. 点击 Create a tunnel
  4. 选择 Cloudflared 连接器类型,点 Next
  5. 给隧道起个名字 (比如 home-tunnel), 点 Save tunnel

A2. 安装并运行 cloudflared

创建隧道后,页面会显示不同平台的安装和启动命令。

选择你的操作系统:

控制台会根据你选择的平台 (Windows /macOS/ Linux / Docker) 显示对应的安装步骤。如果机器上还没安装 cloudflared, 按页面指引先完成安装。

复制启动命令:

安装完成后,页面会给出一条带 Token 的命令,类似:

Copy
   # 临时运行(测试用)
cloudflared tunnel --no-autoupdate run --token <你的TOKEN>

# 或安装为系统服务(推荐)
cloudflared service install <你的TOKEN>

提示: Token 模式的优势在于凭据直接包含在命令中,重装机器只需复制这条命令即可恢复服务,无需管理凭据文件。

在你的机器上执行该命令

  • 如果是临时测试: 直接运行带 --token 的命令,关闭终端会停止
  • 如果是长期运行: 使用 cloudflared service install 安装为系统服务,开机自启

执行后,回到控制台页面,底部应显示连接器状态为 HEALTHY, 点 Next 继续。

A3. 绑定公开域名

在隧道详情页,切换到 Public Hostname 标签:

  1. 点击 Add a public hostname

  2. Subdomain: 填写子域名,比如 admin

  3. Domain: 选择你的域名,比如 example.com

  4. Service:

    • Type: 选择 HTTP(或 HTTPS 如果内网服务用了 SSL)
    • URL: 填写内网服务地址,比如 http://localhost:8080http://192.168.1.100:9000
  5. Save hostname

DNS 记录会自动创建,Cloudflare 会添加一条 CNAME 记录指向你的隧道。

A4. 验证

  1. 等待 1-2 分钟让 DNS 生效
  2. 访问 https://admin.example.com
  3. 如果一切正常,应该能看到你的内网服务

常见问题:

  • 502 错误: 检查内网服务是否正常运行,端口是否正确
  • 连接器显示 Disconnected: 检查 cloudflared 进程是否还在运行

路径 B: 命名隧道 + config.yml (进阶配置)

这条路径适合需要精细管理、多服务编排、非 HTTP 协议支持的场景。

B0. 安装 cloudflared

根据你的系统选择安装方式:

Linux (Debian/Ubuntu, 推荐方式):

Copy
   # 从 GitHub 下载最新版本
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

# 验证安装
cloudflared --version

macOS:

Copy
   brew install cloudflare/cloudflare/cloudflared

cloudflared --version

Windows:

Copy
   # 使用 winget(Windows 10/11)
winget install --id Cloudflare.cloudflared

# 验证安装
cloudflared --version

如果你的系统没有包管理器,可以从 GitHub Releases 下载对应平台的二进制文件。

B1. 登录并创建命名隧道

1. 登录 Cloudflare 账号:

Copy
   cloudflared tunnel login

这会打开浏览器让你授权,完成后会在本地生成 cert.pem 证书文件:

  • Linux/macOS: ~/.cloudflared/cert.pem
  • Windows: %USERPROFILE%\.cloudflared\cert.pem

2. 创建隧道:

Copy
   cloudflared tunnel create my-tunnel

你会看到类似这样的输出:

Copy
   Tunnel credentials written to /home/user/.cloudflared/12345678-abcd-1234-abcd-1234567890ab.json.
cloudflared chose this file based on where your origin certificate was found.
Keep this file secret. To revoke these credentials, delete the tunnel.

Created tunnel my-tunnel with id 12345678-abcd-1234-abcd-1234567890ab

记下这个隧道 UUID ( 12345678-abcd-1234-abcd-1234567890ab), 后面配置会用到。

3. 绑定域名到隧道:

Copy
   cloudflared tunnel route dns my-tunnel app.example.com

这会在 Cloudflare DNS 中自动创建一条 CNAME 记录,指向你的隧道。

B2. 编写配置文件

创建配置文件 config.yml:

  • Linux/macOS: ~/.cloudflared/config.yml
  • Windows: %USERPROFILE%\.cloudflared\config.yml

基础示例 (单服务):

Copy
   tunnel: 12345678-abcd-1234-abcd-1234567890ab
credentials-file: /home/user/.cloudflared/12345678-abcd-1234-abcd-1234567890ab.json

ingress:
  - hostname: app.example.com
    service: http://localhost:8080
  - service: http_status:404

多服务示例:

Copy
   tunnel: 12345678-abcd-1234-abcd-1234567890ab
credentials-file: /home/user/.cloudflared/12345678-abcd-1234-abcd-1234567890ab.json

ingress:
  # 博客
  - hostname: blog.example.com
    service: http://localhost:8080
  
  # NAS 管理界面
  - hostname: nas.example.com
    service: https://192.168.1.10:5001
    originRequest:
      noTLSVerify: true  # 如果是自签证书
  
  # 开发环境
  - hostname: dev.example.com
    service: http://localhost:3000
  
  # SSH 服务
  - hostname: ssh.example.com
    service: ssh://localhost:22
  
  # 默认规则(必需,匹配不到时返回 404)
  - service: http_status:404

Windows 路径注意:

Copy
   # Windows 路径需要用双反斜杠或正斜杠
credentials-file: C:\\Users\\YourName\\.cloudflared\\12345678-abcd-1234-abcd-1234567890ab.json
# 或
credentials-file: C:/Users/YourName/.cloudflared/12345678-abcd-1234-abcd-1234567890ab.json

B3. 运行隧道

前台运行 (测试):

Copy
   cloudflared tunnel run my-tunnel

你会看到类似输出:

Copy
   2024-12-07T10:30:00Z INF Starting tunnel tunnelID=12345678-abcd-1234-abcd-1234567890ab
2024-12-07T10:30:01Z INF Connection registered connIndex=0 location=NRT
2024-12-07T10:30:01Z INF Connection registered connIndex=1 location=NRT

看到 Connection registered 说明隧道已建立。

安装为系统服务 (生产环境):

Linux:

Copy
   # 将配置复制到系统目录
sudo mkdir -p /etc/cloudflared
sudo cp ~/.cloudflared/config.yml /etc/cloudflared/
sudo cp ~/.cloudflared/*.json /etc/cloudflared/

# 安装并启动服务
sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

# 查看状态
sudo systemctl status cloudflared

macOS:

Copy
   # 安装为 launchd 服务
sudo cloudflared service install
sudo launchctl start com.cloudflare.cloudflared

Windows:

Copy
   # 以管理员身份运行
cloudflared service install

# 启动服务
Get-Service cloudflared | Start-Service

B4. 非 HTTP 协议与私网路由

SSH / RDP 访问:

config.yml 中配置非 HTTP 协议:

Copy
   ingress:
  - hostname: ssh.example.com
    service: ssh://127.0.0.1:22
  
  - hostname: rdp.example.com
    service: rdp://192.168.1.20:3389
  
  - service: http_status:404

客户端连接 SSH:

用户需要先安装 cloudflared, 然后:

Copy
   # 方式 1:直接连接
cloudflared access ssh --hostname ssh.example.com

# 方式 2:配置 SSH 客户端
# 在 ~/.ssh/config 添加:
Host ssh.example.com
  ProxyCommand cloudflared access ssh --hostname %h

私网路由 (访问整个内网段):

  1. 在配置文件中启用:
Copy
   warp-routing:
  enabled: true
  1. 在 Zero Trust 控制台添加私网路由:

    • Networks → Tunnels → 选择你的隧道 → Private Networks 标签
    • 点击 Add a private network
    • 输入 CIDR, 比如 192.168.1.0/24
  2. 访问端安装 Cloudflare WARP 客户端, 登录你的 Zero Trust 团队后,就能直接访问内网 IP 了。


安全加固清单

Cloudflare Tunnel 虽然默认就比传统端口映射安全,但还可以做得更好:

1. 为敏感服务启用 Zero Trust Access

不要让管理面板、数据库管理工具等敏感服务裸奔在互联网上,哪怕通过隧道访问。

步骤:

  1. 在 Zero Trust 控制台: Access → Applications → Add an application

  2. 选择 Self-hosted

  3. 配置应用:

    • Application name: NAS Admin Panel
    • Session Duration: 24 hours
    • Application domain: nas.example.com
  4. 添加策略:

    • Policy name: Allow My Email Only
    • Action: Allow
    • Include: 选择 Emails → 输入你的邮箱 [email protected]
  5. 保存后,访问 nas.example.com 会先跳转到 Cloudflare Access 登录页,验证通过才能访问

支持的身份提供商:

  • Google、GitHub、Microsoft 等 OAuth
  • 一次性 PIN 码 (发送到邮箱)
  • SAML / OIDC 企业身份源

2. 最小暴露原则

  • 不要暴露数据库端口(MySQL 3306、PostgreSQL 5432 等), 用私网路由 + WARP 访问
  • 不要暴露消息队列、Redis 等中间件, 除非你清楚在做什么
  • 管理面板和对外服务分开子域, 便于差异化安全策略

3. 正确处理 HTTPS 回源

如果内网服务用了自签证书,测试阶段可以在配置中跳过验证:

Copy
   ingress:
  - hostname: admin.example.com
    service: https://localhost:8443
    originRequest:
      noTLSVerify: true  # 仅用于开发/测试

生产环境建议:

  • 让 Cloudflare 终止 TLS (用 HTTP 回源)
  • 或给内网服务配置由内网 CA 签发的证书,并在 originRequest 中指定 CA

4. 部署冗余连接器

同一个隧道可以同时运行多个 cloudflared 实例 (比如在不同机器上), 提供高可用:

Copy
   # 机器 A
cloudflared tunnel run my-tunnel

# 机器 B(使用相同的 tunnel ID 和凭据文件)
cloudflared tunnel run my-tunnel

Cloudflare 会自动负载均衡,任一实例挂掉不影响服务。

5. 日志和监控

设置日志级别以便排查问题:

Copy
   cloudflared tunnel --loglevel debug run my-tunnel

或在配置文件中:

Copy
   loglevel: info

查看日志:

  • Linux systemd: sudo journalctl -u cloudflared -f
  • Docker: docker logs -f cloudflared
  • Windows: 事件查看器或服务日志

常见问题排查

Q1: 浏览器显示 502 Bad Gateway

可能原因:

  • 内网服务没启动
  • 端口号填错了
  • 防火墙拦截了 cloudflared 到内网服务的连接

排查步骤:

Copy
   # 在运行 cloudflared 的机器上测试内网服务
curl http://localhost:8080

# 检查端口是否在监听
netstat -tlnp | grep 8080  # Linux
netstat -an | findstr 8080  # Windows

Q2: 隧道状态显示 Unhealthy

可能原因:

  • cloudflared 进程挂了
  • 网络出站受限,无法连接 Cloudflare
  • 配置文件有错误

排查:

Copy
   # 查看进程
ps aux | grep cloudflared  # Linux
Get-Process cloudflared     # Windows

# 测试网络连通性
curl https://api.cloudflare.com/cdn-cgi/trace

# 前台运行查看详细日志
cloudflared tunnel --loglevel debug run my-tunnel

Q3: HTTPS 证书警告

如果用户访问时看到证书警告,通常是域名配置问题:

  • 确保域名已托管在 Cloudflare
  • 确保 Cloudflare SSL/TLS 设置不是 "关闭"
  • 如果是多级子域 ( admin.sub.example.com), 需要申请 Advanced Certificate

Q4: 访问速度慢或不稳定

  • 检查连接器是否健康: 控制台查看连接器状态
  • 使用 Docker 并设置自动重启: docker run --restart unless-stopped ...
  • 部署多个连接器: 提升可用性
  • 检查本地网络: 如果是家用宽带,上行带宽可能是瓶颈

Q5: Docker 容器启动后立即退出

常见原因:

  • Token 或凭据文件路径不对
  • 配置文件格式错误 (YAML 缩进)

排查:

Copy
   # 查看容器日志
docker logs cloudflared

# 挂载正确的配置路径
docker run -d --name cloudflared --restart unless-stopped \
  -v ~/.cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel run my-tunnel

与其他方案对比

方案 公网 IP 端口映射 配置难度 安全性 HTTPS 成本
Cloudflare Tunnel 不需要 不需要 低 - 中 高 (可加 Access) 自动 免费
FRP 需要中转服务器 需要 中 (需自配 SSL) 需自配 中转服务器成本
Ngrok 不需要 不需要 自动 免费版受限,付费较贵
传统端口映射 需要 需要 低 (IP 暴露) 需自配 无 (但需公网 IP)
Tailscale 不需要 不需要 N/A(P2P) 免费版有设备数限制

Cloudflare Tunnel 的独特优势:

  • 和 Cloudflare 生态深度集成、DDoS 防护、CDN、Access、Gateway 一条龙
  • 免费且无流量限制: 对个人和小团队非常友好 (免费计划受 Cloudflare 的公平使用和反滥用策略约束,大规模或高风险场景可能需要付费计划)
  • 全球边缘网络: 延迟低、可用性高

扩展阅读与参考

官方文档:

下载链接:

社区资源:


写在最后

Cloudflare Tunnel 把 "从外网安全访问内网服务" 这件事变得非常简单。对于个人用户,用控制台 Token 模式几分钟就能跑起来;对于需要精细管理的场景,命名隧道 + config.yml 也提供了足够的灵活性。

我的实际使用建议:

  1. 先用路径 A 快速验证: 确认 Cloudflare Tunnel 符合你的需求
  2. 生产环境切到路径 B: 把配置文件纳入版本控制,便于维护
  3. 敏感服务一定加 Access: 不要偷懒,设置一个邮箱验证就能大幅提升安全性
  4. 结合私网路由用 WARP: 对于需要访问内网多个设备的场景,比单独配置公开主机名更方便

如果你在使用过程中遇到问题,欢迎查阅官方文档,或在 评论区 / Cloudflare 社区提问。祝你折腾愉快!

此文由 Mix Space 同步更新至 xLog
原始链接为 https://blog.astrasolis.top/posts/tutorial/cloudflare-tunnel-tutorial

相关 [cloudflare tunnel 公网] 推荐:

Cloudflare Tunnel 零公网 IP 安全外网访问教程

- - xLog Latest
家里的 NAS、自建博客、开发环境想从外网访问,但你没有公网 IP. 运营商不给力,DDNS 又不稳定,端口映射还有安全风险. Cloudflare Tunnel 提供了一个优雅的解决方案: 零公网 IP、零入站端口、默认 HTTPS, 还能和 Zero Trust 深度集成做身份验证. 简单来说,你在内网跑一个轻量级的 cloudflared 进程,它主动向 Cloudflare 边缘网络建立加密隧道.

SSH Tunnel扫盲

- Jerry - 老王的技术手册 ( 我的新博客:http://huoding.com )
前些天,由于我不知道如何在Putty里拷贝字符而被朋友们取笑,着实糗了一把. 不过被别人B4的一大好处就是你会知耻而后勇,这阵子通过研读PuTTY 中文教程,估计以后不会再犯同样的错误了,在学习Putty的同时偶然发现自己对SSH Tunnel的了解很匮乏,所以便有了今天这篇笔记. SSH Tunnel有三种,分别是本地Local(ssh -NfL),远程Remote(ssh -NfR),动态Dynamic(ssh -NfD).

免费 CDN 加速服务:CloudFlare

- ArBing - 我爱水煮鱼
最近通过 MediaTemple 的后台了解到 (mt) 提供了 CloudFlare 加速服务服务,仔细看了下,CloudFlare 是一家功能非常强大的免费 CDN 免费加速服务. 什么是 CloudFlare. CloudFlare 是通过反向代理(reverse proxy)提供网站加速服务,为站长解决了 jpg/JS/CSS 这些静态文件到 CDN 上的问题,并且通过它部署在全球各大洲的缓存结点服务器(详细列表),提供高效的加速服务.

開啟網路蟲洞穿越時空,活用 SSH Tunnel VPN

- risent - Fred&#39;s blog
最近去了一趟上海考察,尋找創業發展的機會,但機會暫且不論,此行確實深深體會在中國的網路世界非常不一般. 中國和諧的社會實在不容許影響善良風俗的事情存在,許多外來的邪惡,一一被偉大的長城擋在外面. 不過,道高一尺魔高一丈,很多人很聰明,懂得翻牆方法,進出自如,多數人使用 Reverse SSH Tunnel(有興趣可參考筆者舊文『Reverse SSH Tunnel 反向打洞實錄』)建立一個臨時的 Proxy Server,讓網頁連線繞道而行.

免费代理软件Surfing Tunnel,无限制网上冲浪

- - 软矿
还在到处找免费VPN或者上那些限制多多,贴满牛皮癣的代理网站,才能勉强上facebook或者twitter. 为什么不试试免费的代理软件Surfing Tunnel,免安装,简单选择代理国家就可以轻松登陆twitter之类的网站. Surfing Tunnel是个免费个人代理软件,通过它可以匿名在互联网上冲浪.

CloudFlare获2000万美元投资,让网络更快更安全

- pestwave - 36氪
网络安全公司CloudFlare已经完成2000万美元的B轮融资. 领投方为New Enterprise Associates. CloudFlare将用这笔资金用于基础设施投入和团队扩充. CloudFlare开发了一款云端软件程序,可以帮助网站免受恶意软件和DoS攻击的威胁. CloudFlare称其产品可以部署在任何网站上,站长所要做的就是简单地修改一下DNS设置.

SHA-1即将淘汰,但Facebook和CloudFlare将提供“退路”

- - Solidot
2016年之后,主流浏览器将停止支持使用SHA-1哈希算法签名的证书. 但仍然有大量网站的数字证书使用这种弱加密算法签名,仍然有很多人使用不支持SHA256的过时浏览器,社交巨人Facebook和云服务公司CloudFlare为此宣布了受争议的“退路计划”,让这些网站和用户继续使用弱加密连接,他们的观点是有加密总比没有加密好.

Vercel, Cloudflare, fly.io 我的云服务三剑客

- - Limboy
Update: 在排查 Cloudflare 缓存命中率低的问题时,发现没有一台 Server 实在是不方便. 比如想看下哪些请求透过了 CF,直接到了源站,如果内容 deploy 在 Vercel 上,就看不到这些请求日志. 所以虽然 Vercel 很方便,用起来也很舒服,但一些能力上的缺失在某些场景下还是挺难受的,因此还是转向了 VPS(Vultr) + Cloudflare 的传统配搭.

CloudFlare 发布一周年,为所有用户提供 IPv6 网关支持

- Blaker - 36氪
CloudFlare 发布于一年前的今天. 为网站提供加速和免受恶意软件、DDOS攻击威胁的服务. 在一年内,该公司已从几乎没有流量成长为(上个月)PV 达 150 亿、独立访客达 3.5 亿的服务. 今天,为庆祝 CloudFlare 的生日,开发团队认为应该为用户送上一份开创性的礼物. CloudFlare 决定着手解决互联网最大的挑战.