https://blog.upx8.com/3570

前置条件

  • 首先,你要有一个 Cloudflare 的账号,并且添加了所需要使用的域名,同时,开通 Cloudflare Zero Trust。
  • 本地内网有一台 Linux 服务器。CentOS、Ubuntu、Debian 都无所谓,树莓派也没问题。Web 网站正常跑,内网能正常访问。
    https://dash.cloudflare.com/login

Cloudflared 是 Cloudflare Tunnel 的一个本地 cli 客户端,可以实现管理功能和守护程序。

服务安装

macOS 可以用 homebrew 安装

1
brew install cloudflared

Linux 直接下载编译好的二进制包安装
1
2
curl -L 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64' -o /usr/bin/cloudflared
chmod +x /usr/bin/cloudflared

系统服务

停掉刚才启动的服务,把 Cloudflared 注册成系统服务

1
2
3
cloudflared service install
systemctl start cloudflared
systemctl status cloudflared

注意:创建系统服务后,配置文件会被拷贝到 /etc/cloudflared/config.yml,后续修改配置必须修改新文件

域名授权

使用前,我们需要先登录

1
cloudflared tunnel login

输入命令后,终端会给出一个登陆地址,我们拷贝到浏览器里面打开,选择需要授权的网站。
1
2
3
4
5
6
7
8
A browser window should have opened at the following URL:

https://dash.cloudflare.com/argotunnel?callback=https%3A%2F%2Flogin.cloudflareaccess.org%JLKY87tdfsakh-jlfsakjuo8sFFJ%3D

If the browser failed to open, please visit the URL above directly in your browser.
You have successfully logged in.
If you wish to copy your credentials to a server, they have been saved to:
/root/.cloudflared/cert.pem

❗注意:授权一次只能选择一个网站。如果存在多个不同域名的网站,请授权完成后不要关闭网页,点击第二个、第三个要授权的域名,进行多次授权。

创建隧道

授权完以后,我们需要创建隧道。一般建议一台服务器创建一个隧道。

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

创建完以后,会输出隧道的一个 UUID,记录下来
1
2
Tunnel credentials written to /root/.cloudflared/12345-123-123-123-12345.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.
Created tunnel webserver-1 with id 12345-123-123-123-12345

域名指向

接着,我们需要把域名指向到对应的隧道
❗注意:下面的命令只会对第一个授权的顶级域名生效,比如 abc.com 和*.abc.com。如果有多个域名,比如 123.com、456.com,需要手工添加 CNAME 记录。

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

这时候,Cloudflare 会自动添加一条 CNAME 记录到对应的域名。
对于多个其他域名,我们需要登录 Cloudflare 的 Web 控制台,对应添加 CNAME 记录,记录值是
1
2
## <隧道UUID>.cfargotunnel.com
12345-123-123-123-12345.cfargotunnel.com

配置 Cloudflared
开始配置 Cloudflared,先编辑一个配置文件
1
vi ~/.cloudflared/config.yml

输入下面的内容(根据自己要求编辑)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

多支持的服务和配置方式,参考帮助文档:Supported Protocols
配置完以后,我们测试下配置文件有没有问题
1
cloudflared tunnel ingress validate

再测试下规则是否命中
1
2
cloudflared tunnel ingress rule https://<域名1.com>
cloudflared --loglevel debug --transport-loglevel warn --config ~/.cloudflared/config.yml tunnel run <隧道UUID>

终端会输出一大堆 log,但没有红色报错,那就没问题。
登陆 Cloudflare Zero Trust 的 Web 控制台,左边选择 Access-Tunnels,可以看到隧道已经跑起来了,状态是 Active。
在浏览器里面输入域名,正常情况下,可以看到网站已经可以正常访问了。