OpenClaw 今年開始在 AI 的浪潮下變得很流行。從科技愛好者到普通用戶,越來越多人開始在本地架設這個 AI 助手——它確實很方便,可以幫你整理新聞、監控股票、記錄日記、甚至管理你的日程。某種程度上,它已經從一個「技術玩具」變成了許多人日常生活中的數位小幫手。
但這類工具都有一個共同的限制:當你不在電腦旁邊的時候,該怎麼辦?當然,絕大多數的 OpenClaw 設定都可以透過 Telegram、WhatsApp 或 Discord 這類聊天應用來互動,但如果你想要查看系統狀態、調整某個定時任務,或是修改某個設定參數,單靠文字對話就變得很困難。這時候,能夠直接存取那個瀏覽器裡的 Web Control 介面,就變得非常重要。
既然需要遠端存取 Web 介面,最直覺的解決方案似乎很簡單:修改 OpenClaw 設定讓它監聽 0.0.0.0:18789,然後透過路由器的 port forwarding 把這個端口暴露到公網。這樣無論在哪裡,只要知道 IP 和端口就能存取。
但是,千萬不要這麼做。
讓我認真地說明這個問題的嚴重性——因為這不只是「技術上的小細節」,而是可能讓你的整個系統暴露於風險之中的致命錯誤。
2024 年 8 月,資安研究人員揭露了一個被稱為「0.0.0.0 Day」的重大漏洞(Oligo Security 研究報告)。這個漏洞影響了所有主流瀏覽器——Chrome、Firefox、Safari——允許惡意網站繞過瀏覽器的安全限制,直接與你本地網路中的服務互動。
具體來說,如果你在一台有漏洞的作業系統上(是的,macOS 也在受影響名單中),開啟一個惡意網頁,那個網頁就能向 0.0.0.0:任意端口 發送請求。這意味著什麼?任何綁定在 0.0.0.0 上的本地服務,都可能被遠端的攻擊者直接存取。
這不是理論上的威脅。看看 Ollama——這個流行的本地 AI 模型伺服器——的真實案例:
- 2024 年 11 月,Trend Micro 的研究發現有超過 3,000 台 Ollama 伺服器暴露在公網上且沒有任何認證
- 到了 2025 年,這個數字飆升到 超過 10,000 台
- 這些暴露的伺服器成為攻擊者的獵物,導致資料外洩、模型被竊取,甚至是遠端程式碼執行(Wiz Research 發現的 CVE-2024-37032)
NSFOCUS 在 2025 年 3 月發布的警示(CNVD-2025-04094)更直接指出:Ollama 預設沒有認證和存取控制功能,一旦配置不當暴露在公網,就等同於把家門鑰匙留在門外。
或許你會想:「OpenClaw 又不像 Ollama 那麼複雜,能有多大的風險?」
讓我說明如果一個服務被攻破,攻擊者能做些什麼:
- 資料竊取:你的 API keys、設定檔、本地檔案都可能被讀取
- 橫向移動:從一個暴露的服務進入你的內網,再攻擊其他設備
- 植入後門:在你的系統上安裝惡意軟體,長期監控
- 加密勒索:這已經是最「文明」的攻擊方式了
Cisco 的研究團隊在 2025 年 9 月透過 Shodan 掃描發現,大量暴露的 LLM 伺服器都面臨「未經授權的提示注入攻擊」風險(Cisco 研究)。這不只是數字上的威脅,而是真實發生、每天都在上演的攻擊。
結論很簡單:永遠不要把本地服務綁定到 0.0.0.0 並暴露到公網。永遠不要。
既然直接暴露端口這條路走不通,那我們需要一個既能遠端存取、又能保證安全的方案。這就是 Cloudflare Tunnel 登場的時候。
Cloudflare Tunnel 的核心概念非常巧妙:與其讓外部流量「進入」你的網路(這需要開放端口),不如讓你的 Mac mini「主動連出」到 Cloudflare 的網路。這個連線是加密的、出站的,不需要任何端口轉發。然後 Cloudflare 會給你一個 HTTPS 網址,無論在哪裡都能安全存取。
這有幾個巨大的優勢:
- 不需要開放任何端口:你的路由器不需要做任何 port forwarding
- 自動 HTTPS:Cloudflare 提供免費的 SSL 憑證
- 可選的 Zero Trust 認證:可以設定只有特定 Email 才能存取
- 即使 IP 變動也沒問題:不需要動態 DNS
讓我們一步步來設定。
在開始之前,你需要準備:
- 一個 Cloudflare 帳號(免費版即可)
- 一個你擁有的網域名稱(可以是任何域名,透過 Cloudflare 管理)
- 你的 Mac mini 已經安裝了 Homebrew
如果你還沒有把網域加入 Cloudflare,請先完成這個步驟。Cloudflare 會引導你修改 DNS 設定,通常幾分鐘就能生效。
在你的 Mac mini 上開啟終端機,安裝 Cloudflare 的命令列工具:
安裝完成後,確認版本:
執行以下命令來認證:
這會在瀏覽器中開啟一個登入頁面。選擇你想要使用的網域,授權完成後回到終端機,你會看到一個憑證檔案已經被下載。
現在建立一個新的隧道,我們把它命名為 openclaw-macmini(你可以改成任何你喜歡的名稱):
cloudflared tunnel create openclaw-macmini執行後會顯示類似這樣的輸出:
Tunnel credentials written to /Users/YOUR_USERNAME/.cloudflared/xxxxx-xxxx-xxxx-xxxx-xxxxxxxx.json
Tunnel ID: xxxxx-xxxx-xxxx-xxxx-xxxxxxxx
重要:請記下這個 Tunnel ID,我們稍後會用到。
建立設定檔案:
nano ~/.cloudflared/config.yml貼入以下內容(記得替換 <YOUR_TUNNEL_ID> 和 <YOUR_DOMAIN>):
tunnel: <YOUR_TUNNEL_ID>
credentials-file: /Users/YOUR_USERNAME/.cloudflared/<YOUR_TUNNEL_ID>.json
ingress:
- hostname: openclaw.yourdomain.com
service: http://localhost:18789
- service: http_status:404說明:
hostname:你想要使用的子網域名稱,例如openclaw.example.comservice:指向 OpenClaw 在本機的位址,這裡是http://localhost:18789- 最後一行的
http_status:404是為了處理不符合任何規則的請求
儲存檔案(Ctrl+O 然後 Enter,再按 Ctrl+X 離開)。
進階:同一隧道服務多個應用
如果你想透過同一個隧道暴露多個本地服務(例如同時暴露 OpenClaw 和另一個本地應用),可以在 ingress 中添加多個規則:
tunnel: <YOUR_TUNNEL_ID>
credentials-file: /Users/YOUR_USERNAME/.cloudflared/<YOUR_TUNNEL_ID>.json
ingress:
- hostname: openclaw.yourdomain.com
service: http://localhost:18789
- hostname: app2.yourdomain.com
service: http://localhost:8080
- service: http_status:404重要規則:
- 順序很重要:Cloudflare 會按照從上到下的順序匹配,第一個匹配的域名會被使用
- 每個
hostname都需要執行cloudflared tunnel route dns來設定 DNS - 最後一條
service: http_status:404是必須的 catch-all 規則,處理不匹配的請求
告訴 Cloudflare 把這個子網域指向你的隧道:
cloudflared tunnel route dns openclaw-macmini openclaw.yourdomain.com這會在 Cloudflare 的 DNS 設定中自動建立一個 CNAME 記錄,指向你的隧道。
先不要急著設定開機啟動,讓我們先測試一下:
cloudflared tunnel run openclaw-macmini如果一切正常,你會看到類似這樣的輸出:
2026-03-12T00:00:00Z INF Starting tunnel tunnelID=xxxxx-xxxx-xxxx-xxxx-xxxxxxxx
2026-03-12T00:00:00Z INF Connected to Cloudflare edge
現在,在任何裝置的瀏覽器中開啟:
https://openclaw.yourdomain.com
你應該能看到 OpenClaw 的控制台介面了!
測試沒問題後,讓我們把隧道設定為系統服務,這樣 Mac mini 重開機後會自動連線:
sudo cloudflared service install重要:為了避免配置檔案路徑混亂,建議明確指定 --config 參數。檢查並修改 plist 檔案:
# 查看 plist 內容,確認是否已指定 --config
cat /Library/LaunchDaemons/com.cloudflare.cloudflared.plist | grep -A 10 "ProgramArguments"
# 如果沒有指定 --config,手動修改
sudo nano /Library/LaunchDaemons/com.cloudflare.cloudflared.plist找到 <array> 部分,確保格式如下(明確指定 config 路徑):
<array>
<string>/opt/homebrew/bin/cloudflared</string>
<string>--config</string>
<string>/Users/YOUR_USERNAME/.cloudflared/config.yml</string>
<string>tunnel</string>
<string>run</string>
<string>--token</string>
<string>YOUR_TOKEN</string>
</array>然後載入服務:
sudo launchctl load /Library/LaunchDaemons/com.cloudflare.cloudflared.plist驗證服務是否正常運作:
sudo launchctl list | grep cloudflared如果看到類似 PID 的數字,表示服務正在運行。
如果你希望更進一步保護這個存取點,可以啟用 Cloudflare Access(Zero Trust)。這樣即使有人知道網址,也需要通過身份驗證才能存取。
- 登入 Cloudflare Zero Trust
- 進入「Access」→「Applications」
- 點擊「Add an application」
- 選擇「Self-hosted」
- 設定:
- Application name: OpenClaw Remote Access
- Session duration: 24 hours(或你偏好的時間)
- Domain:
openclaw.yourdomain.com
- 在「Policies」新增一個規則:
- Name: Allow My Email
- Action: Allow
- Selector: Email
- Value: [email protected]
- 儲存設定
現在每次存取 https://openclaw.yourdomain.com 時,都會先跳轉到登入頁面,只有你的 Email 能通過驗證。
某種程度上,我們在追求便利的同時,常常忽略了安全的代價。把本地服務綁定到 0.0.0.0 看似是個「快速解決方案」,但背後的風險是真實且巨大的——從「0.0.0.0 Day」漏洞到成千上萬台被暴露的 AI 伺服器,這些都不是遙遠的威脅,而是每天都在發生的現實。
Cloudflare Tunnel 提供了一個優雅的替代方案:不需要開放任何端口、自動獲得 HTTPS 加密、可以隨時隨地安全存取。更重要的是,它遵循「最小權限」原則——你的服務只對你開放,而不是對整個網際網路。
說不定,這種「主動連出」的架構會成為未來遠端存取的標準模式。畢竟,在這個資安威脅日益複雜的時代,防禦的最佳方式有時候不是建立更高的牆,而是根本不要開那扇門。
診斷流程:
| 步驟 | 檢查指令 | 預期結果 |
|---|---|---|
| 1. 本地服務是否正常 | curl http://localhost:18789 | 應返回 OpenClaw 頁面內容 |
| 2. 隧道是否在線 | cloudflared tunnel list | HEALTH 應顯示為 healthy |
| 3. Ingress 規則是否匹配 | cloudflared tunnel ingress rule openclaw.yourdomain.com | 應顯示對應的 service |
| 4. DNS 是否生效 | dig openclaw.yourdomain.com | 應顯示 CNAME 到 *.cfargotunnel.com |
| 5. 查看日誌 | sudo log show --predicate 'process == "cloudflared"' --last 5m | 查看錯誤訊息 |
最常見原因:配置檔案路徑不一致
手動執行 cloudflared tunnel run 時,預設讀取 ~/.cloudflared/config.yml,但系統服務(launchd)可能讀取不同路徑。
解決方案: 始終明確指定 --config 參數,如步驟七所示。
正確流程:
# 1. 編輯配置
nano ~/.cloudflared/config.yml
# 2. 驗證配置語法(手動測試)
cloudflared tunnel --config ~/.cloudflared/config.yml run openclaw-macmini
# 按 Ctrl+C 停止
# 3. 重啟系統服務
sudo launchctl unload /Library/LaunchDaemons/com.cloudflare.cloudflared.plist
sudo launchctl load /Library/LaunchDaemons/com.cloudflare.cloudflared.plist
# 4. 驗證狀態
cloudflared tunnel info openclaw-macmini| 用途 | 指令 |
|---|---|
| 查看所有隧道 | cloudflared tunnel list |
| 查看隧道詳情 | cloudflared tunnel info openclaw-macmini |
| 檢查 Ingress 規則 | cloudflared tunnel ingress rule openclaw.yourdomain.com |
| 查看所有路由 | cloudflared tunnel route list |
| 手動執行隧道 | cloudflared tunnel run openclaw-macmini |
| 查看服務狀態 | sudo launchctl list | grep cloudflared |
| 查看日誌 | sudo log show --predicate 'process == "cloudflared"' --last 10m |
| 驗證 DNS | dig openclaw.yourdomain.com |
| 測試本地服務 | curl http://localhost:18789 |
問題描述:
- 手動執行:
cloudflared tunnel run讀取~/.cloudflared/config.yml - 系統服務:可能讀取
/usr/local/etc/cloudflared/config.yml或其他路徑
解決方案: 始終明確指定 --config 參數,確保一致性。
檢查當前服務使用的配置:
cat /Library/LaunchDaemons/com.cloudflare.cloudflared.plist | grep -A 10 "ProgramArguments"確保輸出中包含 --config /Users/YOUR_USERNAME/.cloudflared/config.yml。
問題: Ingress 規則必須使用空格縮排(2 或 4 個空格),不能使用 Tab。
錯誤示例:
ingress:
- hostname: openclaw.yourdomain.com
service: http://localhost:18789 # 縮排不一致會導致解析失敗正確示例:
ingress:
- hostname: openclaw.yourdomain.com
service: http://localhost:18789
- service: http_status:404每新增一個 hostname,都需要執行:
cloudflared tunnel route dns openclaw-macmini newhostname.yourdomain.com- 統一配置路徑:始終使用
~/.cloudflared/config.yml - 明確指定參數:在 plist 中明確
--config路徑 - 驗證再重啟:修改配置後先用
tunnel run手動驗證,再重啟服務 - 使用絕對路徑:避免使用
~簡寫,使用完整路徑/Users/使用者名稱/... - 保持日誌開啟:出現問題時第一時間查看日誌
參考資料:



























