使用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 webserver-1123

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

Text
1
2
3
[root@Web-Server-1]# cloudflared tunnel create webserver-1
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

配置DNS记录

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

1
2
3
cloudflared tunnel route dns <tunnel-name> <domain>
# 例如
cloudflared tunnel route dns web web.example.com

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

配置Cloudflared

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

1
vim ~/.cloudflared/config.yml

输入下面的内容(根据自己要求编辑)

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

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

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

1
cloudflared tunnel ingress validate

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

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

测试运行

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

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

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

我们登陆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。