穿透和隧道

目前市面上有很多内网穿透和隧道服务,比如 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 真正成功的地方。