CloudFlare Tunnel 内网穿透

工作原理

Tunnel 通过在本地网络运行的一个 Cloudflare 守护程序,与 Cloudflare 云端通信,将云端请求数据转发到本地网络的 IP + 端口。

前置条件

  • 持有一个域名
  • 将域名 DNS 解析托管到 CF
  • 内网有一台本地服务器,用于运行本地与 cloudflare 通信的 cloudflared 程序
  • 一张境内双币信用卡(仅用于添加付款方式,服务是免费的)

开始

打开 Cloudflare Zero Trust 工作台面板, 创建 Cloudflare Zero Trust ,选择免费计划。需要提供付款方式,使用境内的双币卡即可。

安装 Cloudflared

Linux 直接下载编译好的二进制包安装

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

登录 Cloudflared

cloudflared tunnel login

输入命令后,终端会给出一个登陆地址,我们拷贝到浏览器里面打开,选择需要授权的网站。

创建隧道

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

cloudflared tunnel create <隧道名字>

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

域名指向

接着,我们需要把域名指向到对应的隧道

cloudflared tunnel route dns <隧道名字> <域名>

这时候,Cloudflare 会自动添加一条 CNAME 记录到对应的域名。

配置 Cloudflared

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

vim ~/.cloudflared/config.yml

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

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 配置完以后,我们测试下配置文件有没有问题

cloudflared tunnel ingress validate

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

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

启动 Cloudflared

cloudflared --loglevel debug --transport-loglevel warn --config ~/.cloudflared/config.yml tunnel run <隧道UUID>

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

创建系统服务

按下 ctrl+z,先停掉刚才启动的服务。为了让服务能每次系统启动的时候都跟着启动,我们需要把Cloudflared注册成系统服务。

cloudflared service install
systemctl start cloudflared
systemctl status cloudflared

如果看到服务已经启动,那么恭喜你,你已经成功了。