在家裡跑本地 LLM(大型語言模型),出門在外用同一套,是「不把資料送上雲」的常見做法。三個常見的選擇是:Ollama(CLI + API)、LM Studio(桌面 App,內建 OpenAI 相容 API server)和 Open WebUI(網頁介面,可以接前兩者當後端)。
問題是,要安全地從外面用並不容易。Ollama 和 LM Studio 預設只聽 127.0.0.1,出了門連不到,多數教學的解法是改綁 0.0.0.0,但那等於把沒有驗證的 LLM API 直接開給整個網路;Open WebUI 更要注意——它預設就綁 0.0.0.0。這篇講正確的做法:讓後端只對 loopback,再用 Tailscale 把它只開給 tailnet 裡的自己。
本文依 2026 年 10 月的 Tailscale、Ollama、LM Studio 與 Open WebUI 官方文件整理,以 Tailscale v1.104、Ollama v0.40.x 為準;LM Studio 的 API token 驗證需 0.4.0 以上(其餘設定未綁定版本),Open WebUI 官方映像檔採
:main滾動發行。「175,000 台暴露 Ollama」出自 SentinelOne 與 Censys 2026 年 1 月的聯合研究報告。本文未在實機跑過整套設定,屬文件整理。
反面教材:175,000 台暴露在公網的 Ollama
2026 年 1 月,SentinelOne 旗下 SentinelLABS 與 Censys 發布聯合研究,掃到網路上有 175,000 台 Ollama 主機直接暴露在公網,分布在 130 個國家;研究期間 293 天共記錄 723 萬次觀測,其中約 23,000 台主機貢獻了多數活動(觀察中 13% 的主機產出約 76% 的觀測)。超過 48% 的主機經由 API 回報自己具備 tool-calling 能力,還有至少 201 台跑著明確移除安全護欄的 prompt 樣板。
重點是,這不是什麼高深攻擊——Ollama 預設綁 127.0.0.1:11434,要暴露到公網只需要改一個環境變數(OLLAMA_HOST 設成 0.0.0.0 或公網介面)。而 Ollama 的 API 本身沒有內建驗證,任何連得到的人都等於能免費借用你的 GPU/CPU 算力(SentinelOne 報告稱之為 resource hijacking,社群一般叫這類行為 LLMjacking:攻擊者用你的機器跑推理、你付電費),甚至透過 prompt 誘導模型吐出不該說的東西。
這和 OpenClaw/Hermes Agent 一文裡的 CVE-2026-25253 是同一種病:預設的「方便」不等於安全。對本地 LLM 來說,防線就是一條:別讓它直接見公網,甚至別讓它見區網。
三樣東西的預設:兩樣綁 loopback,一樣要動手
Ollama 和 LM Studio 預設綁 loopback,安全但外面連不到;Open WebUI 是例外——裸機跑 open-webui serve 預設綁 0.0.0.0:8080,Docker 映像檔在容器內也是(否則 -p 埠映射不會生效),所以它預設就會出現在區網:
| 工具 | 預設監聽 | 對應的「暴露」設定 |
|---|---|---|
| Ollama | 127.0.0.1:11434 |
OLLAMA_HOST=0.0.0.0(或綁公網介面) |
| LM Studio | 127.0.0.1:1234(API) |
「Serve on Local Network」開關,或 CLI lms server start --bind 0.0.0.0 |
| Open WebUI | 0.0.0.0:8080 |
反代到公網、tailscale funnel,或 Docker 忘了把埠綁回 loopback |
所以「在外面用家裡的 LLM」要做的不是把它綁出去,而是讓後端只聽 loopback,再用 Tailscale Serve 從 tailnet 裡轉發進來。Serve 幫你處理 HTTPS 憑證,還會加上身分標頭,讓後端認得連進來的是誰。機制見 Serve 的身分標頭。
Ollama:保持 loopback,用 Serve 轉發
Ollama 有兩個相關的環境變數:
OLLAMA_HOST:API server 的綁定位址,預設127.0.0.1:11434。改成0.0.0.0:11434就會聽所有介面。OLLAMA_ORIGINS:允許的 CORS origin 清單,預設允許127.0.0.1與0.0.0.0。
要從外面用,不要動 OLLAMA_HOST,讓它繼續綁 loopback,再用 Serve 轉發:
tailscale serve --bg http://127.0.0.1:11434之後 tailnet 上的裝置就能用 https://<你的主機>.tailxxxxx.ts.net 存取 Ollama 的 API,走 HTTPS,而且是 tailnet 內限定。這比 OLLAMA_HOST=0.0.0.0 好在三點:只對 tailnet 開放、有 TLS、會帶身分標頭(雖然 Ollama 本身不會讀身分標頭做授權,但至少請求是經由已驗證的 tailnet 身分進來)。
如果你有特殊理由要讓 Ollama 直接聽網路介面(例如某個 client 一定要直連、不走 Serve),寧可綁 Tailscale IP(100.x.y.z)也不要綁 0.0.0.0:綁 Tailscale IP 只有 tailnet 連得到,綁 0.0.0.0 是區網加所有介面都看得到。但兩者都沒有 HTTPS、沒有身分標頭,而 Ollama API 本身無驗證——所以這條路只適合在你確定 tailnet 已用 grants 收緊時才考慮。多數情況,loopback + Serve 就夠了。
Open WebUI:信任標頭 SSO
Open WebUI 是這三樣裡最適合「人在外面」的一個:它有網頁介面,而且官方文件有完整的 Tailscale 整合頁。兩步:
1. 先讓它只聽 loopback,再用 Serve 給 HTTPS。 Open WebUI 預設綁 0.0.0.0:8080。用 Docker 直接跑時,把主機埠綁回 loopback,不要讓它出現在區網:
# 主機埠只綁 loopback,區網上其他人連不到 8080
docker run -p 127.0.0.1:8080:8080 ghcr.io/open-webui/open-webui:main
tailscale serve --bg http://localhost:8080若照官方 Tailscale 整合頁用 sidecar 部署,Open WebUI 容器本身不發布 8080 埠,一樣不會暴露到區網。
2. 用信任標頭做 SSO。 Open WebUI 可以信任 Tailscale-User-Login 當登入身分,設定兩個環境變數:
environment:
- WEBUI_AUTH_TRUSTED_EMAIL_HEADER=Tailscale-User-Login
- WEBUI_AUTH_TRUSTED_NAME_HEADER=Tailscale-User-Name這樣 tailnet 上的人一開 https://<你的主機>.tailxxxxx.ts.net,Open WebUI 讀到身分標頭就會自動註冊並登入,第一次造訪就免密碼。跨網域(CORS)要另外放行你的 Tailscale 網址:
- CORS_ALLOW_ORIGIN=https://<你的主機>.tailxxxxx.ts.net官方文件特別提醒:如果 Open WebUI 和 tailscaled 跑在同一個網路環境,使用者可能繞過 Serve、直接連後端的 8080 埠,跳過信任標頭驗證。解法是讓後端只聽 loopback(Docker 用 -p 127.0.0.1:8080:8080,或 sidecar 不發布埠),或用 grants 只放行 443。這個「後端只聽 localhost」的原則,以及「不能直接信身分標頭」的理由,見 Serve 的身分標頭。
LM Studio:別開「Serve on Local Network」
LM Studio 的 API server 在 Developer 分頁啟用,預設 http://localhost:1234/v1(OpenAI 相容)。它的設定面板裡有一個 Serve on Local Network 開關,開了之後就綁到非 loopback(0.0.0.0)——官方文件白紙黑字提醒:「任何非 127.0.0.1 的綁定都會把 server 暴露到 localhost 之外,建議開啟驗證;確定知道自己在做什麼再開」。
所以從外面用 LM Studio,一樣是保持 localhost,用 Serve 轉發:
tailscale serve --bg http://127.0.0.1:1234LM Studio 沒有像 Open WebUI 那樣的信任標頭 SSO,它的驗證是另一套:Require Authentication 開關,開了之後 API client 要帶 API token 走 Authorization 標頭。如果你真的需要把 LM Studio 綁到非 loopback(例如同一台機器上有別的需求),至少把這個驗證開起來,不要用無驗證的裸 API。對「人在外面」的情境,Serve + loopback 是最省事也最安全的組合。
手機 App 與測試
在外面用,通常是手機上開 Open WebUI 的網頁(或 App),或手機上的 LLM App 直接指到 Ollama 的 API 網址。兩者都填 Tailscale 的 MagicDNS 網址(https://<你的主機>.tailxxxxx.ts.net),而不是區網 IP——區網 IP 出了家門就沒用。
驗證有沒有設對,最直接的測法是關掉 Wi-Fi、改用行動網路:行動網路下只有 Tailscale 這條路連得到家,所以 App 連得上、連不上,一測就知道是 Tailscale 生效還是只是你在同一個區網裡自嗨。手機上要先登入 Tailscale、確認主機在線。
最小權限:只把自己加進 grants
後端都綁 loopback 之後,tailnet 上唯一對外的是 Serve 發的 443 埠。但 tailnet 預設全開,任何裝置都能連到任何裝置的任何埠,所以再用 grants 把 443 只留給你自己:
"tagOwners": {
"tag:llm": ["autogroup:admin"],
},
"grants": [
// 只有你(管理員)能連到這台 LLM 主機的 443(Serve 發出的 HTTPS)
{
"src": ["autogroup:admin"],
"dst": ["tag:llm"],
"ip": ["tcp:443"],
},
],- 給跑 LLM 的主機打上
tag:llm,身分不綁在某個人身上(見 Tags 與 auth key)。 src用autogroup:admin;要「只開給自己」,把src換成你自己的帳號 email。- Ollama 的 11434、LM Studio 的 1234、Open WebUI 的 8080 這三個原始埠不要寫進 grants,tailnet 上就沒人能繞過 Serve 直連。
grants 管的是 tailnet 內部連線,不影響這台主機自己連出去(下載模型、更新等出站流量照常)。規則寫法見 ACL / Grants 入門。
小結
| 工具 | 外面怎麼連 | 身分驗證 |
|---|---|---|
| Ollama | tailscale serve --bg http://127.0.0.1:11434 |
無內建;靠 Serve + grants 擋在 tailnet 外 |
| LM Studio | tailscale serve --bg http://127.0.0.1:1234 |
無信任標頭;可開 API token 驗證 |
| Open WebUI | tailscale serve --bg http://localhost:8080 |
信任標頭 SSO(Tailscale-User-Login) |
三樣東西的結論一樣:讓後端只聽 loopback,用 Tailscale Serve 把 HTTPS 轉發進 tailnet。Ollama 和 LM Studio 預設就是 loopback,別去動它;Open WebUI 則要主動把埠綁回 loopback(-p 127.0.0.1:8080:8080 或 sidecar 不發布埠)。真要直接聽網路介面時,綁 Tailscale IP 而不是 0.0.0.0,並確保驗證與 grants 都到位。175,000 台暴露的 Ollama 已經證明,一個「綁 0.0.0.0 比較方便」的決定,會變成別人的免費算力。
參考資料
- Silent Brothers: Ollama Hosts Form Anonymous AI Network Beyond Platform Guardrails(SentinelOne,175,000 台暴露 Ollama 的原始報告)
- Ollama FAQ(OLLAMA_HOST、OLLAMA_ORIGINS 與預設綁定)
- Ollama FAQ 原始檔(GitHub)
- LM Studio 官方文件:Server Settings
- LM Studio 官方文件:Serve on Local Network
- LM Studio 官方文件:Authentication(API token 驗證需 0.4.0 以上)
- Open WebUI 官方文件:Tailscale Integration
- Open WebUI 官方文件:HTTPS using Tailscale
- Serve 的身分標頭:讓自架服務直接認得 tailnet 使用者
- Tailscale Serve
- Tailscale Funnel