最近在树莓派上整了几个 web 服务,不过只能在本地使用,无法通过外网访问,所以试着使用 Cloudflare Tunnel 来进行内网穿透,这里记录下我的操作过程。
我的硬件配置
树莓派 4B+Ubuntu 系统
安装 cloudflared#
要在 Raspberry Pi 上设置 Cloudflare 隧道,我们将依赖一个名为 “ Cloudflared
” 的软件,Cloudflared 是在 本地网络 和 Cloudflare 网络之间创建和维护安全隧道的软件。有两种安装方法。
方法 1:使用 Cloudflare 存储库#
- 获取 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 个,分别是:
~/.cloudflared
/etc/cloudflared
/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 服务的主机名和端口,每个规则一般包含hostname
和service
两部分,注意最后一行的- 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
其他一些常用的命令:
Functions | Commands |
---|---|
创建隧道 | 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