Journal
用 Cloudflare Tunnel 把自架 Foundry VTT 開給玩家
朋友在帶網路團的 D&D,用 Foundry VTT(簡稱FVTT) 自己架房開給玩家連線。他試過的虛擬區網工具免費版不是卡人數就是要收月費,剛好卡在那個門檻上。我想起自己有個掛在 Cloudflare 的網域,查了一下,發現 Cloudflare Tunnel 剛好能做這件事。這篇記一下解法和幾個要注意的地方。
問題:自架服務要開給外人連,又不想動路由器
FVTT 是 DM(地下城城主,在這個情境下是做為架設遊戲室的角色) 在自己電腦上跑的服務,預設聽在 30000 port。要讓玩家連進來,傳統上兩條路:在路由器做 port forwarding,或用虛擬區網把大家拉進同一個虛擬網段。
前者要有固定公網 IP、要開防火牆和轉埠,不是每個人家裡的網路環境都設得動。後者對非技術的 DM 友善,裝個客戶端就好,但免費方案通常卡連線人數或要月費。他就是卡在這裡。
為什麼是 Cloudflare Tunnel
關鍵在它的連線方向。cloudflared(Cloudflare 的連接器程式)跑在 DM 的電腦上,由它主動對 Cloudflare 邊緣建立一條出站連線。玩家連的是我網域底下的一個子網域,流量會先到 Cloudflare,再沿著這條已經建好的隧道送回 DM 電腦的 localhost:30000。
因為連線是從 DM 端往外打出去的,DM 這邊完全不用開 port、不用固定公網 IP,家裡路由器一個字都不用改。連線數也不看某個 App 的授權,看的是 Cloudflare 的免費額度,對一團玩家綽綽有餘。前提只有一個:要有一個 DNS 託管在 Cloudflare 的網域,這個我本來就有。
實際怎麼設
- 在 Cloudflare Zero Trust 後台新增一條 tunnel,取個名字。
- 建好之後後台會給一段 connector token,連同一行安裝指令一起顯示,長得像
cloudflared service install <一長串 token>。整段複製起來。 - 把這行指令交給 DM,在他要跑 FVTT 的那台電腦上執行。裝好後
cloudflared會以背景服務常駐,後台的 tunnel 狀態會轉成 healthy,代表連接器已經接上 Cloudflare。 - 回後台幫這條 tunnel 設一個 public hostname:填一個子網域(例如
game.你的網域),對應到本機服務http://localhost:30000。 - 完成。玩家在瀏覽器打開那個子網域,就會透過隧道連到 DM 的 Foundry。
那段 token 要當密碼看待。拿到它的人就能把流量接進這條隧道,別貼到任何公開的地方。
兩個實際會踩到的限制
免費方案有單次請求 100MB 的上限,指的是單一檔案、不是總量。平常的 token、靜態地圖離這個數字很遠,會碰到的多半是動態影片地圖那種單檔破百 MB 的東西。真正麻煩的不是失敗本身,是它的表現:超過上限時由 Cloudflare 邊緣先擋下、回一個 413,這個錯誤不是 Foundry 丟的,所以 FVTT 前端跳出來的訊息常常只說「上傳失敗」、不講原因,DM 很容易卡在「同一個檔在本機好好的、一上線就失敗」卻查不出所以然。碰到上傳莫名其妙失敗,第一個就往「檔案是不是超過 100MB」去想;要確認就開瀏覽器 DevTools 的 Network,看那個上傳請求是不是 413。
好在這個方案裡伺服器就是 DM 自己的電腦,大檔根本不必透過瀏覽器上傳走 tunnel,直接用檔案總管丟進 Foundry 的 Data 資料夾就好,本機操作沒有大小限制。(模組和冒險包也不受這條限制,那是伺服器自己去官方來源下載,沒走玩家上傳這條路。)
另外 FVTT 靠 WebSocket 做即時同步。Cloudflare 免費方案支援 WebSocket,所以能正常跑。這點會卡掉不少其他的反向代理方案,Cloudflare 剛好沒這個問題,設之前值得先確認一下。
後來
朋友那台當晚就接上了,玩家不用再各自裝虛擬區網的客戶端,開瀏覽器連一個網址就進房。我這邊多學到 Cloudflare Tunnel 這個東西,之後家裡有什麼想對外開的小服務,也多了一條不必碰路由器的路。