用 Cloudflare Tunnel 进行内网穿透

Cloudflare Tunnel (即原来的 Argo Tunnel) 免费啦(blog.cloudflare.com)!支持转发的服务也很多(developers.cloudflare.com),包括 HTTP(会转换为 HTTPS 服务)、TCP、直接返回一个 HTTP 状态、测试页 (--hello-world),甚至跳板机(--bastion)。

但是官方文档不太好用,于是我们来写一点 tl;dr 吧。

首先,下载 cloudflared(developers.cloudflare.com)。

内网穿透是什么?

内网穿透,指的是将内网端口暴露到公网。由于防火墙的限制,或者中国大陆普遍的 NAT 宽带接入方式,大多用户没有属于自己的公网 IP,因此其它用户无法访问其设备上对外开放的服务(例如 Web 服务器,或者比较常见的案例是 Minecraft 服务器)。过去有许多常见的内网穿透解决方案(例如花生壳(hsk.oray.com)、Ngrok(ngrok.com)、frp(gofrp.org) 及一系列衍生自 frp 的服务等),而 Cloudflare Tunnel 的免费开放,又为我们提供了一种看起来不错的新选择。

配置自己的域名(可选)

Cloudflare Tunnel 可以绑定到自己的域名上,也可以直接用 Cloudflare 自己提供的域名。如果希望使用 Cloudflare 提供的域名,可以跳过此节。

授权域名

运行 cloudflared tunnel login,并在浏览器中选择一个域名来授权。

你的家目录中会出现 ~/.cloudflared/cert.pem。在我们创建隧道和设置 DNS 解析的时候,我们会用到这个文件。

创建隧道

运行 cloudflared tunnel create [名字],创建一个隧道。这条命令需要之前的 cert.pem 用来验证身份。

你的家目录中会出现 ~/.cloudflared/[一长串UUID].json,里面保存这运行这条隧道所需要的授权信息。

配置路由

创建了隧道之后,我们还需要让它可以被访问。Cloudflare 支持将其部署到负载均衡器后端,或者通过 DNS 直接访问。这里只介绍后者的使用方法。

cloudflared tunnel route dns [名字或者 UUID] [想要绑定到的域名或其二级域名]

sh

你会发现这个域名被设置了一个指向 [UUID].cfargotunnel.com 的 CNAME 记录,并且通过 Cloudflare 进行代理(即橙云)。

范例

例如,创建一条隧道,设置隧道名字为 mltd,并将其绑定到 cgss.example.com:

运行 cloudflare tunnel login,并在网页中授权 example.com

运行 cloudflare tunnel create mltd

运行 cloudflare tunnel route dns mltd cgss.example.com

暴露本地网站到公网

服务端需要下载 cloudflared 并拥有一个 Cloudflare 帐号。客户端...什么都不需要。

cloudflared tunnel --name [隧道名称] --url http://[站点地址] # 如果使用自己配置好的域名/隧道 # 例如:假设要将在本地的 8080 端口的网站暴露给名为 mltd 的隧道: # cloudflared tunnel --name mltd --url http://127.0.0.1:8080

sh

或者:

cloudflared tunnel --url http://[站点地址] # 如果使用 Cloudflare 提供的域名 # 例如:假设要暴露本地 8080 端口上的网站: # cloudflared tunnel --url http://127.0.0.1:8080

sh

之后就可以通过自己绑定的域名,或者 Cloudflare 生成的域名对网站进行访问。在后一种情况下,cloudflared 会给出一个域名供你使用,像这样:

+-------------------------------------------------------------+ | Your free tunnel has started! Visit it: | | https://do-the-idol-hardcore-techno.trycloudflare.com | +-------------------------------------------------------------+

text

搭建 Minecraft 服务器(或者任何其它 TCP 服务)

服务端配置

服务端需要下载 cloudflared 并拥有一个 Cloudflare 帐号。方法和上节类似,只不过把 http:// 改为 tcp://:

cloudflared tunnel --name [隧道名称] --url tcp://[服务地址] # 如果使用自己配置好的域名/隧道 # 例如:假设要将在本地的 25565 端口的 Minecraft 服务器暴露给名为 mltd 的隧道: # cloudflared tunnel --name mltd --url tcp://127.0.0.1:25565

sh

或者:

cloudflared tunnel --url tcp://[服务地址] # 如果使用 Cloudflare 提供的域名 # 例如:假设要暴露本地 25565 端口上的 Minecraft 服务器 # cloudflared tunnel --url tcp://127.0.0.1:25565

sh

后一种情况下,cloudflared 会给出 一个域名供你使用,依旧像这样:

+-------------------------------------------------------------+ | Your free tunnel has started! Visit it: | | https://do-the-idol-hardcore-techno.trycloudflare.com | +-------------------------------------------------------------+

text

客户端配置

客户端需要下载 cloudflared,并且从服务端处得到 Minecraft 服务器绑定到的域名(*.trycloudflare.com 也可以哟)。

cloudflared 默认直接作为字节流输入源(给 ProxyCommand 用(developers.cloudflare.com))。不过为了方便起见,我们在这里给远端服务设置一个本地端口转发:

cloudflared access tcp --hostname [绑定到的域名] --listener [本地监听地址] # 例如:假设要将绑定到 cgss.example.com 的隧道的 Minecraft 服务器映射到本地的 35565 端口 # cloudflared access tcp --hostname cgss.example.com --listener 127.0.0.1:35565 # 之后在 Minecraft 中连接到 127.0.0.1:35565 就可以啦!

sh

跳板机(--bastion)

所谓跳板机,即可以根据需求访问跳板机可以连接到的的任何一个端口。

跳板机配置

cloudflared tunnel --name [隧道名称] --bastion # 如果使用自己配置好的域名/隧道

sh

或者:

cloudflared tunnel --bastion # 如果使用 Cloudflare 提供的域名

sh

客户端配置

cloudflared access tcp --hostname [绑定到的域名] --destination [跳板目的地址] --listener [本地监听地址] # 例如:假设要将绑定到 cgss.example.com 的隧道的跳板机内网的 10.1.2.3 的 22 端口的 TCP 服务映射到本地的 8022 端口 # cloudflared access tcp --hostname cgss.example.com --destination 10.1.2.3:22 --listener 127.0.0.1:8022

sh

更多配置

也可以在服务端指定配置文件以避免每次重新输入好长好长的命令,或做到同时配置多个服务。

配置文档在这里(developers.cloudflare.com),本文就不详谈了。

转载自:https://blog.outv.im/2021/cloudflared-tunnel/

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容