Codex / Claude Code 老是断连?先按这四层排查,别急着换工具

Claude Code、Codex、Cursor 这类 AI 编程助手最近在国内开发者圈里用得越来越多。但很多人遇到的第一个问题不是"不会用",而是"连不上"——安装完插件,命令行一敲,报 timeout;或者聊着聊着突然断开,提示无法连接服务。

遇到这种断连,第一反应往往是换工具、换账号、换网络。但多数情况下问题并不在工具本身,而在本地网络环境的某一层。本文按 DNS → 出口 IP 属地 → 长连接保持 → 超时配置 四层逐层排查,给出一套可复现的命令和判断方法。

一、第一层:DNS 能不能正确解析到可用节点

AI 编程工具的终端服务域名通常托管在海外 CDN。如果本地 DNS 返回了被污染、被劫持或已失效的 IP,连接会在第一步就失败。

1.1 检查本地 DNS 解析结果

nslookup api.anthropic.com
nslookup api.github.com
nslookup cursor.sh

对比你本地运营商 DNS、公共 DNS(如 223.5.5.5 / 8.8.8.8)和 DoH(如 https://dns.google/resolve?name=api.anthropic.com&type=A)返回的 IP。如果三者不一致,说明 DNS 层可能已经被污染或分流。

1.2 换用可信 DoH 验证

curl -s "https://dns.google/resolve?name=api.anthropic.com&type=A" | python -m json.tool

如果 DoH 能解析出可用的 IP,而本地 DNS 不行,那么问题在 DNS。解决方案包括换 DNS、改 hosts、或者在网络层使用能稳定解析海外域名的出口,而不是单纯换 AI 工具

注意:有些地区对 DoH 本身也有干扰,建议多试几个 DoH 服务(Cloudflare、Quad9、AliDNS DoH)。

二、第二层:出口 IP 属地是否被服务限制

即使 DNS 解析正确,AI 服务商也会根据出口 IP 做地区限制或风控。比如某些服务对大陆地区 IP 直接拒绝 TLS 握手,或者把部分 IDC/云厂商 IP 段列入限制名单。

2.1 查看当前出口 IP 和 ASN

curl -s https://ipinfo.io/json | python -m json.tool
curl -s https://ipapi.co/json/ | python -m json.tool

重点看三个字段:ipcountryasn。如果 country 显示的是被限制地区,或者 asn 属于被重点风控的机房/云厂商,连接被拒绝是预期行为。

2.2 用 curl -w 看握手阶段耗时

curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nSSL: %{time_appconnect}s\nTotal: %{time_total}s\nHTTP: %{http_code}\n" \
  -o /dev/null -s https://api.anthropic.com/health

观察各阶段耗时:

阶段 正常 异常
DNS < 1s 超时或被污染
Connect < 1s 长时间无响应
SSL < 1s 握手失败或被重置
Total < 3s 持续超时

如果 Connect 很快但 SSL 卡住或失败,往往是出口 IP 被服务端限制,而不是网络延迟问题。

2.3 哪些情况换网络出口也解决不了

  • 目标服务本身对特定账号/组织做了限制
  • API Key 额度用尽、被撤销、或绑定了受限项目
  • 本地防火墙/杀毒软件拦截了客户端
  • 客户端版本过旧,TLS 指纹被识别

这些情况下,单纯换代理或换出口没有意义,需要先排除账号、客户端和本地安全软件问题。

三、第三层:长连接有没有被中间设备切断

AI 编程工具很多采用 SSE 或 WebSocket 长连接来流式返回结果。国内部分网络环境会对长连接做超时切断,尤其是 NAT 设备、企业防火墙、某些代理网关。

3.1 检查连接是否被强制断开

curl -N -H "Accept: text/event-stream" \
  -H "Authorization: Bearer $YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"model":"claude-opus-4","messages":[{"role":"user","content":"hello"}],"max_tokens":10}' \
  https://api.anthropic.com/v1/messages

如果请求刚开始有数据,中途突然 EOF 或 curl: (18) transfer closed,说明长连接被中间设备切断。

3.2 用 mtr 看链路稳定性

mtr -r -c 100 api.anthropic.com

关注丢包率和抖动:

  • 第一跳丢包:本地网络或路由器问题
  • 中间某跳开始丢包:运营商链路问题
  • 最后一跳丢包:对端或入口 QoS 限制

3.3 保持长连接的配置建议

如果你确实需要通过代理或专线保持长连接稳定,可以关注这几个点:

  • 使用支持 TCP keepalive 的客户端
  • 避免使用会主动切断空闲连接的共享代理
  • 对重要会话设置应用层心跳
  • 优先选择延迟低、抖动小的出口,而不是只看带宽大小

四、第四层:客户端超时配置是否合理

很多 AI 工具默认超时很短(例如 30 秒),一旦网络抖动就会直接报错。先把超时调大,确认是"真的连不上"还是"连得慢"。

4.1 Claude Code / Codex 常见超时配置

Claude Code 可以通过环境变量调整:

export ANTHROPIC_TIMEOUT=120000
export ANTHROPIC_MAX_RETRIES=3

Codex 的配置文件 ~/.codex/config.toml 里通常也有 timeoutmax_retries 字段。把 timeout 从默认 30 秒改到 90~120 秒,可以过滤掉大量假性断连。

4.2 区分"超时"和"失败"

现象 含义 处理方向
30s 后 timeout 可能真的是慢,先加大超时 调大 timeout
立刻 refused/reset 被阻断,不是慢 检查 DNS/IP/账号
有数据后中断 长连接被切断 检查代理/防火墙/keepalive
偶发、重试后成功 网络抖动 增加重试、错峰使用

五、一个最小复现清单

下次遇到断连,按这个顺序排查,避免盲目换工具:

  1. nslookup 看 DNS 是否解析到可用 IP
  2. curl -s https://ipinfo.io/json 看出口 IP 是否被限制
  3. curl -w 看握手阶段卡在哪里
  4. mtr 看链路是否有持续丢包
  5. 调大客户端 timeout 和 retries
  6. 确认 API Key、账号状态、客户端版本没问题

走完这六步,基本能定位 90% 以上的"连不上"问题。

六、总结

Codex / Claude Code 断连,不要轻易归因于工具本身。大多数情况是国内网络环境的 DNS 污染、出口 IP 属地限制、长连接被切断或客户端超时设置过短导致的。按 DNS → 出口 IP → 长连接 → 超时配置 四层逐步定位,能省下大量换工具、换账号的时间。

对于需要稳定连接海外 AI 服务的团队,选择一条低延迟、低抖动、能稳定保持长连接的网络出口,会比反复切换工具有效得多。IPdodo 提供的跨境专线、SD-WAN 等方案可以作为企业团队稳定连接海外 AI 服务的一个可选网络层方案。

参考资料

更多推荐