xChar
·2 years ago

最近在树莓派上整了几个 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

Loading comments...