Cloudflare

使用 Cloudflare 进行内网穿透

由于现在公网 IP 个人没法申请,要想部署 web 服务主要方法是购买云服务器或者使用内网穿透,Cloudflare 内网穿透(Cloudflare Tunnel)是 Cloudflare 提供的一项服务,用于将您的 Web 应用程序安全地暴露在公共互联网上,同时保护其免受恶意流量和网络攻击的威胁。内网穿透的作用主要表现在以下几个方面:

  1. 实现云与设备之间打通一条加密通道,使得 Cloudflare 的 CDN 可以很方便地通过这条加密通道访问到部署在内网的服务,包括 Web、SSH 等。
  2. 帮助用户将位于内网中的服务暴露到公网上,使得外部用户可以通过互联网访问这些服务。
  3. 相比较于其他内网穿透工具如 frp、ngrok 等,使用 Cloudflare Tunnel 可以获得更好的安全性和性能。
  4. 无需考虑电信、移动等 ISP 不提供固定 IP 地址、不能开放端口等问题,并且解决了备案问题。
  5. Cloudflare Tunnel 还是免费的。

Linux 安装

在 Linux 上,可以直接下载二进制文件,并给以可执行权限,比如安装 amd64 版本:

1
2
curl -L 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64' -o ./cloudflared
chmod +x ./cloudflared

登录

输入命令进行登录:

1
./cloudflared tunnel login

输入命令后,会给出一个 URL,打开浏览器访问这个 URL,选择需要授权的网站。

创建 Tunnel

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

1
2
3
./cloudflared tunnel create <隧道名字>
# 比如
./cloudflared tunnel create sites

创建完以后,会输出隧道的一个 UUID,记录下来

1
2
3
4
[root@thinkpad]# ./cloudflared tunnel create sites
Tunnel credentials written to /root/.cloudflared/19344792-f174-4746-a10e-6c4ff0c36f2b.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 sites with id 19344792-f174-4746-a10e-6c4ff0c36f2b

配置 DNS 记录

使用如下命令配置 DNS,其中的 <tunnel-name> 是创建 Tunnel 时指定的名称,<domain> 是自定义的域名,比如 web.example.com:

1
2
3
cloudflared tunnel route dns <tunnel-name> <domain>
# 例如
./cloudflared tunnel route dns sites node.this4u.cn

如果还有其他域名需要配置,可以继续执行上面的命令。配置完成后可以前往 Cloudflare 控制台查看到 CNAME 记录。

配置 Cloudflared

接着,我们开始配置 Cloudflared,先编辑一个配置文件

1
vim ~/.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
24
25
# Tunnel UUID,就是同目录下的json文件的文件名
tunnel: <隧道UUID>
# 鉴权文件路径,注意根据自己的路径修改,下面的例子是Linux的路径
credentials-file: /home/user/.cloudflared/<隧道UUID>.json
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
# 最后记得添加一个默认404
- service: http_status:404

更多支持的服务和配置方式,参考帮助文档:Supported protocols

配置完以后,我们测试下配置文件有没有问题

1
./cloudflared tunnel ingress validate

还可以再测试下规则是否命中

1
./cloudflared tunnel ingress rule https://域名1.com

测试运行

如果没问题,OK,一切妥当,我们开始测试

1
cloudflared tunnel  --no-autoupdate --config ~/.cloudflared/config.yml run <tunnel-uuid>

终端会输出一大堆 log,但没有红色报错,那就没问题。

配置 DNS后,我们登录 Cloudflare DNS记录,可以看到已经添加进去的记录,这时候还没有穿透,需要执行测试运行即可实现内网穿透。

我们登陆 Cloudflare Zero Trust 的 Web 控制台,左边选择 Access-Tunnels,可以看到隧道已经跑起来了,状态是 Active。

然后,我们在浏览器里面输入域名,正常情况下,你可以看到网站已经可以正常访问了。

创建系统服务

先停掉刚才启动的服务。为了让服务能每次系统启动的时候都跟着启动,我们需要把 Cloudflared 注册成系统服务。不然系统一重启,就歇菜了。

1
2
3
4
# 需指定config路径,否则使用default configuration path会报错
sudo cloudflared --config /home/lk/.cloudflared/config.yml service install
systemctl start cloudflared
systemctl status cloudflared

跑完这三条命令,应该就可以看到服务有正常输出,并且 Web 控制台也可以看到状态是 Active。