本文最后更新于 239 天前,其中的信息可能已经有所发展或是发生改变。
Cloudflare 不愧为赛博活佛,为我们广大个人站长提供许许多多免费好用的功能,这里介绍一下 Tunnel 这个工具,并演示如何把内网的设备如Rasberry Pi 或者 NAS 暴露到公网。
Cloudflare Tunnel 能做什么?
- 将本地网络的服务暴露到公网,可以理解为内网穿透。 例如我们在本地服务器 192.168.1.1:3000 搭建了一个 Transmission 服务用于 BT 下载,我们只能在内网环境才能访问这个服务,但通过内网穿透技术,我们可以在任何广域网环境下访问该服务。相比 NPS 之类传统穿透服务,Tunnel 不需要公网云服务器,同时自带域名解析,无需 DDNS 和公网 IP。
- 将非常规端口服务转发到 80/443 常规端口。 无论是使用公网 IP + DDNS 还是传统内网穿透服务,都免不了使用非常规端口进行访问,如果某些服务使用了复杂的重定向可能会导致 URL 中端口号丢失而引起不可控的问题,同时也不够优雅。
- 自动为你的域名提供 HTTPS 认证。
- 为你的服务提供额外保护认证。
- 免费!
内网穿透原理
Tunnel 通过在本地网络运行的一个Cloudflare守护程序(这里用docker部署),与 Cloudflare 云端通信,将云端请求数据转发到本地网络的 IP + 端口。
准备工作
- 有一台内网设备,这里以Rasberry Pi为例
- 有一个域名解析在Cloudflare
- Cloudflare已经开通Zero True的免费计划
操作步骤
- 在Cloudflare仪表盘中依次点击 Zero Trust – Networks – Tunnels
- 在新窗口中点击 Create a Tunnel, Connector选项选择 Cloudflare 并点击下一步
- 给Tunnel随便一个名字并点击下一步
- 这一步就是选择部署方式了,我们以docker 为例,复制以下我优化过的安装命令并替换<Token>为你的Token,这个命令增加了后台运行的内容,Cloudflare默认的命令并不能后台运行:
docker run --name CF-tunnel -d cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <Token>
- 在内网设备上使用以上命令运行Cloudflare守护程序
- 回到Cloudflare页面,可以看到部署好的守护程序已经在Connector中显示出来,这时候点击下一步
- 为你的域名配置一个子域名(Subdomain), URL 处填写内网服务的IP加端口号。注意 Type 处建议使用 HTTP,因为 Cloudflare 会自动为你提供 HTTPS,因此此处的转发目标可以是 HTTP 服务端口。
- 注意,如果你有多个本地服务希望被映射到同一个子域名下,那么就应该在路径(path)中有所区分,否则留空即可。比如我想穿透transmisison和idk,他们在我的Rasberry端口分别是9091和2333,那么我的path就应该分别是/trans 和 /idk。像这样:
[subdomain].stefanzhang.com/trans => http://192.168.1.108:9091
[subdomain].stefanzhang.com/idk => http://192.168.1.108:2333
- 在首次配置的时候只能配置一个path
大功告成!
现在就可以访问我们刚才配置好的域访问到内网的非公端口号服务了!
如何想添加更多的路径,需要返回Tunnel的主页面并依次点击 Configure – Public hostname – Add public hostname 配置即可。