Idealisan

Cloudflare Tunnel使用指南

本文记录使用cloudflare tunnel通过本地电脑向公共网络提供http服务和web版本ssh访问的方法。

首先,我们需要下载或者使用仓库安装cloudflared程序。主流的linux发行版和macOS的包管理工具都提供了软件包,直接搜索安装即可。也可以到 https://github.com/cloudflare/cloudflared/releases 下载。

与Cloudflare服务产生关系的第一步,是登录Cloudflare账户。这里假设你已经有一个Cloudflare账户,那么在命令行里执行下面的命令,会打开一个浏览器页面,授权登录,并选择要使用的域名即可,域名可以反复选择,但是实测最终只会生效最后一次选择的域名:

cloudflared tunnel login

登录之后将在你的本地电脑账户目录中创建一个认证文件,其实是一个数字证书,以后这台电脑上的隧道都将使用这个证书代表你的账户进行操作。

接下来,我们需要创建一个隧道,使用下面的命令创建:

cloudflared tunnel create <隧道名字>
# 比如
cloudflared tunnel create webserver-1

会显示一个隧道ID,可以记下来,也可以不记下来,因为你总是可以在提示的目录中找到对应的json文件。一台电脑上仅需要使用一个隧道即可,一个隧道中可以提供多个网络服务。完全不必为了多个网络服务或者多个域名而在一台电脑上创建多个隧道。

接下来我们需要把域名和隧道关联起来,一个隧道可以和多个域名、子域名关联,只需要反复执行下面的命令即可:

cloudflared tunnel route dns <隧道名字> <域名>
# 比如一级域名(和Web界面不一样,不需要输入@)
cloudflared tunnel route dns webserver-1 abc.com
# 又比如二级域名
cloudflared tunnel route dns webserver-1 www.abc.com

这时候,Cloudflare会自动添加一条CNAME记录到对应的域名。如果有一天你不想用这个域名了,可以去域名管理面板删除这些DNS记录。

你也可以手动去域名管理面板添加DNS记录:

<隧道UUID>.cfargotunnel.com

比如

12345-123-123-123-12345.cfargotunnel.com

接下来创建配置文件。

vim ~/.cloudflared/config.yml

填写的内容类似于下面这样,你看,可以一个隧道对应多个服务,注意总是要保留最后的 - service: http_status:404

tunnel: <隧道UUID>
credentials-file: /root/.cloudflared/<隧道UUID>.json
protocol: h2mux
ingress:
  # 第一个网站,连接到本地的80端口
  - hostname: <域名1.com>
    service: http://localhost:80
  # 第二个网站,https协议,连接到本地的443端口,禁用证书校验(用于自签名SSL证书)
  - hostname: <域名2.com>
    service: https://127.0.0.1:443
    originRequest:
      noTLSVerify: true
      originServerName: <域名2.com>
  # 第三个网站,8012端口,泛域名
  - hostname: <*.域名3.com>
    service: http://localhost:8012
  # 第四个,反代MySQL sock服务
  - hostname: <mysql.域名4.com>
    service: unix:/tmp/mysql.sock
  # 第五个,反代SSH服务
  - hostname: <ssh.域名5.com>
    service: ssh://localhost:22
  - service: http_status:404

接下来启动服务即可,可以带上配置文件路快,如果使用的是默认路径也可以不带。

cloudflared tunnel --config [配置文件路径] run

为了让ssh和vnc服务更方便,你还可以配置成web页面的ssh和vnc,下面以ssh为例。首先要在网页的管理面板中找到zero trust/access/applications页面。

点击蓝色的“+Add an application”按钮,添加一个应用。选择“Self-hosted”类型,起个名字、填写对应的服务的域名,设置你想要的访问策略,最重要的是,在settings中的页面最下方,“Browser rendering”选择ssh。

现在可以通过application中的域名访问web版本的ssh了。

实测目前vnc的浏览器渲染功能不能用,为了使用vnc以及其他的tcp协议,我们需要使用cloudflared作为客户端的功能,比如下面的命令可以访问server.example.com对应的服务,并且转发到客户端本地的6389端口。例子中使用的是rdp协议,那么使用rdp客户端链接本地的6389端口就能够连接到远程的服务器的远程桌面了。

cloudflared access rdp --hostname  server.example.com --url localhost:6389
分类

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注