起因是觉得在批量配置的时候,需要一直在WEB页面上操作,比较繁琐。在翻阅文档的时候,看见了Locally-managed tunnels,可以将隧道配置存储在本地,然后启动隧道就行了。

生成隧道证书

cloudflared认证文件分为两种,一种是帐户证书可以操作所有隧道(cert.pem),一种是隧道证书只能操作指定隧道(<Tunnel-UUID>.json)。帐户证书的有效期是十年,隧道证书的有效期是永久的。

这里以隧道证书为例:

首先在一个已经安装好了cloudflared的环境下执行:

1
cloudflared tunnel login

命令会提示你打开一个链接,然后登录CloudFlare账号,登录成功后会在默认 cloudflared 目录(Windows下为:%USERPROFILE%\.cloudflared,也就是用户家目录下的.cloudflared文件夹)中生成帐户证书cert.pem

然后执行:

1
cloudflared tunnel create <NAME>

将会在默认 cloudflared 目录下生成一个<Tunnel-UUID>.json文件。

创建配置文件

配置文件的格式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
tunnel: <Tunnel-UUID>
credentials-file: /root/.cloudflared/<Tunnel-UUID>.json

ingress:
  - hostname: test.example.com
    service: http://localhost:80
  - hostname: test1.example.com
    service: http://localhost:80
    originRequest:
    	httpHostHeader: host.example.com
  - service: http_status:404

tunnel填写上面生成的<Tunnel-UUID>credentials-file填写<Tunnel-UUID>.json的路径。

ingress下填写的是流量代理规则,hostname填写自己的域名,service填写对应服务的地址,originRequest用于指定一些回源的参数,如:host、超时时间等。

(注意:最后必须要有一个匹配所有流量的规则,也就是service: http_status:404,否则运行时会报错。)

更多的回源参数可以参考:Origin configuration parameters · Cloudflare Zero Trust docs

启动隧道

在配置文件所在目录执行:

1
cloudflared tunnel run --config <config.yaml> run <NAME or UUID>

最后域名添加dns解析到<UUID>.cfargotunnel.com,然后就可以访问了。为了方便,可以直接将通配符解析到<UUID>.cfargotunnel.com

参考:

Useful terms · Cloudflare Zero Trust docs

Configuration file · Cloudflare Zero Trust docs

Origin configuration parameters · Cloudflare Zero Trust docs