概述
在之前我已经介绍过如何通过 Vagrant 创建 VM 了,但是一般来说,家用的机器都不会有公网 IP,即使有公网 IP 运营商也是会屏蔽掉流行端口,所以如果你想将 VM 放到公网上使用,那么需要使用一些额外的技术,本文就介绍其中一种免费方便的:Cloudflare Tunnel。
CF Tunnel 介绍
Cloudflare Tunnel provides you with a secure way to connect your resources to Cloudflare without a publicly routable IP address.
这是 Cloudflare 在他的产品介绍页里面介绍 Tunnel 这个功能的描述,很直观,Tunnel 的作用就是那你可以在公网连接上你没有公网网络的资源。这里的资源可以是主机,虚拟机或者容器,甚至是 HTTP 服务之类的。ok,因为功能太直观了,所以就不多介绍,下面就开始实操部分。
Tunnel 使用概述
Tunnel 的使用根据不同的服务类型使用方式也是不一样的:
- 如果你是暴露 HTTP 服务,那么只需要在服务端运行 cloudflared 程序即可
- 如果你是暴露 SSH 服务,那么除了需要在服务端运行 cloudflared 程序,在客户端也需要运行 cloudflared 程序
下面就分别介绍这两种不同类型的应用的使用,其中服务端的雷同,我就合并为一个,区别在于配置有所不同,我会描述清楚。
安装 cloudflared
要想暴露服务,首先你需要在你私网设备上安装一个程序,名字叫做 cloudflared,各个系统的安装方式不一,最简单的就是直接下载二进制文件即可,我因为用 Mac,所以可以直接通过 brew 安装:
[root@liqiang.io]# brew install cloudflare/cloudflare/cloudflared
安装完成就可以使用了。
配置 cloudflared
安装之后,你需要通过 cloudflared 程序绑定你的 Cloudflare 账号,这一步客户端和服务端都需要:
[root@liqiang.io]# cloudflared tunnel login
执行这个命令之后,它会生成一个链接然后你在浏览器上打开这个链接,然后登陆你的账号,如果有域名的话,选择一下绑定的域名就可以了,没域名或者不想绑定可以跳过。
服务端
1. 创建 Tunnel
如果你想使用一个 Tunnel,首先你需要有一个 Tunnel,所以需要先创建一个,这里我创建一个名为 default 的 tunnel:
[root@liqiang.io]# cloudflared tunnel create default
记住这个命令返回的那个 UUID,如果没记住的话,问题也不大,有两种方式可以看到他:
[root@liqiang.io]# cloudflared tunnel list
You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>`
ID NAME CREATED CONNECTIONS
1c025733-a2ec-4ec5-8d3a-9c9d6775e49b default 2022-09-28T00:33:33Z 2xNRT, 2xSIN
[root@liqiang.io]# ls -al ~/.cloudflared
total 20
drwx------ 2 liqiang.io liqiang.io 4096 Sep 28 08:44 .
drwxr-xr-x 55 liqiang.io liqiang.io 4096 Sep 28 21:34 ..
-rw------- 1 liqiang.io liqiang.io 161 Sep 28 08:33 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b.json
2. 配置 Tunnel
创建好 Tunnel 之后你需要配置你这个 Tunnel 是什么应用,是 HTTP 服务呢还是 SSH 服务或者是其他,这里我就介绍两种,HTTP 和 SSH
2.1 配置 SSH 服务
[root@liqiang.io]# cat ~/.cloudflared/config.yml
ingress:
- hostname: ssh.liqiang.io
service: ssh://localhost:22
- service: http_status:404
tunnel: 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b
credentials-file: /root/.cloudflared/1c025733-a2ec-4ec5-8d3a-9c9d6775e49b.json
这就是一个 SSH 服务的配置,这里有几个细节需要介绍一下:
- 文件名默认为
config.yml
,位置为你的 HOME 目录下的.cloudflared
目录中;- 当然,你也可以自定义文件名,但是这样的话,启动时就需要指定文件路径了,因为
cloudflared
默认查找的文件名只会是config.yml
- 当然,你也可以自定义文件名,但是这样的话,启动时就需要指定文件路径了,因为
- SSH 服务的配置必须有一个默认的配置兜底:
- service: http_status:404
- tunnel 的值就是前面让你记起来的值
2.2 配置 HTTP 服务
HTTP 服务的配置和 SSH 类似,但是更简单,只需要这么配置就可以了:
[root@liqiang.io]# cat ~/.cloudflared/config.yml
url: http://localhost:2223
tunnel: 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b
credentials-file: /root/.cloudflared/1c025733-a2ec-4ec5-8d3a-9c9d6775e49b.json
这就表示你要暴露的 HTTP 服务监听在本地的 2223 端口。
3. 上报路由配置
前面你只是在本地上配置了应用的信息,但是 Cloudflare 还不知道啊,所以你需要在 Cloudflare 上注册你的 DNS 信息:
[root@liqiang.io]# cloudflared tunnel route dns 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b default
这里表示的是你想注册一个域名为 default
的公网服务,这里的域名的后缀取决于你有没有绑定域名,如果有的话就是你绑定的域名,没有的话就是 Cloudflare 给你分配的,例如:default.cdn.cloudflare.net
4. 启动服务
当一切就绪之后,你就可以暴露你的服务了,只需要执行:
[root@liqiang.io]# cloudflared tunnel run
这样你的服务就会暴露在公网上了。
客户端
1. HTTP 服务
如果你暴露的是 HTTP 服务,那么无需额外的配置,只需要访问域名就可以了,例如我的就是示例域名:default.liqiang.io,直接访问你就可以看到暴露出来的 HTTP 服务了。
2. SSH 服务
如果你暴露的是 SSH 服务,那么就不能那么方便地直接访问了,而是需要配置一下本地的 SSH 配置:
[root@liqiang.io]# cat ~/.ssh/config
Host default.liqiang.io
ProxyCommand /root/cloudflared access ssh --hostname %h
然后就可以直接访问这个 SSH 服务了:
[root@liqiang.io]# ssh root@default.liqiang.io
就是多了一个步骤,需要额外地配置一下,不过还好,是一次性的工作,后续照常使用就可以了。