前陣子用 Raspberry Pi 5 做了一個小小的伺服器,雖然用 Tailscale 的虛擬私人網路可以滿容易的連線,但不確定是 Raspberry Pi 還是 Tailscale 的問題,有一天突然連不上。想到之後要回日本,到時候會更難找問題,所以想想還是把 Cloudflare Tunnel 給搭起來,如果之後用其他電腦也會簡單一點,不用下載登入 Tailscale 之類的。

使用 Cloudflare Tunnel Docker Image

在我這個狀況下,使用 Cloudflare Tunnel 有兩種方式,第一種是直接在 Raspberry Pi 的作業系統上安裝,另一種是跑在一個 Docker Container 裡面。我個人覺得兩者的最終效果應該差不多,我是選擇跑在 Docker 裡面來隔離,這樣以後如果要關閉或變更都簡單一點。

使用 Cloudflare Tunnel Docker Image 的方式很簡單,建立 Tunnel 後就可以找到指令了。



建立後,因為我想和 Nginx Reverse Proxy 一樣的方式管理,所以我在 Portainer 裡面把他加到同樣網路。

在管理頁面(像是取得指令後的下一頁,或是從清單裡面進去編輯),透過 Public hostnames 來建立對應的網址。

完成後像是這樣:

可以看到右邊 Service 是 Docker 內部的 Hostname,這也是我選擇跑在 Docker 裡面的主要原因,比較好知道到底對應到哪個服務。SSH 則是使用 Docker 區域網路中指向宿主的區域網路 IP,後面會提到如何透過 Tunnel 連線。

Portainer

Portainer 是我卡比較久的地方,後來發現是因為 Portainer 是使用自簽憑證,所以要忽略 TLS 認證才能夠正常連線。

三級域名的問題

在一開始,我原本打算和前一篇一樣,用三級域名來管理(變成類似 service.cf.some.host),但弄了許久發現免費版 Cloudflare 不會幫我們產生泛用憑證,也不允許我們自己上傳 Let’s Encrypt 的。而由於 Cloudflare Tunnel 一定要給 Cloudflare Proxy,所以即便伺服器端提供了有效憑證,還是無法完成連線(Cloudflare Proxy 會把流量解密後重新用新的 Certificate 加密,但他沒有 Cerificate 可以進行加密)。在美觀和免費之間,我還是選了免費,畢竟這網址只有自己會用,哈哈。

(我們需要的是 *.cf.some.host 的 Universal Certificate,但不幸的購買 Advanced Certificate 每月花費 10 美金,自訂 SSL 憑證則要 200 美金。)

用 Zero Trust 加上登入機制

當初不想用 Cloudflare Tunnel,最主要也是不希望哪天被別人開到,雖然每個服務都有身分認證,但小機器一點流量就可以把他打死,所以還是上一個認證比較好。

我們可以使用 Zero Trust > Access > Applications > Self-hosted 來建立。

由於我後來都用 service-cf.some.host,我可以 *-cf.some.host 來針對所有的 Tunnel 流量做身分認證。

他顯示沒有 DNS 紀錄,但不用擔心,因為我們前面建 Tunnel 的時候會幫我們開好。

身分驗證方式,我個人覺得最簡單的是 Email Policy 加上 One-time PIN。所以在 Policy 部分,我們在 Rule 裡面加入自己的 Email 地址。

Login methods 裡面我們先透過 Manage login methods 裡面啟用 One-time PIN


(實際上我很久以前就已經設定過,所以可能預設就啟用了也說不定?)

這樣,當開啟被 Tunnel 管理的服務時,就會要求登入了。

透過 SSH 登入

前面我有設定了 SSH,雖然目前推薦用 WARP 或 Browser-rendered SSH Terminal,但 WARP 要多安裝,Browser Terminal 則不習慣,另一方面是我的工作機本來就有安裝 Cloudflared,所以我還是用 Client-side Cloudflared 進行。

方式也很簡單,和以往的 SSH Config 一樣,只是多加入 Proxy Command。

其他方法可以參考官方文件

當登入時,他就會先跳出瀏覽器進行身分認證,之後才啟用 Tunnel 來連線。

後記

這次因為連線問題,還是回頭把 Cloudflare Tunnel 給搭起來了。果然該來的還是會來啊(誤)。但還好是在來日本前處理好,至少不需要搭飛機回台灣處理。