最近在樹莓派上整了幾個 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