Featured image of post 在 OpenWrt 上使用 Cloudflare Tunnel

在 OpenWrt 上使用 Cloudflare Tunnel

在 OpenWrt 上使用 Cloudflare Tunnel 服務,無需公網 IP 就能實現外網訪問內網服務。

最後更新
約 1037 字

前言

Cloudflare Tunnel 可以將您的內部網絡連接到 Cloudflare 的全球網絡,從而實現外部訪問內部服務,不需要依靠公網 IP,也就是說即使是手機的數據網絡都能架設服務。

主要問題是通常路由器上的空間有限,Cloudflare Tunnel 的執行檔大小約為 23.6MB(而且愈變愈大…),所以需要注意空間問題。 OpenWRT 內建的 luci-app-cloudflared 外掛可以快速組態 Cloudflare Tunnel 服務。

但是如果你只需要簡單的 DDNS 服務,可以使用 luci-app-ddns 外掛來自動更新 Cloudflare 的 DNS 設定。可以節省大量空間,將反向代理的功能交給其他服務,例如使用 Nginx Proxy Manager。

Nginx Proxy Manager 提供一個網頁介面,可以在網頁上組態反向代理,可以自訂 SSL,自訂錯誤頁面,支援 Proxy Host, Redirection Hosts, Streams(TCP/UDP轉發,例如轉發 SSH/SFTP)。

有提供基本的 WAF 防火牆功能,緩存,Websocket 支援,自訂 Header 等等,也支援登入限制。

可以作為 Cloudflare Tunnel 的簡易版替代方案。

安裝 Cloudflared

lucu-app-cloudflared 外掛安裝後會自動下載 cloudflared 執行檔,並安裝到 /usr/bin/cloudflared。 目前 cloudflared 版本為 v2024.4.0 執行檔大小約為 23.6MB,所以請確保路由器有足夠的空間。

另外也可以在先在 Cloudflared GitHub 下載最新的版本,然後利用 UPX 先壓縮後再上傳到路由器。

使用指令 upx --lzma cloudflared 壓縮後的執行檔大小約為 6.3MB。

留意如果啟用了自動更新,在更新後又會還原為正常大小。

可以使用 cloudflared update 來更新 cloudflared

1
2
3
        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
  24759024 ->   6609680   26.70%   linux/amd64   cloudflared     

組態 Cloudflared

方法一 (locally-managed tunnel)

OpenWRT 上執行 cloudflared tunnel login,會出現一個網址,複製到瀏覽器中,然後登入,登入後會得到 cert.pem

cert.pem 建立一個符號連結到 /etc/cloudflared/cert.pem,否則外掛會找不到 cert.pem

1
ln -s /root/.cloudflared/cert.pem /etc/cloudflared/cert.pem

最後修改 /etc/config/cloudflared 組態檔案,按照預設範本填入資料即可。 也可以在 OpenWRT 網頁管理介面中,找到 VPN -> Cloudflare Zero Trust Tunnel 進行組態。

方法二 (remotely-managed tunnel)

Cloudflare 上創建一個 Tunnel,並獲取 token。 位置: Networks -> Tunnels -> Create Tunnel

建立後,隨便選擇一個安裝環境,最後面長長的字串就是 token

OpenWRT 網頁管理介面中,找到 VPN -> Cloudflare Zero Trust Tunnel 組態 token ,最後選取 Enable 即可。

luci-app-cloudflared 外掛的設定檔在 /etc/config/cloudflared,也可以直接修改該檔案來更新設定。

常見問題

如果啟動時出現以下錯誤,可以新增或修改 /etc/sysctl.d/29-cloudflared-conf 檔案來解決。不過就算沒有 Ping 的權限也不影響使用。

1
2
3
4
5
6
The user running cloudflared process has a GID (group ID) that is not within ping_group_range.
You might need to add that user to a group within that range,
or instead update the range to encompass a group the user is already in by modifying /proc/sys/net/ipv4/ping_group_range.

Otherwise cloudflared will not be able to ping this network,
Error: Group ID 0 is not between ping group 1 to 0

/etc/sysctl.d/30-cloudflared-conf 加入以下內容,然後重啟路由器或執行 sysctl -p

1
2
net.ipv4.ping_group_range = 0 429296729
net.core.rmem_max = 2500000

Ref: How to allow unprivileged users to use ICMP (ping)


使用 Hugo 建立
主題 StackJimmy 設計