banner
三文字

方寸之间

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

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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。