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
如果你的代理软件端口不同,比如 7890、7897、10809,需要替换成自己的端口。
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-...
需要打码或删除。