2026 OpenClaw × Tailscale 尾網:`gateway.bind`、ACL 與不暴露公網的 CLI/通道驗證 Runbook

約 16 分鐘閱讀 · MACCOME

誰會踩到問題:你已能運行 OpenClaw Gateway,但不想讓 18789 掛在公網;同時又要讓筆電、CI 與長駐機台能在同一可信小網內完成 CLI/通道握手。本文結論:gateway.bind 收斂到 tailnet 語意,並透過 Tailscale ACL 明確誰可向誰放行 18789;驗證順序:openclaw gateway status → 尾網 ping → 最小對話。架構分工:與《Nginx/Caddy 反代與 TLS》《Cloudflare Tunnel 與 systemd》形成三角——分別對應公網 TLS、出站隧道與僅尾網、不向公網暴露;Compose 細節仍回《Docker Compose 配對》《遠端 Mac 零信任接入》。

只開尾網仍以為安全:五大常見原因(並非「關公網就沒事了」)

  1. ACL 留白過大*:* 或寬鬆 tag,等於讓每台節點都能探測 18789——只是把攻擊面搬進尾網;尾網仍須最小權限。
  2. 綁定模式與認知落差:上游 Gateway 綁定列舉包含 tailnet 等;若在文件外混搭 loopbacklantailnet卻未更新 CLI 側 GATEWAY_URL,會出現tailscale ping 成功但握手仍走舊地址
  3. MagicDNS/分流 DNS 與企業 VPN:雙隧道並存時同名解析可指向非公網側的「黑洞」,症狀類似偶發逾時。
  4. MTU 與 WebSocket:DSR、額外封裝或鏈路 MTU 不足時,大封包碎片化失敗常先呈現為偶發 TLS 卡住,勿過早改 token。
  5. Subnet Router 誤設:整塊 RFC1918 通告進來而未設 exit 節點策略時,容易讓非預期路徑繞過你規劃的 Gateway 拓撲。

白板檢查:尾網並非「省防火牆」,而是把防火牆寫進 ACL hujson;《安全加固/CVE 回應》對埠集合與金鑰輪換紀律仍適用——只是收斂對象改為 tailnet。

暴露模型 適用前提 主要權衡
公網+反向代理與 TLS 需要外部 SaaS webhook、跨網移動裝載且無統一 agent。 WAF/憑證/Let's Encrypt/限流複雜度較高;請參《反代清單》。
Cloudflare Tunnel 等出站隧道 要遮蔽源站 IP、又不想開入站埠對應。 倚賴第三方 POP 與控制面;《Tunnel Runbook》。
僅 tailnet+gateway.bind=tailnet 團隊已全員 enrollment;Gateway 跑在六地獨享 Mac或可裝 tailscale 的 Linux。 須清楚寫明 ACL/tag;無 tailnet 用戶端的主機本就不可達並不等於較不安全。
warning

勿把 tailnet 當「隱形 VPN 任意門」:一旦把閘道裝置套用過於寬鬆的通用 tag(例如 group:dev)又允許全網互 ping,出事時你無法回答「那晚究竟是誰連過 18789」——每條 ACL 都應能對應到工單

建議拓撲 sketch:Gateway 節點、操作員與可選 subnet

最小閉環:Gateway 長駐(常為獨占遠端 Mac)、操作員O 筆電、必要時 SR subnet router。G 上 tailscale up 後,僅向白名單 tags 放行 TCP 18789O 側 CLI 的 OPENCLAW_GATEWAY_URL 請寫 MagicDNS 名稱或 tailnet IPv4/v6;若已宣告「僅 tailnet」,勿再沿用廢止的區網入口。

CI Runner 也需直連 Gateway 時,可將 Runner enrollment 在同一 tailnet tag(例如 tag:ci),並在 ACL 只允許 tag:ci → tag:gateway:18789單埠條款;別把 Runner 丟進「全能 dev」分組。

搭配六國遠端基礎設施時,《零信任 Tailscale/SSH 接入》提供 SSH/Tunnel 決策矩陣;本文僅將OpenClaw 閘道口語意再往前推一步。

落地六步:從 tailscale up 到「尾網內有意義的首包」

  1. 凍結節點身分tailscale status 紀錄主機名/IP;工單只允許這些字串進 Runbook——避免口頭「大阪那台機」。
  2. 先寫 ACL 再改 OpenClaw:在 hujson(或等價)明確放行 UDP 41641(NAT 穿透)與需求內的 TCP(含 18789);預設拒絕的兜底規則必須存在。
  3. 收斂 gateway 綁定:於設定檔(常見 ~/.openclaw/openclaw.json,容器則掛載同卷)將 gateway.bind 設為 tailnet並核對 gateway.mode與發行文件;調整後監聽面應限於尾網前綴可達欄位層級若有版本細調,請以當期發行說明為準。
  4. TOKEN 維持單一真源OPENCLAW_GATEWAY_TOKEN 與檔案內 gateway.auth.token擇一指紋對照;《Compose 配對》有雙源表。
  5. 跑 OpenClaw 自律鏈openclaw gateway statusopenclaw doctor;失敗時截取尾網側與控制面同一時間區間日誌。
  6. 端到端冒烟:自 Operator 主機對 MagicDNS 名執行curl -v --max-time 5 https://…或文件推薦的 WS 路徑,再以最小對話確認上下文未被截斷;《doctor 第一站》協助後續分診。
json
{
  "gateway": {
    "mode": "local",
    "bind": "tailnet",
    "port": 18789,
    "auth": {
      "mode": "token",
      "token": "${OPENCLAW_GATEWAY_TOKEN}"
    }
  }
}
// 【示意】請依貴線上版本 schema 逐欄校正;調整後務必重啟閘道程序或容器。
HuJSON
// ACL 示意:僅允許 operator 存取 gateway 上 Control/Gateway 埠——請將 tag 改為貴組命名規範
{
  "groups": { "group:ops": ["[email protected]"] },
  "tagOwners": { "tag:gateway": ["autogroup:admin"], "tag:ops": ["autogroup:admin"] },
  "acls": [
    {
      "action": "accept",
      "src": ["tag:ops"],
      "dst": ["tag:gateway:18789"],
      "proto": "tcp"
    }
  ]
}

三條應寫入變更審核與稽核附件的技術事實

  • 尾網並非零信任的預設值:裝置遭竊且身分未及撤銷時,過寬 ACL 等同長期裸露。
  • WebSocket 對 MTU/中繼設備敏感:若出現「偶發數秒卡住」,請先跑ICMP 大包 ping + tailscale ping 實驗再抓包——勿先擴張 bind。
  • DNS 競態會先污染 OpenClaw 通道:若 webhook/模型 endpoint 在同一主機解析失敗,可先表現為 gateway healthy 但通道無回應——請把MagicDNS 分流策略寫進工單附錄。

為何長期把 Gateway 綁在自己筆電 tailnet exit 並非典型生產形態

睡眠、閤蓋、補丁重開與家用上行抖動會破壞可預測的 18789 SLA;同時個人私檔與閘道日誌混載會提高鑑識難度。相對地,獨占、可支配巡檢節拍的六國 Apple Silicon遠端 Mac 更適合擔OpenClaw 長駐中樞

公網反代、Tunnel 出站、尾網收斂三路可並存為不同環境組態,但各路皆須 RACI:MACCOME以硬體與租期彈性對齊可巡檢的節點;請先對齊公開租賃價格幫助中心,再回到綁定與冒烟。

收束:先畫資訊流,再動 JSON

若白板上無法在三分鐘內講清楚「誰對誰放行 18789」,就不該草率改設定——否則下一班值班只能靠 MagicDNS 口述。「僅 tailnet」的目標是可被複述的路徑陳述,不是口號。

下一跳:依需求回到《Compose 配對》《反代 TLS》《Tunnel》《安全加固》;當 SLA 必須與地面節點綁定時,再評估六國獨占算力與租賃組合。

常見問題

一定得放棄 Docker 嗎?

不必。容器只是把監聽搬進 netns,《Compose 配對篇》仍可沿用——前提是宿主 tailnet IP/DNS與容器 publish 邏輯一致。

尾網就緒後還能併用 SSH 跳板嗎?

可以;《零信任遠端 Mac 接入》說明 SSH/Tunnel/直連取捨;OpenClaw 層請將TCP 18789 的 ACL獨立成條,勿與 22/tcp 混寫成一團。