Skip to content

Codex Cloud 連上 tailnet:讓雲端 AI 代理存取內部服務

在 OpenAI Codex Cloud 的環境設定中加入 Tailscale,讓雲端任務存取 tailnet 內的 API 與測試服務,並用 tag、grants 與 auth key 設定限制它能碰到的範圍

Updated View as Markdown

OpenAI 的 Codex Cloud 會在雲端 VM 裡執行 Codex 任務,不綁定你的電腦,電腦睡著了任務也能繼續跑。它的環境設定內建 VPN 功能,而 Tailscale 是目前唯一支援的 VPN 供應商。設定好之後,雲端任務就能連到 tailnet 內的內部 API、測試用服務或私有套件庫。

這項整合不是雙方合作的成果。根據 Tailscale 官方部落格,Tailscale 在 Codex Cloud 發表後才發現這件事;OpenAI 用的是每個人都能用的 auth key 與 ephemeral 節點機制。

本文依 2026 年 10 月的 OpenAI Codex Cloud 文件與 Tailscale 官方部落格整理,未在 Codex Cloud 上實際驗證。Codex Cloud 正逐步開放給 ChatGPT 付費帳號(Plus 以上),功能與限制仍可能變動,請以兩邊的官方文件為準。

這篇把重點放在怎麼設定;agent 為什麼需要 tag、grants、ephemeral 這套身分與權限的完整觀念,見 AI 與 agent。

運作方式

每個 Codex Cloud 任務都在一台新的 VM 上執行。你在環境設定裡填入 Tailscale 的 auth key,每台任務 VM 啟動時就會用這把 key 加入你的 tailnet,任務結束、VM 離線後再由 Tailscale 自動移除。

所以這把 auth key 有三個設定很重要:

設定 為什麼需要
Reusable 每個任務都是新的 VM,一把 key 要能讓很多台 VM 加入。OpenAI 文件要求開啟。
Ephemeral VM 離線後 Tailscale 會自動移除它,Machines 頁面才不會堆滿用過即丟的裝置。OpenAI 文件要求開啟。
Tags(例如 tag:codex) VM 以 tag 的身分加入,套用你為這個 tag 寫的規則,而不是繼承產生 key 那個人的存取權限。Tailscale 部落格建議開啟。

Tags 這一項特別重要:沒有加 tag 的 auth key,加入的裝置會以產生 key 的使用者身分出現,等於 Codex 拿到和你一樣的存取範圍。

設定步驟

1. 定義 tag 的擁有者

在 Admin console 的 Access controls 頁面,先在 policy 的 tagOwners 定義 tag:codex,否則產生 auth key 時選不到這個 tag:

"tagOwners": {
  "tag:codex": ["autogroup:admin"],
},

2. 產生 auth key

到 Admin console 的 Keys 頁面,選 Generate auth key:

  1. 開啟 Reusable。
  2. 開啟 Ephemeral。
  3. 開啟 Tags,選 tag:codex。
  4. Expiration 設定天數。auth key 的效期是 1 到 90 天,沒有指定就是 90 天,到期後要產生新的 key 再填回 Codex Cloud。
  5. 如果 tailnet 有啟用 device approval,要一併開啟 Pre-approved,否則每台任務 VM 加入時都要等管理員手動核准。

reusable key 被偷走的話,任何人都能用它把裝置加進你的 tailnet。官方建議存放在專門的密鑰管理工具裡,不要貼進聊天訊息或 repository。

3. 在 Codex Cloud 填入 auth key

  1. 在網頁版或 ChatGPT 桌面 App 開新任務,選 Work in → Cloud,選好要 checkout 的 GitHub repository,建立 cloud environment。
  2. 打開環境設定的 Advanced → VPN,選 Add,供應商選 Tailscale,貼上剛才的 auth key。
  3. 在環境的 Internet access 設定允許要連的目的地。VPN 只負責把 VM 接上 tailnet,目的地還是要同時被環境的網路設定和 Tailscale 的存取規則允許才連得到。
  4. 儲存後 Publish(已發布過的環境則是 Republish),開一個新任務測試連線。

能做與不能做的事

Codex Cloud 的 VM 不是一般的 Tailscale 裝置,限制不少:

  • 只能連 HTTP/HTTPS 服務:OpenAI 文件把用途定位在內部 API、套件庫等 HTTP/HTTPS 服務。OpenAI 文件也提醒,程式要透過環境設定的 HTTP/HTTPS proxy 連線,用 curl 測試時不要加 --noproxy。Tailscale 部落格另外提到,任意 TCP 連線可以透過 proxy:8088 的 HTTP CONNECT 建立。
  • 只支援 IPv4:可以連到私有 IPv4 的 subnet route(見 Subnet Router),主機名稱必須解析成 IPv4 位址。
  • 沒有 UDP、ICMP:ping 不能用來測試連線,改用 curl。
  • 不能連進 VM:Codex Cloud 節點明確不支援連入連線。
  • 不能用 SSH:一般 SSH 與 Tailscale SSH 都不行。

MagicDNS 與 split DNS:兩份文件說法不同

這一點兩邊的說法互相矛盾:

  • Tailscale 部落格(2026 年 10 月 6 日)寫的是 MagicDNS 與 split DNS 都不能用。
  • OpenAI 的 Codex Cloud 文件則寫任務可以用 MagicDNS 與 split DNS 以主機名稱連到私有服務;公司內部網域要在 Admin console 設定 split DNS,指向內部 DNS 伺服器,並使用完整網域名稱(例如 api.corp.example.com)。

功能可能在部落格發布後有更新,以 OpenAI 文件為準比較合理。保險的做法是先用 IP 位址確認連得通,再換成主機名稱;IP 通、主機名稱不通,就是 DNS 的問題。

限制 Codex 能碰到的範圍

如果你的 policy 還是預設的「所有裝置都能互連」,Codex 的 VM 加入後就能連到 tailnet 內幾乎所有東西。這未必是你想要的,對 AI 代理更要小心。

用 grants 只開放需要的服務

替要讓 Codex 存取的服務也加上 tag(例如 tag:internal-api),再用 grants 只開放需要的連接埠:

"tagOwners": {
  "tag:codex": ["autogroup:admin"],
  "tag:internal-api": ["autogroup:admin"],
},
"grants": [
  {
    // Codex 只能連內部 API 的 HTTPS
    "src": ["tag:codex"],
    "dst": ["tag:internal-api"],
    "ip": ["tcp:443"],
  },
  {
    // 透過 Subnet Router 連區網內的特定主機
    "src": ["tag:codex"],
    "dst": ["192.168.1.20/32"],
    "ip": ["tcp:443"],
  },
],

要注意:policy 裡如果還留著預設的全開規則("src": ["*"]、"dst": ["*"]),上面的限制等於沒有作用,因為 Tailscale 的規則只會放行、不會阻擋。要先把全開規則換成針對人或群組的規則,tag:codex 才會只剩 grants 給它的權限。

其他建議

Tailscale 部落格建議的做法:

  • AI 代理和它要連的資源都加上 tag,規則才寫得精準。
  • 保留 auth key 的效期,不要為了方便設成最長再忘記,到期就換新的。
  • 開啟 network flow logs,查看代理實際連到了哪些地方。這項功能只有 Premium 與 Enterprise 方案有(見 方案與限制比較)。
  • 開啟 device approval,新裝置要經過管理員核准才能加入 tailnet。Codex 用的 auth key 開了 Pre-approved 就不受影響,其他人或其他工具加入的裝置則仍要核准。

疑難排解

  • VPN 有連上,但服務連不到? 照 OpenAI 文件的建議逐項檢查:程式有沒有走環境設定的 HTTP/HTTPS proxy;目的地有沒有同時被環境的 Internet access 設定和 Tailscale 的存取規則允許;用 IP 連得到、用主機名稱連不到的話,檢查 split DNS 設定與主機名稱是否解析成 IPv4。
  • Machines 頁面出現一堆 Codex 裝置? auth key 沒開 Ephemeral。ephemeral 裝置離線後才會被自動移除,產生新的 key 時記得開啟。
  • 任務 VM 加入後卡在等待核准? tailnet 開了 device approval,但 auth key 沒開 Pre-approved。

參考資料

Navigation

Type to search…

↑↓ navigate↵ selectEsc close