文章 ·
Codex CLI 代理設定:瀏覽器能用,終端裏的 Codex 卻連不上或提示地區不支援
瀏覽器裏 ChatGPT 用得好好的,終端裏的 Codex 卻一直重連、登入時報 Token exchange failed,或者直接提示地區不支援。多數情況下原因很簡單:Codex 是終端程式,它按環境變量決定走不走代理,不看瀏覽器用的是哪條線路;終端沒設代理變量,Codex 就從你本機的網絡直接出去。
OpenAI 的 Codex 文檔目前沒有專門講代理,環境變量頁也沒有列出 HTTPS_PROXY 這類變量。下面關於變量的規則來自 openai/codex 倉庫的源碼(對照 2026-09-29 發佈的 0.159.2 版),來自 GitHub issue 的用户說法會單獨註明。
Codex 認哪些代理變量
- HTTPS_PROXY / https_proxy:Codex 訪問 OpenAI 用的都是 HTTPS 和 WSS,這是最關鍵的一個。只設
http_proxy不夠,普通 HTTPS 請求不看它。 - ALL_PROXY / all_proxy:沒設 HTTPS_PROXY 時作為後備。這一點和 Claude Code 不同,Claude Code 不讀 ALL_PROXY。
- NO_PROXY / no_proxy:列在裏面的地址不走代理,建議寫上
localhost,127.0.0.1,::1。 - 大小寫:兩種都認,同時存在時 Codex 先取大寫;curl 正好相反,先取小寫。兩套值不一樣時,curl 測到的出口和 Codex 實際用的會對不上,所以只留一套,或者寫成同一個值。
- SOCKS:官方沒有寫是否支援。源碼裏 Codex 的 HTTP 客户端沒有開啓 SOCKS 功能,WebSocket 連接能識別
socks5://,兩邊不一致;GitHub 上也有用户報告改用 HTTP 代理後恢復正常(#20844、#16360)。代理地址請統一寫http://。 - 系統代理:不要指望 Codex 讀它。源碼裏讓 Codex 遵循系統代理(包括 PAC)的開關
respect_system_proxy標為開發中、預設關閉;codex doctor在 macOS 上發現系統代理開着卻沒用上時,也會直接提示「A macOS system proxy is configured but unused」。
變量寫在哪
macOS / Linux:在 ~/.zshrc 或 ~/.bashrc 里加下面幾行,端口換成你代理軟件的 HTTP / 混合端口,然後開一個新終端再啓動 Codex:
export https_proxy=http://127.0.0.1:7890 export http_proxy=http://127.0.0.1:7890 export no_proxy=localhost,127.0.0.1,::1
Windows PowerShell:只對當前窗口生效的寫法,按微軟文檔用 $env::
$env:HTTPS_PROXY = "http://127.0.0.1:7890" $env:HTTP_PROXY = "http://127.0.0.1:7890" $env:NO_PROXY = "localhost,127.0.0.1,::1" codex
想長期生效,寫進用户級環境變量,之後新開的終端才會帶上:
[Environment]::SetEnvironmentVariable('HTTPS_PROXY', 'http://127.0.0.1:7890', 'User')
[Environment]::SetEnvironmentVariable('HTTP_PROXY', 'http://127.0.0.1:7890', 'User')
[Environment]::SetEnvironmentVariable('NO_PROXY', 'localhost,127.0.0.1,::1', 'User')
另外兩個要知道的位置:
- ~/.codex/.env:Codex 啓動時會讀這個文件,把裏面的變量寫進自己的進程,而且會覆蓋終端裏的同名變量(源碼
codex-rs/arg0/src/lib.rs,官方文檔未寫)。代理端口改了而這裏沒改,Codex 會一直連一個沒人監聽的端口,報 Connection refused(macOS 上是 os error 61,Windows 上是 10061),GitHub 上有多起這樣的報告(#38885、#44517)。 - config.toml 沒有代理項:給 Codex 自身設代理的配置項還只是一個未採納的功能請求(#6060)。
shell_environment_policy.set隻影響 Codex 幫你運行的命令,管不到 Codex 自己的連接。
~/.codex/.env 壓過終端變量,系統代理和 config.toml 都管不到 Codex 自己的連接。也可以把代理軟件切到 TUN / 增強模式,由它接管全部流量,終端就不用單獨設定。
登入:瀏覽器能登,終端還要再連一次
按官方認證文檔,codex login 會打開瀏覽器,登入後瀏覽器通過本機回調(預設 localhost:1455)把憑據交回 Codex。源碼裏,拿到回調之後,Codex 進程還要自己去 auth.openai.com 換取令牌,這一步走的是終端的網絡設定。所以會出現瀏覽器那邊登入成功、終端卻報 Token exchange failed 的情況;#10466 下有多位用户說,最後查出是終端沒走代理(用户經驗,不是官方結論)。
- 遠程機器、無圖形界面,或者本機網絡攔住了 localhost 回調:官方建議用設備碼登入
codex login --device-auth(測試階段,需要先在 ChatGPT 的安全設定裏開啓)。 - 登完用
codex login status確認當前登入方式;登入失敗時,日誌目錄裏的codex-login.log記錄了過程。
沙箱裏的命令是另一回事
Codex 自己和 OpenAI 通信,與 Codex 替你運行的命令(npm install、git、curl 等)是兩條路。官方安全文檔寫明,CLI 和 IDE 擴展預設的 workspace-write 沙箱不給命令聯網,需要時在 config.toml 裏打開:
[sandbox_workspace_write] network_access = true
- 命令預設繼承 Codex 進程的全部環境變量(
shell_environment_policy.inherit預設是 all),代理變量會跟着傳下去;改成core或none時不會,需要用shell_environment_policy.set補上。 - 打開實驗性的
features.network_proxy後,命令會經過 Codex 自帶的代理按域名放行,allow_upstream_proxy預設允許它再接到環境變量裏的上游代理。官方同時說明,這個代理不管 Codex 客户端自己的模型請求和登入請求。 - 源碼顯示,Windows 沙箱在禁網時會給命令補上指向
http://127.0.0.1:9的代理變量。在命令輸出裏看到這個地址,說明是沙箱沒開網,不是你的代理寫錯了。
IDE 擴展和桌面應用
官方文檔說 CLI 和 IDE 擴展共用同一套配置和登入快取。但從程式塢、開始選單啓動的圖形程式,不一定能拿到寫在 ~/.zshrc 裏的變量,GitHub 上有不少相關報告(#30695、#34955)。這類場景下,TUN 模式最省事;用 ~/.codex/.env 的,記得和代理軟件的端口保持一致。
怎麼確認出口
先弄清 Codex 連的是哪個域名。源碼裏,用 ChatGPT 帳號登入時,模型請求發往 chatgpt.com/backend-api/codex;用 API key 時發往 api.openai.com/v1;登入換令牌走 auth.openai.com。
macOS / Linux,在運行 Codex 的同一個終端裏:
curl -sL ipjudge.org/cc | bash
腳本會列出終端裏的代理變量,用 curl 按這些變量分別訪問 api.openai.com 和 chatgpt.com 的診斷地址,顯示它們看到的 IP 和地區,地區是中國大陸、香港、澳門時標紅;和 Anthropic 那邊出口不一致、macOS 系統代理開着但終端沒用上,也會提示,並給出不走代理時的出口做對照。只讀,不安裝、不修改、不上傳。要注意它測的是 curl:不讀 ~/.codex/.env,大小寫優先順序也和 Codex 相反,這兩處要自己對一下。
Windows PowerShell 裏寫 curl.exe(Windows PowerShell 5.1 裏的 curl 是 Invoke-WebRequest 的別名),看 ip= 和 loc= 兩行:
curl.exe -s https://chatgpt.com/cdn-cgi/trace curl.exe -s https://api.openai.com/cdn-cgi/trace
想確認 Codex 進程自己讀到了哪些變量,運行 codex doctor,網絡一項會列出它看到的代理變量;這個結果已經算上了 ~/.codex/.env。
出口確認之後,地區要在 OpenAI 的支援名單裏,中國大陸、香港、澳門不在名單內;名單頁還寫明,在名單以外的地區訪問可能導致帳號被封禁或暫停。報錯的具體含義見 unsupported_country_region_territory 是什麼意思。
常見問題
設了 ALL_PROXY=socks5://…,curl 能用,Codex 卻不穩定?
Codex 會讀 ALL_PROXY,但它的 HTTP 客户端沒有開啓 SOCKS 支援,部分連接會出問題。改成代理軟件的 HTTP / 混合端口,寫成 http://127.0.0.1:端口。
瀏覽器登入成功,終端報 Token exchange failed,怎麼辦?
換令牌這一步由 Codex 進程在終端裏完成。先確認終端設了 HTTPS_PROXY,再重新 codex login;回調本身不通時改用 codex login --device-auth。
終端裏什麼都沒設,Codex 為什麼還在走代理?
查一下 ~/.codex/.env。Codex 啓動時會讀它,並覆蓋終端裏的同名變量。
Codex 能直接用 macOS 或 Windows 的系統代理嗎?
不要依賴。讓 Codex 遵循系統代理的 respect_system_proxy 還在開發中,預設關閉,社區反饋開了之後也不是所有連接都會走系統代理(#39237)。設環境變量或用 TUN 模式更可靠。
相關:Claude Code / Codex 出口檢測 · Claude Code 代理設定 · ChatGPT、Claude 看到的是哪個 IP · ChatGPT 專項檢測 · 檢測方法
想知道你自己的 IP 屬於哪一類?
免費檢測我的 IP