Daimon's Blog
主页 归档 关于 RSS 探针 常用工具
主页
归档
关于
RSS
探针
常用工具

Cloudflare Tunnel:零端口暴露的内网穿透方案

daimon daimon 2026-01-09 #Cloudflare#Tunnel#内网穿透#frp

把内网服务发布到公网,传统方案是 frp / ngrok / 端口转发——都要么需要一台公网 VPS 当跳板,要么要花钱买套餐,要么得在路由器开端口。

Cloudflare Tunnel 是 CF 提供的免费方案:装一个客户端(cloudflared),它主动和 CF 的边缘建立反向连接,外网通过你的域名访问,全程 HTTPS,没有任何入站端口暴露。

一、为什么用 CF Tunnel#

对比一下主流方案:

方案公网 IP端口转发费用HTTPSDDoS 防护
frp 自建需要跳板 VPS是VPS 费用需手动无
ngrok 免费版不需要否免费但限速/限连接自动无
端口转发(路由器)需要是0需手动无
CF Tunnel不需要否0自动有

适用场景:

  • 家里跑了 NAS / Jellyfin / HomeAssistant,想在外面访问
  • 小公司内网服务想给远程同事用,但没有公网 IP
  • 临时把开发环境 demo 给别人看
  • 树莓派跑了几个服务想公开

二、工作原理#

graph LR U[外网用户] -->|HTTPS 访问 your-app.example.com| CF[Cloudflare 边缘节点] CF <-->|加密长连接
主动从内网发起| CL[cloudflared 客户端
跑在你内网机器上] CL --> S[内网服务
localhost:8080]

关键点:

  • cloudflared 主动连 CF,不需要内网开任何端口
  • 流量走 CF → cloudflared → 本地服务
  • 全程 TLS 加密,外网看到的是 CF 的 IP,不是你的真实 IP

三、准备工作#

项目要求
域名已托管到 Cloudflare(必须)
内网机器Linux / macOS / Windows / 路由器 / Docker 都能跑
Cloudflare 账号免费版就够

如果你的域名还没在 CF:先去 dash.cloudflare.com → Add Site → 跟着指引改 NS。

四、操作步骤(推荐 Dashboard 方式)#

CF 现在主推 Zero Trust Dashboard 配置 Tunnel,比命令行方式直观。

4.1 进入 Zero Trust#

CF 控制台 → 左侧 Zero Trust → 第一次会让你选个 Team 名(随便起)。

4.2 创建 Tunnel#

Networks → Tunnels → Create a tunnel:

步骤操作
Connector type选 Cloudflared
Tunnel name随便起,如 home-nas
Save保存后会给你安装命令

4.3 在你的内网机器上跑 cloudflared#

CF 会给一段类似这样的命令(不同平台不一样):

Terminal window
1
# Linux (Debian/Ubuntu)
2
curl -L --output cloudflared.deb \
3
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
4
sudo dpkg -i cloudflared.deb
5
6
# 服务化 + 用 CF 给你的 token 注册
7
sudo cloudflared service install <YOUR-TUNNEL-TOKEN>
Terminal window
1
# Windows
2
# 下载 https://github.com/cloudflare/cloudflared/releases 里的 .msi 安装
3
cloudflared.exe service install <YOUR-TUNNEL-TOKEN>
Terminal window
1
# Docker
2
docker run -d \
3
--name cloudflared \
4
--restart unless-stopped \
5
cloudflare/cloudflared:latest \
6
tunnel --no-autoupdate run --token <YOUR-TUNNEL-TOKEN>

跑起来后回到 Dashboard,Connector 状态变成 HEALTHY。

4.4 配置 Public Hostname#

Public Hostname → Add a public hostname:

字段值
Subdomainnas(最终是 nas.your-domain.com)
Domain选你的域名
Service TypeHTTP / HTTPS / SSH / RDP / TCP 等
URLlocalhost:8080(内网服务的地址)

保存。CF 会自动给你的子域名添加 CNAME 记录。

4.5 验证#

Terminal window
1
curl -I https://nas.your-domain.com

返回 200 / 301 等正常响应,整个流程跑通。

五、命令行方式(高级 / 想懂原理)#

如果你想看到所有细节,命令行方式更清楚:

5.1 安装#

Terminal window
1
curl -L --output cloudflared.deb \
2
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
3
sudo dpkg -i cloudflared.deb
4
5
cloudflared --version

5.2 登录 + 授权#

Terminal window
1
cloudflared tunnel login

会打开浏览器让你选 zone,授权完后凭证存在 ~/.cloudflared/cert.pem。

5.3 创建 tunnel#

Terminal window
1
cloudflared tunnel create home-nas

会输出 tunnel UUID,并把凭证存到 ~/.cloudflared/<UUID>.json。

5.4 写配置文件#

~/.cloudflared/config.yml:

1
tunnel: <你的 UUID>
2
credentials-file: /home/youruser/.cloudflared/<UUID>.json
3
4
ingress:
5
- hostname: nas.your-domain.com
6
service: http://localhost:8080
7
- hostname: jellyfin.your-domain.com
8
service: http://localhost:8096
9
- hostname: ssh.your-domain.com
10
service: ssh://localhost:22
11
- service: http_status:404 # 兜底

5.5 绑定域名 DNS#

Terminal window
1
cloudflared tunnel route dns home-nas nas.your-domain.com
2
cloudflared tunnel route dns home-nas jellyfin.your-domain.com
3
cloudflared tunnel route dns home-nas ssh.your-domain.com

CF 会自动加 CNAME。

5.6 跑 + 服务化#

Terminal window
1
# 前台跑(测试)
2
cloudflared tunnel run home-nas
3
4
# 服务化
5
sudo cloudflared service install
6
sudo systemctl status cloudflared

六、典型应用场景#

6.1 把家里的 Jellyfin 发布到公网#

1
ingress:
2
- hostname: video.your-domain.com
3
service: http://localhost:8096
4
- service: http_status:404

外网浏览器访问 https://video.your-domain.com → 看你 NAS 上的电影。

6.2 SSH 到内网机器(不用 frp)#

服务端配置:

1
ingress:
2
- hostname: ssh.your-domain.com
3
service: ssh://localhost:22

客户端要装 cloudflared 做转发:

Terminal window
1
# 本地 cloudflared
2
cloudflared access ssh --hostname ssh.your-domain.com
3
4
# 或者写到 ~/.ssh/config
5
Host my-home
6
HostName ssh.your-domain.com
7
ProxyCommand cloudflared access ssh --hostname %h

之后 ssh my-home 就能通到内网机器。

6.3 给路由器后台开公网入口#

1
ingress:
2
- hostname: router.your-domain.com
3
service: https://192.168.1.1
4
originRequest:
5
noTLSVerify: true # 路由器自签名证书要加这条

⚠️ 把路由器后台暴露公网风险很大——建议配合下面的 Access 鉴权。

七、加上 Access 鉴权(必看)#

CF Tunnel 默认是任何能访问域名的人都能进。一定要加访问控制。

Zero Trust → Access → Applications → Add an application:

设置推荐
TypeSelf-hosted
Application domainnas.your-domain.com
Policy → ActionAllow
IncludeEmails / Email domains / Country / Device posture

常用策略:

  • Emails:只允许特定邮箱(输入 OTP 邮件验证码登录)
  • Email domains:只允许 @your-company.com 结尾
  • Country: 仅允许中国 / 美国
  • Service Token: 给 API/脚本访问用

加完之后,访问域名会先跳到 CF 的登录页,验证通过才进得去——免去自己写鉴权。

八、和 frp 对比#

维度CF Tunnelfrp
公网入口CF 边缘 IP你自己的 VPS IP
协议HTTP/HTTPS(主)、TCP/SSH/RDP全协议 TCP/UDP
配置复杂度低(Dashboard 点点)中(写 ini 文件)
自定义域名必须用 CF 托管任意
性能走 CF 边缘,国内访问需绕直连跳板 VPS,可选近
鉴权内置 Access需自己加
国内访问CF 国内段速度不稳选国内 VPS 跳板更快

💡 国内访问 NAS / 自部署服务,有时候 frp + 国内 VPS 反而更快。CF Tunnel 的优势在于”零配置 + 自带鉴权 + DDoS 防护”。

九、踩坑清单#

现象原因解决
cloudflared service install 报错systemd 没启动 / 权限不够用 sudo
Connector HEALTHY 但访问 502内网服务没起 / 端口错curl localhost:端口 验证
自签名证书报错TLS 验证失败originRequest: noTLSVerify: true
国内访问极慢CF 国内段不稳考虑反代或换方案
配置了 Access 但还能匿名访问Policy 没启用Dashboard 双检
Docker 跑的 cloudflared 连不上本机默认 bridge 网络不通 host用 --network host
改 config.yml 没生效没 reloadcloudflared tunnel run 自动 / 服务化要 restart

十、几条实用经验#

  • 能用 Dashboard 别命令行——CF 现在主推 Dashboard,文档也更新更勤。
  • 一个 Tunnel 可以挂多个域名,不用每个服务建一个 Tunnel。
  • 配 Access 是基操,没 Access 等于把内网门户开公网。
  • 国内访问要测速:CF 国内出口偶尔不稳,跟优选 IP 那篇配合使用。
  • 不要在主路由器上跑 cloudflared——和软路由 / OpenWrt 配合容易 NAT 链路混乱。挂在 NAS / 一台单独的小主机上更稳。
  • cloudflared 升级很重要:CF 偶尔会让旧版客户端失效,建议开 --no-autoupdate 关掉自动升级、自己定期手动升级,避免半夜被自动重启搞掉。

把这套配通,你的家里 / NAS / 任何内网服务都能用域名 + HTTPS 访问,再也不用折腾路由器端口转发。

Cloudflare 优选 IP / 优选域名:原理 + 实操 + 避坑
Cloudflare R2:免费 10G 对象存储 + 自建图床完全指南
本博客所有文章除特别声明外,均遵循 CC BY-NC-SA 4.0 协议,转载请注明出处。
博客框架 Astro & Fuwari
冀ICP备20260167号
1
一、为什么用 CF Tunnel
2
二、工作原理
3
三、准备工作
4
四、操作步骤(推荐 Dashboard 方式)
4.1 进入 Zero Trust
4.2 创建 Tunnel
4.3 在你的内网机器上跑 cloudflared
4.4 配置 Public Hostname
4.5 验证
5
五、命令行方式(高级 / 想懂原理)
5.1 安装
5.2 登录 + 授权
5.3 创建 tunnel
5.4 写配置文件
5.5 绑定域名 DNS
5.6 跑 + 服务化
6
六、典型应用场景
6.1 把家里的 Jellyfin 发布到公网
6.2 SSH 到内网机器(不用 frp)
6.3 给路由器后台开公网入口
7
七、加上 Access 鉴权(必看)
8
八、和 frp 对比
9
九、踩坑清单
10
十、几条实用经验