概述

在之前我已经介绍过如何通过 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 的使用根据不同的服务类型使用方式也是不一样的:

下面就分别介绍这两种不同类型的应用的使用,其中服务端的雷同,我就合并为一个,区别在于配置有所不同,我会描述清楚。

安装 cloudflared

要想暴露服务,首先你需要在你私网设备上安装一个程序,名字叫做 cloudflared,各个系统的安装方式不一,最简单的就是直接下载二进制文件即可,我因为用 Mac,所以可以直接通过 brew 安装:

  1. [root@liqiang.io]# brew install cloudflare/cloudflare/cloudflared

安装完成就可以使用了。

配置 cloudflared

安装之后,你需要通过 cloudflared 程序绑定你的 Cloudflare 账号,这一步客户端和服务端都需要:

  1. [root@liqiang.io]# cloudflared tunnel login

执行这个命令之后,它会生成一个链接然后你在浏览器上打开这个链接,然后登陆你的账号,如果有域名的话,选择一下绑定的域名就可以了,没域名或者不想绑定可以跳过。

服务端

1. 创建 Tunnel

如果你想使用一个 Tunnel,首先你需要有一个 Tunnel,所以需要先创建一个,这里我创建一个名为 default 的 tunnel:

  1. [root@liqiang.io]# cloudflared tunnel create default

记住这个命令返回的那个 UUID,如果没记住的话,问题也不大,有两种方式可以看到他:

  1. [root@liqiang.io]# cloudflared tunnel list
  2. You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>`
  3. ID NAME CREATED CONNECTIONS
  4. 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b default 2022-09-28T00:33:33Z 2xNRT, 2xSIN
  5. [root@liqiang.io]# ls -al ~/.cloudflared
  6. total 20
  7. drwx------ 2 liqiang.io liqiang.io 4096 Sep 28 08:44 .
  8. drwxr-xr-x 55 liqiang.io liqiang.io 4096 Sep 28 21:34 ..
  9. -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 服务
  1. [root@liqiang.io]# cat ~/.cloudflared/config.yml
  2. ingress:
  3. - hostname: ssh.liqiang.io
  4. service: ssh://localhost:22
  5. - service: http_status:404
  6. tunnel: 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b
  7. credentials-file: /root/.cloudflared/1c025733-a2ec-4ec5-8d3a-9c9d6775e49b.json

这就是一个 SSH 服务的配置,这里有几个细节需要介绍一下:

2.2 配置 HTTP 服务

HTTP 服务的配置和 SSH 类似,但是更简单,只需要这么配置就可以了:

  1. [root@liqiang.io]# cat ~/.cloudflared/config.yml
  2. url: http://localhost:2223
  3. tunnel: 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b
  4. credentials-file: /root/.cloudflared/1c025733-a2ec-4ec5-8d3a-9c9d6775e49b.json

这就表示你要暴露的 HTTP 服务监听在本地的 2223 端口。

3. 上报路由配置

前面你只是在本地上配置了应用的信息,但是 Cloudflare 还不知道啊,所以你需要在 Cloudflare 上注册你的 DNS 信息:

  1. [root@liqiang.io]# cloudflared tunnel route dns 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b default

这里表示的是你想注册一个域名为 default 的公网服务,这里的域名的后缀取决于你有没有绑定域名,如果有的话就是你绑定的域名,没有的话就是 Cloudflare 给你分配的,例如:default.cdn.cloudflare.net

4. 启动服务

当一切就绪之后,你就可以暴露你的服务了,只需要执行:

  1. [root@liqiang.io]# cloudflared tunnel run

这样你的服务就会暴露在公网上了。

客户端

1. HTTP 服务

如果你暴露的是 HTTP 服务,那么无需额外的配置,只需要访问域名就可以了,例如我的就是示例域名:default.liqiang.io,直接访问你就可以看到暴露出来的 HTTP 服务了。

2. SSH 服务

如果你暴露的是 SSH 服务,那么就不能那么方便地直接访问了,而是需要配置一下本地的 SSH 配置:

  1. [root@liqiang.io]# cat ~/.ssh/config
  2. Host default.liqiang.io
  3. ProxyCommand /root/cloudflared access ssh --hostname %h

然后就可以直接访问这个 SSH 服务了:

  1. [root@liqiang.io]# ssh root@default.liqiang.io

就是多了一个步骤,需要额外地配置一下,不过还好,是一次性的工作,后续照常使用就可以了。