穿透和隧道
目前市面上有很多内网穿透和隧道服务,比如 Zerotier, N2N, FRP,Ngrok, inlets, Cloudflare Tunnel, inebula,昨天按 官方文档 试了一下 Cloudflare Tunnel,还是惊讶于文档的专业程度,和如果有域名和 DNS 服务 Cloudflare 上时部署之简单。文档已经非常详尽了,这里 主要是为 Cloudflare 打一下广告(虽然也不太需要),顺便记录一下。
作为 Cloudflare 零信任网络(Zero Trust Network)的一部分,Cloudflare Tunnel 最初叫 Argo Tunnel , 主要作用是使服务器无需暴露 IP 和端口,将服务直接连接到 Cloudflare 以降低攻击面,并提供 Cloudflare 网络上的其他优势。
部署
有两种方式可以部署 Cloudflare Tunnel,这里我们选择完全使用命令行。
首先安装 cloudflared
➜ brew install cloudflared
然后登录
➜ cloudflared tunnel login
创建一个隧道
➜ cloudflared tunnel create chengqian-home
列出刚才创建的隧道
➜ cloudflared tunnel list You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>` ID NAME CREATED CONNECTIONS 3bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx79 chengqian-home 2023-03-08T12:22:48Z
这时我们看一下 ~/.cloudflared 目录下有哪些东西
➜ .cloudflared ls 3bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx79.json cert.pem
在此目录下写入 config.yml 文件
➜ .cloudflared code config.yml
内容如下:
url: http://localhost:5000 tunnel: 3bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx79 credentials-file: ~/.cloudflared/3bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx79.json
其中 url 为本机服务的地址,这里我们以 Beancount 的 fava 服务为例,tunnel 就是 tunnel ID,credentials-file 就是 ID.json 那个文件。
最后直接启动 tunnel
➜ .cloudflared cloudflared tunnel route dns 3bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx79 home.duchengqian.com
因为我的域名和 DNS 也是托管在 Cloudflare 上,这里什么都不用做只需要在启动时写入我想分配的子域名,Cloudflare 就会自动在 DNS 中 加入 CNAME 记录把子域名解析到此隧道。
这时候我们去 Cloudflare 的 Dashboard 就可以看到 Tunnel 的状态了。
然后试着用域名 home.duchengqian.com 访问一下 fava 服务,就可以在线访问我的 Beancount 账本了:
大功告成。
PS: 在你看到这篇博文时访问 home.duchengqian.com 可能是这样,因为 tunnel 已经断开连接了 😊
想法
最近用了一些 Cloudflare 的服务,发现光是看文档就能有很多收获。写这篇的本意也不是为了搞个隧道,主要还是想赞叹一下, 四、五行命令就能搞定只是表象,背后可能是深厚的技术底蕴、文化和以人为本的文档体验。仅以此为例,大到把 Tunnel 的技术原理讲的很清楚, 小到把常用的 RDP 和 SSH 等作为典型场景详细托出,可以说是“不厌其烦”的及时准确且详尽,丝毫不见作为“大厂”的傲慢, 也许这才是 Cloudflare 真正成功的地方。