透過 Cloudflare Tunnel 連到中繼
Cloudflare Tunnel 讓你的中繼擁有公開的 HTTPS 位址,不需要自己的伺服器,也不必在路由器上開放連接埠。OAR 可以替你執行 Cloudflare 的 cloudflared 程式:它會隨中繼一起啟動、在斷線時重新啟動,並在狀態點中顯示它的狀態。如果你在 Cloudflare 上有網域,並想從手機或其他網路連到中繼,或是你需要 HTTPS 來把頁面安裝成 App 和使用推播通知,就選擇這種方式。
cloudflared 會向外連線到 Cloudflare。中繼仍然只在這台機器上監聽(localhost 維持 true),Cloudflare 則把傳給你主機名稱的請求,經由這條連線送到中繼的連接埠。
你需要什麼 #
- 一個啟用 Zero Trust 的 Cloudflare 帳戶,以及帳戶中一個用於公開主機名稱的網域(zone)。
- 在執行中繼的機器上安裝
cloudflared。OAR 不包含它,也不會安裝它。 - 一個你在 Cloudflare 中建立的 tunnel。OAR 會用該 tunnel 的 token 執行它。
中繼會執行 cloudflared 中指定的程式,否則就執行它在 PATH 上找到的 cloudflared。安裝方式:
| 系統 | 安裝 |
|---|---|
| Windows | winget install --id Cloudflare. |
| macOS | brew install cloudflared |
| Linux | Cloudflare 的套件儲存庫(Debian、Ubuntu、RHEL):pkg.cloudflare.com |
在 Windows 上,. 或 . 啟動器無法使用。OAR 只會啟動 . 或 . 檔案。
只支援一種 tunnel
OAR 支援以 token 執行的 tunnel,也就是 Cloudflare 所稱的遠端管理 tunnel。沒有用於憑證檔案或 tunnel 名稱的設定,也沒有用於隨機位址快速 tunnel 的設定。如果你自己執行這類 tunnel,請在 OAR 之外啟動 cloudflared。這樣 OAR 就完全不知道它的存在。
設定 #
- 在你的 Cloudflare Zero Trust 帳戶中建立一個 tunnel。複製它的 token。
- 在你的網域上為這個 tunnel 設定一個公開主機名稱,例如
relay.,並把它指向example. com http://。如果你變更過localhost: 3333 config.中的json port,請使用那個連接埠。這項路由設定存放在 Cloudflare,而不是在你的機器上。 - 把含有 token 的
cloudflared區塊加到Tunnel config.(見設定的 key)。json - 用
oar restart重新啟動中繼。
在瀏覽器中開啟 https://。你像平常一樣用存取 token 登入。
設定區塊 #
{
"cloudflaredTunnel": {
"mode": "managed",
"required": false,
"token": "<tunnel token>",
"binary": "cloudflared",
"extraArgs": []
}
}
| Key | 類型 | 預設值 | 作用 |
|---|---|---|---|
mode |
"disabled" 或 "managed" |
"disabled" |
managed 會讓中繼執行 cloudflared。 |
token |
字串 | 無 | tunnel 的 token。managed 時為必填;沒有它,tunnel 會保持關閉,記錄中會說明原因。 |
required |
布林值 | false |
tunnel 未連線時,中繼會暫停從佇列中取出訊息。見必要的 tunnel。 |
binary |
字串 | cloudflared |
要執行的程式:絕對路徑,或在 PATH 上查找的名稱。路徑必須指向可執行檔。含有資料夾的相對路徑會從中繼的程式資料夾算起,所以請使用絕對路徑。 |
extra |
字串陣列 | [] |
加在 cloudflared tunnel run --token <token> 後面的參數。空白項目會被捨棄。 |
舊的寫法 "enabled": true 仍然等同於 mode: "managed"。有三個環境變數會覆寫檔案中的設定:COPILOT_、COPILOT_ 和 COPILOT_。config.json 參考資料會把這些 key 與其他 tunnel 設定一起列出,環境變數頁面則列出這些變數。
中繼會以命令列參數(cloudflared tunnel run --token <token>)把 token 交給 cloudflared,而不是透過環境。因此在有其他使用者的機器上,token 可能會出現在執行中處理程序的清單裡。中繼的記錄則會把它顯示為 <redacted>。
運作方式 #
- 啟動與停止。 中繼啟動時會啟動
cloudflared,關閉時則停止它(傳送終止訊號)。 - 已連線。 當
cloudflared回報已註冊的連線時,tunnel 就算已連線;如果沒有這種回報,則在它執行滿五秒時算已連線。 - 斷線。
cloudflared結束時,中繼會在等待大約 5、10、20、40 秒,之後每次 60 秒後再次啟動它,每次等待最多再加上 20%。連線持續超過 30 秒後,這些間隔會從頭開始。 - token 錯誤或 tunnel 已刪除。 如果
cloudflared連續三次在 10 秒內結束,中繼會回報錯誤auth-,之後只會大約每分鐘重試一次。or- config - 沒有
cloudflared。 中繼照常啟動,tunnel 保持關閉。中繼每分鐘重新查找一次,程式出現後就會啟動 tunnel。如果你把它安裝到不在中繼PATH上的資料夾,請重新啟動中繼。
必要的 tunnel #
設定 required: true 時,tunnel 未連線期間中繼不會從佇列中取出訊息。這包括第一次連線之前的時間,以及缺少 cloudflared 或 token 的情況。如果只有從外部能連到中繼時它才有用,就使用這個設定。訊息會在佇列中等待,並在 tunnel 連線後執行(見回合與佇列)。
查看狀態 #
| 位置 | 顯示內容 |
|---|---|
| 狀態點 | tunnel 連線期間為琥珀色,提示為 Web relay reachable via Cloudflare Tunnel(可透過 Cloudflare Tunnel 連到網頁中繼)。已設定但未連線時為綠色:提示為 Web relay reachable; Cloudflare tunnel disconnected (cloudflared 時則為 Cloudflare tunnel off: |
oar status |
tunnel 開啟時會有一行 Tunnel::running、not connected、not connected (<reason>) 或 off: <reason>。中繼停止時,它顯示的文字與 oar doctor 相同。見 oar status。 |
oar doctor |
disabled、managed (cloudflared: <path>) 或 managed, cannot start: <reason>。它只讀取設定檔,不會變更任何東西。見 oar doctor。 |
| 記錄 | 以 [cloudflared- 開頭的行:執行的指令(token 顯示為 <redacted>)、Tunnel connected、結束與重新連線的延遲,以及 cloudflared 自己的輸出。 |
因為路由設定存放在 Cloudflare,中繼並不知道你的公開主機名稱,所以以上都不會顯示它。
區分 tunnel 流量 #
Cloudflare 會在它轉送的每個請求中加上 cf- 標頭。中繼用它來區分經由 tunnel 傳來的請求和在這台機器上發出的請求。如果你也想讓你自己的邊緣節點加上的標頭被這樣看待,請把它們列在 tunnel 中。public 列出可連到中繼的主機名稱,trust 則決定中繼相信哪些 proxy 提供的轉送位址。預設值 "loopback" 適合在同一台機器上執行的 cloudflared。這三個都在 config.json 參考資料中。
預覽用的第二個主機名稱 #
預覽需要自己的主機名稱,這樣被預覽的 App 就絕不會和中繼共用登入 cookie。把它加到同一個 tunnel,作為第二個公開主機名稱,並指向預覽監聽程式(預設為 http://)。預覽頁面有 ingress 範例和 previews 區塊。請把中繼的主機名稱放進 public。
中繼前面的 Cloudflare Access #
套用在中繼主機名稱上的 Cloudflare Access 應用程式,會作用於每個訪客,包括分享的對話的觀看者。如果沒有設定例外,他們會被要求登入,連結也就無法使用。請讓 / 和 / 不需登入即可通過。
不要為 / 加上 Cloudflare 快取規則。分享的頁面會重新載入這個位址來追蹤對話,而快取的回應會一直顯示舊的狀態。中繼會在每個 API 回應中加上 Cache-,並在每個回應中把 CDN- 和 Cloudflare- 設為 no-。Cloudflare 會優先遵守這兩個標頭,而不是你網域中的快取規則。
安全性 #
tunnel 會把中繼放到公開的網際網路上。能把其他人擋在外面的是存取 token。見存取 token 與誰能連到中繼和 OAR 會暴露什麼。
中繼的 session worker 透過只在這台機器上運作的 socket 連線。因為公開的 tunnel 會轉送每個路徑,中繼對這些路徑上帶有 cf- 或你的任一 tunnel 的請求,會回應 403,並在記錄中以 [tunnel- 註明。分享連結雖然不需登入就經由 tunnel 傳來,但不受影響。
疑難排解 #
| 你看到的情況 | 處理方式 |
|---|---|
提示顯示 Cloudflare tunnel off: cloudflared is not installed(Cloudflare tunnel 已關閉:未安裝 cloudflared),後面接著安裝方式;或 oar doctor 顯示 cloudflared is not installed |
安裝 cloudflared(見你需要什麼)。tunnel 會在一分鐘內啟動。 |
cloudflared was not found as configured (<path>) |
cloudflared 指向不存在的東西。請修正路徑,或清除這個 key,改用 PATH 上的 cloudflared。 |
cloudflared |
把 token 加到設定檔中,或設定 COPILOT_。 |
Tunnel: not connected (auth- |
cloudflared 一啟動就一直結束。請檢查 token,以及這個 tunnel 是否仍存在於 Cloudflare 中。記錄中有 cloudflared 自己的訊息。 |
Tunnel: not connected (exit:<code>) |
cloudflared 以該結束碼結束。中繼正在重試;請查看記錄。 |
| 你明明是透過 tunnel 開啟中繼,狀態點卻維持綠色 | 從中繼這一端來看,tunnel 並未連線。請查看提示和 oar status。 |
| 訊息沒有執行,佇列已暫停 | required 為 true,而 tunnel 未連線。請修好 tunnel,或把 required 設為 false。 |
| 分享連結要求觀看者登入 | Cloudflare Access 擋住了。請讓 / 和 / 通過。 |
| 分享的頁面顯示舊的狀態 | 有快取規則涵蓋了 /。請移除它。 |
session worker 路徑回應 403 |
這是預期的:這些路徑不接受 tunnel 流量。 |
已安裝 cloudflared,但 tunnel 沒有啟動 |
中繼可能在它的 PATH 上看不到它。把 binary 設為完整路徑,然後執行 oar restart。 |