1

通过 Cloudflare Tunnel 开放 VM

 1 year ago
source link: https://liqiang.io/post/export-vm-with-cloudfalre-tunnel?lang=ZH_CN
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在之前我已经介绍过如何通过 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 安装:



  1. [[email protected]]# brew install cloudflare/cloudflare/cloudflared

安装完成就可以使用了。

配置 cloudflared

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



  1. [[email protected]]# cloudflared tunnel login

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

1. 创建 Tunnel

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



  1. [[email protected]]# cloudflared tunnel create default

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



  1. [[email protected]]# 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. [[email protected]]# 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. [[email protected]]# 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 服务的配置,这里有几个细节需要介绍一下:

  • 文件名默认为 config.yml,位置为你的 HOME 目录下的 .cloudflared 目录中;
    • 当然,你也可以自定义文件名,但是这样的话,启动时就需要指定文件路径了,因为 cloudflared 默认查找的文件名只会是 config.yml
  • SSH 服务的配置必须有一个默认的配置兜底:- service: http_status:404
  • tunnel 的值就是前面让你记起来的值
2.2 配置 HTTP 服务

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



  1. [[email protected]]# 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. [[email protected]]# cloudflared tunnel route dns 1c025733-a2ec-4ec5-8d3a-9c9d6775e49b default

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

4. 启动服务

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



  1. [[email protected]]# cloudflared tunnel run

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

1. HTTP 服务

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

2. SSH 服务

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



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

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



  1. [[email protected]]# ssh [email protected]

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK