banner
三文字

方寸之间

居善地,心善渊,与善仁,言善信,正善治,事善能,动善时。
github
email
misskey

Cloudflare Tunnel不完全上手指南

最近在树莓派上整了几个 web 服务,不过只能在本地使用,无法通过外网访问,所以试着使用 Cloudflare Tunnel 来进行内网穿透,这里记录下我的操作过程。

我的硬件配置

树莓派 4B+Ubuntu 系统

安装 cloudflared#

要在 Raspberry Pi 上设置 Cloudflare 隧道,我们将依赖一个名为 “ Cloudflared ” 的软件,Cloudflared 是在 本地网络 和 Cloudflare 网络之间创建和维护安全隧道的软件。有两种安装方法。

方法 1:使用 Cloudflare 存储库#

  1. 获取 Cloudflared 存储库的 GPG 密钥
curl -L https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg >/dev/null

2. 将 Cloudflared 存储库添加到软件源

echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee  /etc/apt/sources.list.d/cloudflared.list

3. 更新软件包缓存并安装cloudflared

sudo apt update
sudo apt install cloudflared

方法 2:直接使用官方 deb 包#

使用以下在 Github 的Release界面下载最新版 deb 包,并使用dpkg进行安装:

wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb && sudo dpkg -i cloudflared-linux-arm64.deb

注意树莓派 4B 安装_arm64_版本。

配置账号#

命令行执行以下命令,按照引导进行账号验证:

cloudflared tunnel login

创建隧道#

执行以下命令,创建一个 tunnel:

cloudflared tunnel create <tunnel-name>

运行上面的命令后,您将看到类似于下面的消息

Tunnel credentials written to /home/pi/.cloudflared/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.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 pimytunnel with id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

这一步在创建 tunnel 的同时,还生成一个 tunnel 的 UUID,一个凭证文件以及一个.cfargotunnel.com 的子域名,UUID 以及凭证文件将在之后配置文件时使用,务必记住 UUID 以及凭证文件的路径(在默认路径中,后面会提到)。

也使用以下命令验证是否创建成功:

cloudflared tunnel list

详细配置隧道#

配置文件的默认路径有 3 个,分别是:

  1. ~/.cloudflared
  2. /etc/cloudflared
  3. /usr/local/etc/cloudflared

这里我们使用当前用户目录,即~/.cloudflared,我们在该目录下面创建一个配置文件,命名为config.yml,并填入之前创建的 tunnel 时的生成的配置信息:

tunnel: <Tunnel-UUID>
credentials-file: /home/pi/.cloudflared/<Tunnel-UUID>.json

ingress:
        - hostname: test.example.com
          service: http://localhost:80
        - hostname: example.com
    	  service: https://localhost:8000
        - service: http_status:404

然后按照配置文件的格式配置自己的 web 服务的主机名和端口,每个规则一般包含hostnameservice两部分,注意最后一行的- service: http_status:404,我们可以发现没有 hostname 部分,这并不是错误,而是cloudflared的特殊规则,主要是用来匹配所有流量,是必须要有的。

这和cloudflared匹配规则有关,当 cloudflared 收到传入请求时,它会从上到下评估每个入口规则,以找到与请求匹配的规则。规则可以匹配传入请求的主机名或路径,或两者。如果所有规则都不匹配,就会匹配最后一条规则。

路由内网服务流量#

使用以下命令分配一个 CNAME 记录,将流量指向您的隧道子域。

cloudflared tunnel route dns <UUID or NAME> <hostname>

# example
cloudflared tunnel route dns pi test.example.com

运行隧道#

执行以下命令,将 cloudflared 连接到 Cloudflare 的网络,Cloudflared 会从默认位置检索配置文件,即 ~/.cloudflared/config.yml

cloudflared tunnel run <UUID or NAME>

如果你的配置文件不在默认路径,可以使用--config选项来运行隧道:

cloudflared tunnel --config /path/your-config-file.yaml run <UUID or NAME>

检查隧道参数#

至此,隧道配置完成,可以执行下面的命令来获得刚刚创建的隧道的信息:

cloudflared tunnel info

其他一些常用的命令:

FunctionsCommands
创建隧道cloudflared tunnel run <NAME>
隧道列表cloudflared tunnel list
停止隧道cloudflared tunnel stop <NAME>
重新启动隧道cloudflared tunnel restart <NAME>
删除隧道cloudflared tunnel delete <NAME>
强制删除隧道cloudflared tunnel delete -f <NAME>
显示隧道信息cloudflared tunnel info <NAME>

将隧道作为服务运行#

将 Tunnel 安装为系统服务,允许 Tunnel 在启动时作为启动守护进程自动运行。默认情况下,Tunnel 希望在默认目录 ~/.cloudflared/config.yml 中找到配置文件,但要将 Tunnel 作为服务运行,我们需要将 config.yml 文件移动到 ~/etc/cloudflared/ 中。

使用 mv 命令来移动配置文件

sudo mv /home/pi/.cloudflared/config.yml /etc/cloudflared/

然后执行以下命令安装服务:

sudo cloudflared service install

启动服务:

systemctl start cloudflared

检查服务运行状态:

systemctl status cloudflared

踩坑#

启动隧道服务时遇到的一个问题:

failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB).

解决方法:

sudo sysctl -w net.core.rmem_max=2500000

参考#

https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/
https://github.com/quic-go/quic-go/wiki/UDP-Receive-Buffer-Size

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。