Codex 一直重新連線?檢查 DNS 與 Clash 路由
Codex 錯誤如 Reconnecting...、stream disconnected before completion 與 error sending request,可能涉及 DNS 干擾或 Clash 路由不正確。本指南說明如何調查這種可能性、套用針對性的 Clash Verge Rev 增強設定,並驗證結果。
社群回報實際顯示了什麼
Reddit 使用者回報了針對 chatgpt.com/backend-api/codex/responses 的任務中斷、反覆重新連線嘗試,以及回應主體錯誤。這些回報證實的是症狀,不是 DNS 診斷。中斷的請求、重新連線迴圈
另一則討論描述了遠端內容壓縮期間的失敗。有留言者建議調查代理,但該討論並未建立經驗證的原因。壓縮討論
X 上的回報也提出了類似問題:9 月 9 日的一則貼文描述持續性的串流失敗,而 9 月 6 日的一則貼文回報遠端壓縮期間出現 SSE 閒置逾時。兩者都未提供 DNS 比較。這些可作為使用者問題的有用例子,但不足以證明有共同原因。X 串流回報、X 壓縮回報
| 症狀 | 應調查項目 |
|---|---|
| 立即逾時並伴隨解析器錯誤 | DNS、節點可達性,以及流量是否進入 Clash |
| ChatGPT 在瀏覽器中可用,但 Codex 失敗 | 代理、DNS、憑證與出口之間的差異 |
| 輸出已開始,之後串流中斷 | 長連線、網路變化與服務錯誤 |
| 只有長對話或壓縮失敗 | 與新的小型任務比較;調查工作階段與伺服器錯誤 |
| HTTP 401、403、429 或 5xx | 檢查回應來源與主體,以確認驗證、政策、限制或服務故障 |
請檢查 OpenAI 服務狀態 並記錄時間與用戶端版本。對於卡住的對話,OpenAI 也建議檢查是否有待核准項目,並嘗試較小、較聚焦的新對話。桌面版與 CLI 版本可能不同。官方疑難排解
一個本機案例:非預期的 DNS 回應觸發了 DIRECT
在一項使用 Clash Verge Rev 與 Mihomo 的 macOS 調查紀錄中,代理節點可達,但 chatgpt.com 符合 GeoIP/CN 規則,並嘗試直接連線且逾時。與透過代理到達的加密 DNS 進行比較後,顯示本機解析路徑上出現了異常回應。
Request to chatgpt.com
→ anomalous DNS answer
→ no earlier matching OpenAI domain rule
→ GeoIP selects DIRECT
→ connection times out and Codex retries
需要處理的設定問題有兩個:解析路徑與路由決策。這個紀錄案例不是基準,也不能證明其他 Codex 失敗具有相同原因。單憑異常回應也無法識別負責的中介者,或特別證明是 DNS 快取污染。
變更設定前先進行診斷
檢查連線日誌
搜尋錯誤中的實際主機名稱,包括 chatgpt.com 或 openai.com。記錄失敗當下所符合的規則、連線鏈,以及錯誤內容。若應使用代理的連線卻選擇了 DIRECT,就值得檢查規則順序。Mihomo 會由上而下評估路由規則。路由文件
如果沒有出現任何相符的連線,請先確認該用戶端是否使用 Clash。瀏覽器可正常運作,並不能證明另一個獨立程序所使用的路徑。
比較解析路徑
在 macOS 上,檢查系統解析器及其目前的回應:
scutil --dns
dscacheutil -q host -a name chatgpt.com
若要進行加密比較,請將 7890 替換為你的 Clash HTTP/mixed 連接埠:
curl --noproxy '' --proxy http://127.0.0.1:7890 \
--connect-timeout 10 --max-time 20 \
-H 'accept: application/dns-json' \
'https://1.1.1.1/dns-query?name=chatgpt.com&type=A'
此請求使用 Cloudflare 的 DNS JSON 介面。請檢查連線面板:明確指定本機代理可保證流量進入 Clash,但最終出口仍由 Clash 規則決定。
僅僅 IP 位址不同,並不能證明存在干擾。CDN 選路、快取、位址家族與 Fake-IP 都可能解釋差異。來自 Clash Fake-IP 範圍的合成位址,本身並不一定可疑。請將異常回應與錯誤路由及失敗情況對照,再與另一條已驗證的網路路徑比較。啟用 TUN 時,連 dig @resolver 也可能被攔截;它不會自動成為獨立的上游測試。
套用針對性的 Clash Verge Rev 增強設定
此範本需要搭配使用 Mihomo 的 Clash Verge Rev、既有訂閱,以及可正常運作的代理節點。這是訂閱 Script,不是完整的獨立設定檔。請先備份目前設定。若你已經使用 script,請將變更整合到現有的 main(config) 函式中。請在所有增強步驟完成後,檢查最終執行階段設定。Clash Verge Rev Script 文件
將 CODEX_PROXY_GROUP 設為現有的群組,並在該群組中選取可正常運作的代理節點。將 NODE_DNS 設為在代理連線前即可運作,且能正確解析節點主機名稱的 DoH 解析器。AliDNS 範例是為了在中國大陸網路上驗證而提供;若不適用請替換。它不會用來解析下方的 AI 網域。
// Clash Verge Rev subscription Script. Use with an existing Mihomo profile.
// Replace this with the exact name of a working proxy group in that profile.
const CODEX_PROXY_GROUP = "REPLACE_WITH_EXISTING_PROXY_GROUP";
// Example bootstrap resolver for a mainland-China network. Verify reachability
// and node-hostname answers on your network, or replace with your trusted DoH.
// It must work BEFORE the proxy is established. It does not resolve AI domains.
const NODE_DNS = ["https://223.5.5.5/dns-query#DIRECT"];
function main(config) {
const groups = config["proxy-groups"] || [];
if (!groups.some((group) => group.name === CODEX_PROXY_GROUP)) {
throw new Error("Set CODEX_PROXY_GROUP to an existing working proxy group.");
}
if (/[#&,\r\n]/.test(CODEX_PROXY_GROUP)) {
throw new Error("Use a proxy group name without #, &, commas or newlines.");
}
const domains = ["chatgpt.com", "openai.com", "oaistatic.com", "oaiusercontent.com"];
const doh = [
"https://1.1.1.1/dns-query#" + CODEX_PROXY_GROUP,
"https://8.8.8.8/dns-query#" + CODEX_PROXY_GROUP,
];
const dns = config.dns || {};
const policy = Object.assign({}, dns["nameserver-policy"] || {});
domains.forEach((domain) => { policy["+." + domain] = doh.slice(); });
dns.enable = true;
dns["nameserver-policy"] = policy;
dns["proxy-server-nameserver"] = NODE_DNS.slice();
if (!Array.isArray(dns.nameserver) || dns.nameserver.length === 0) {
dns.nameserver = NODE_DNS.slice();
}
config.dns = dns;
const oldRules = Array.isArray(config.rules) ? config.rules : [];
const aiRules = domains.map((domain) =>
"DOMAIN-SUFFIX," + domain + "," + CODEX_PROXY_GROUP
);
config.rules = aiRules.concat(oldRules.filter((rule) => !aiRules.includes(rule)));
return config;
}
此腳本會新增特定網域的 DNS 政策,並將代理規則前置,同時保留其他規則與網域政策。它會變更節點主機名稱的解析方式。這 4 個網域後綴是起始範圍,並非涵蓋每個 Codex 功能、自訂提供者、MCP 服務或任務下載的完整清單。
Mihomo 支援針對網域的 nameserver-policy,以及在 DNS 伺服器位址上明確指定代理後綴。節點解析需要獨立路徑,以避免循環相依。DNS 設定參考
此目標腳本會保留既有的 fallback 設定。在替換之前,請另外檢視更廣泛的 DNS 相依性。也請檢查是否有過時的 hosts 對應或彼此衝突、且更具體的政策。
另外檢查 TUN
對於未使用系統代理的程序,請在 Clash Verge Rev 中啟用 TUN,並確認其正在執行。將下列欄位合併到你現有的 TUN 物件中,並保留其餘設定:
tun:
enable: true
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
- tcp://any:53
這些設定涵蓋 53 埠上的 UDP 與 TCP DNS。Mihomo 文件說明了 macOS 與 Windows 上導向 LAN 的 DNS 限制;由應用程式管理的加密 DNS 也不在這些 53 埠規則的涵蓋範圍內。請驗證解析器與介面行為,而不要假設此切換開關涵蓋了每一個請求。TUN 參考
分別驗證設定、路由與 Codex
首先檢查最終設定是否有錯誤、群組參照是否正確,以及規則順序是否妥當。若可使用 Mihomo CLI,mihomo -t -f <final-config-path> 可檢查設定是否能成功解析。這不代表連線能力已獲得證明。
接著檢查實際的連線路由,並透過你實際使用的本機連接埠執行一個會驗證憑證的 HTTPS 探測:
curl --noproxy '' --proxy http://127.0.0.1:7890 \
--connect-timeout 10 --max-time 20 \
-o /dev/null -sS \
-w 'HTTP=%{http_code} TLS=%{time_appconnect}s TOTAL=%{time_total}s\n' \
https://chatgpt.com/
若在憑證驗證成功後收到預期服務的回應,即可證明此探測已建立 HTTP 交換。401 或 403 仍可能阻擋存取。這不代表已驗證通過驗證的 Codex 請求可正常運作,而且若停用憑證驗證,此檢查就會失效。
最後,在原先失敗的用戶端中完成一個小型任務。若已安裝並完成驗證的 CLI 可用,還可以執行下列選用檢查;這會發送真實的模型請求並使用帳戶額度:
codex exec --skip-git-repo-check --sandbox read-only \
'Reply with exactly: PONG. Do not use tools.'
CLI 成功只表示該 CLI 請求成功;若失敗發生在桌面應用程式,請另外測試桌面應用程式。在訂閱更新、網路變更,以及睡眠/喚醒之後請重新檢查。後續的設定層或重新命名的群組仍可能讓某項增強功能失效。
常見問題
將系統 DNS 改成 8.8.8.8 就足夠了嗎?
不一定。單有解析器位址,並不能建立加密、代理路由或可達性。請一併驗證解析器、傳輸與出口路徑。
為什麼 Codex 會在 Clash 執行中仍然失敗?
該程序可能繞過代理、符合直連規則,或依賴無法使用的節點 DNS。問題也可能與 DNS 無關。在一次變更多項設定之前,先找出實際的連線路徑。
如果它仍然斷線怎麼辦?
如果 DNS、TLS 與路由都正常運作,請調查服務狀態、對話大小、用戶端版本、節點連線穩定性,以及精確的錯誤內容。OpenAI 文件說明了回饋與日誌位置;分享前請先檢查日誌中是否包含機密資訊。疑難排解與日誌
我要如何還原變更?
停用新增的 Script,並還原已備份的設定檔、TUN 設定,以及你曾變更的任何系統 DNS 設定。之後可用獨立的 proxy-providers 架構,將節點訂閱與本機 DNS 及規則隔離,但這不是此針對性修正的必要條件。
安裝與匯入步驟請參閱 Clash Verge 設定。其他失敗情況請參閱 Clash 疑難排解。你可以搭配現有且相容的訂閱使用這套診斷流程;測試 DNS 並不以購買另一項服務為前提。