VSCode Remote SSH 中 Codex 连接超时的排查与解决记录

VSCode Remote SSH 中 Codex 连接超时的排查与解决记录

1. 问题现象

本地 Windows 上 Codex 可以正常使用,但通过 VSCode Remote SSH 连接 Orange Pi 后,在远程环境里使用 Codex 会出现:

text 复制代码
request timed out

远程机器是:

text 复制代码
Orange Pi / Linux ARM64

Codex 配置大致如下:

toml 复制代码
model_provider = "custom"
model = "gpt-5.5"
model_reasoning_effort = "high"

[model_providers.custom]
name = "apikey.quest"
base_url = "https://apikey.quest/v1"
wire_api = "responses"
env_key = "APIKEY_QUEST_API_KEY"

一开始怀疑是 config.toml 配置问题,后来确认不是核心问题。


2. 核心原因

VSCode Remote SSH 模式下,Codex 插件/远程 CLI 实际使用的是 远程服务器 Orange Pi 的网络,不是 Windows 本地电脑的网络。

也就是说:

text 复制代码
VSCode 本地窗口
↓
Remote SSH
↓
Orange Pi 上运行 Codex
↓
Orange Pi 自己访问 API

而 Orange Pi 的网络只能访问部分网站:

bash 复制代码
curl -I --max-time 10 https://www.baidu.com

能返回 200 OK

但是:

bash 复制代码
curl -I --max-time 10 https://www.google.com
curl -I --max-time 10 https://api.openai.com/v1/models

会超时。

所以 Codex 在远程机器上访问模型 API 时,也会超时。


3. 解决思路

把 Windows 本地的代理端口通过 SSH 反向转发给 Orange Pi。

最终链路变成:

text 复制代码
Orange Pi Codex
↓
Orange Pi 127.0.0.1:10808
↓
SSH RemoteForward
↓
Windows 127.0.0.1:10808
↓
Windows 本地代理/VPN
↓
apikey.quest / OpenAI API

这样远程 Orange Pi 就可以借用 Windows 本地代理访问外网。


4. 确认 Windows 本地代理端口

Windows 设置里看到本地代理端口是:

text 复制代码
127.0.0.1:10808

所以后面统一使用:

text 复制代码
10808

如果你的代理软件端口不同,比如 7890789710809,需要替换成自己的端口。


5. 配置 SSH RemoteForward

在 Windows PowerShell 打开 SSH 配置:

powershell 复制代码
notepad $env:USERPROFILE\.ssh\config

加入或修改 Orange Pi 的 Host 配置:

sshconfig 复制代码
Host orangepi
    HostName 192.168.3.19
    User orangepi
    RemoteForward 10808 127.0.0.1:10808

含义是:

text 复制代码
远程 Orange Pi 的 127.0.0.1:10808
转发到
Windows 本地的 127.0.0.1:10808

修改后,需要断开 VSCode Remote SSH,然后重新连接 Orange Pi。


6. 测试代理转发是否成功

重连 VSCode Remote SSH 后,在 Orange Pi 远程终端执行:

bash 复制代码
curl -I --max-time 20 -x http://127.0.0.1:10808 https://www.google.com

成功时会看到:

text 复制代码
HTTP/1.1 200 Connection established
HTTP/2 200

再测试 OpenAI:

bash 复制代码
curl -I --max-time 20 -x http://127.0.0.1:10808 https://api.openai.com/v1/models

成功时会看到:

text 复制代码
HTTP/1.1 200 Connection established
HTTP/2 401

这里 401 是正常的,因为这个测试没有传 OpenAI 官方 API Key。重点是它没有 timeout。


7. 测试 apikey.quest 的 Responses API

Codex 使用的是:

toml 复制代码
wire_api = "responses"

所以它实际请求的是:

text 复制代码
https://apikey.quest/v1/responses

一开始直接 curl 时卡住:

text 复制代码
POST /v1/responses HTTP/2
We are completely uploaded and fine

后来发现是 HTTP/2 链路容易卡住。改成 HTTP/1.1 并使用 JSON 文件发送请求体后成功。

在 Orange Pi 上执行:

bash 复制代码
cat > /tmp/responses.json <<'EOF'
{
  "model": "gpt-5.5",
  "input": "hello"
}
EOF

curl --http1.1 -i --max-time 60 -x http://127.0.0.1:10808 https://apikey.quest/v1/responses \
  -H "Authorization: Bearer $APIKEY_QUEST_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @/tmp/responses.json

成功返回:

text 复制代码
HTTP/1.1 200 Connection established
HTTP/1.1 200 OK

响应里能看到模型返回:

json 复制代码
"text": "Hello."

这说明:

text 复制代码
API Key 没问题
model = "gpt-5.5" 没问题
apikey.quest /v1/responses 没问题
Orange Pi 走代理也能通

8. 给远程 Orange Pi 设置代理环境变量

为了让 Codex CLI 使用代理,在 Orange Pi 上执行:

bash 复制代码
nano ~/.bashrc

在文件末尾加入:

bash 复制代码
export HTTP_PROXY=http://127.0.0.1:10808
export HTTPS_PROXY=http://127.0.0.1:10808
export http_proxy=http://127.0.0.1:10808
export https_proxy=http://127.0.0.1:10808

然后执行:

bash 复制代码
source ~/.bashrc

验证不带 -x 的 curl 是否也能走代理:

bash 复制代码
curl -I --max-time 20 https://api.openai.com/v1/models

如果能快速返回 401,说明代理环境变量生效。


9. 安装远程 Codex CLI

一开始远程执行:

bash 复制代码
codex

报错:

text 复制代码
bash: codex: command not found

说明 Orange Pi 上没有安装 Codex CLI。

安装命令:

bash 复制代码
curl -fsSL https://chatgpt.com/codex/install.sh | sh

安装完成后验证:

bash 复制代码
which codex
codex --version

成功输出:

text 复制代码
/home/orangepi/.local/bin/codex
codex-cli 0.142.4

10. 验证远程 Codex CLI 成功

在 Orange Pi 远程终端执行:

bash 复制代码
export HTTP_PROXY=http://127.0.0.1:10808
export HTTPS_PROXY=http://127.0.0.1:10808
export http_proxy=http://127.0.0.1:10808
export https_proxy=http://127.0.0.1:10808

cd /home/orangepi/Documents/orangepi_data_collect
codex

进入 Codex 后输入:

text 复制代码
hello

成功返回:

text 复制代码
Hello.

这说明远程 Codex CLI 已经跑通。


11. VSCode Remote Settings 配置

如果命令行 Codex 能用,但 VSCode 插件还是 timeout,说明 VSCode Remote 插件可能没有继承终端里的代理环境变量。

在已经连接 Orange Pi 的 VSCode 窗口中:

text 复制代码
Ctrl + Shift + P

搜索:

text 复制代码
Preferences: Open Remote Settings (JSON)

注意要选 Remote Settings,不是本地 User Settings。

加入:

json 复制代码
{
  "http.proxy": "http://127.0.0.1:10808",
  "https.proxy": "http://127.0.0.1:10808"
}

如果原来已有配置,注意 JSON 逗号格式,例如:

json 复制代码
{
  "editor.fontSize": 14,
  "http.proxy": "http://127.0.0.1:10808",
  "https.proxy": "http://127.0.0.1:10808"
}

保存后执行:

text 复制代码
Developer: Reload Window

或者:

text 复制代码
Remote-SSH: Kill VS Code Server on Host

然后重新连接 Orange Pi。


12. 最终远程 Codex 配置

Orange Pi 上的:

bash 复制代码
~/.codex/config.toml

建议保持简单:

toml 复制代码
model_provider = "custom"
model = "gpt-5.5"
model_reasoning_effort = "high"

[model_providers.custom]
name = "apikey.quest"
base_url = "https://apikey.quest/v1"
wire_api = "responses"
env_key = "APIKEY_QUEST_API_KEY"

[projects."/home/orangepi/code"]
trust_level = "trusted"

[projects."/home/orangepi/code/cam_cz005"]
trust_level = "trusted"

[projects."/home/orangepi/Documents/orangepi_data_collect"]
trust_level = "trusted"

不要把 Windows 本地的 Codex 配置复制到 Orange Pi,因为里面有很多 Windows 路径,例如:

text 复制代码
C:\Users\...
C:\Windows\...

这些只能给 Windows 本地 Codex 用。


13. 最终结论

这次问题的根因不是 Codex 配置错误,而是:

text 复制代码
VSCode Remote SSH 下,Codex 实际运行在 Orange Pi 上;
Orange Pi 自己无法稳定访问 Google/OpenAI/API 中转;
因此 Codex 请求超时。

最终解决办法是:

text 复制代码
通过 SSH RemoteForward,把 Windows 本地代理转发给 Orange Pi;
然后让 Orange Pi 的 curl、Codex CLI、VSCode Remote 插件都使用 127.0.0.1:10808 这个代理。

成功标志:

text 复制代码
curl 走代理能访问 Google
curl 走代理能访问 api.openai.com
curl 走代理能访问 apikey.quest /v1/responses
远程 codex 命令能回复 Hello

14. 注意事项

如果 Windows 本地代理/VPN 没开,Orange Pi 仍然可以访问部分普通网站,比如百度,但无法通过这条代理链路访问 Google/OpenAI/API 中转。

快速检测代理是否可用:

bash 复制代码
curl -I --max-time 10 -x http://127.0.0.1:10808 https://api.openai.com/v1/models

只要快速返回 401,说明代理链路正常。

如果 timeout、connection refused 或 proxy error,则检查:

text 复制代码
Windows 本地代理是否开启
VSCode Remote SSH 是否重新连接
SSH config 里的 RemoteForward 是否正确
端口 10808 是否和本地代理端口一致

另外,API Key 不要直接粘贴到聊天或公开笔记里,日志中的:

text 复制代码
Authorization: Bearer sk-...

需要打码或删除。