VSCode Remote SSH + Codex:通过 SSH RemoteForward 复用本地网络出口

适用场景:本地开发机可以正常访问所需的 AI 编程服务,但远程计算服务器的外部网络受限。通过 VSCode Remote SSH 连接远程服务器后,希望在远程窗口中正常使用 Codex 扩展。


1. 背景与思路

我的实际环境是:

  • 本地开发机网络正常,可以完成 Codex 登录和服务访问;
  • 远程服务器位于受限网络环境中,只能通过 SSH / 内网连接方式登录;
  • VSCode Remote SSH 可以连接远程服务器,但远程侧的 Codex 会反复重连;
  • 本地已有一个可用的网络出口端口:127.0.0.1:7989

常见现象如下:

Reconnecting... 1/5
Reconnecting... 2/5
Reconnecting... 3/5
Reconnecting... 4/5
Reconnecting... 5/5
timeout waiting for child process to exit

最终解决分两步:

第一步:把本地 ~/.codex 复制到远程服务器,解决 Codex 认证问题。
第二步:使用 SSH RemoteForward,把远程请求转发到本地网络出口,解决远程侧访问问题。

最终链路如下:

远程服务器 Codex / VSCode Server
        ↓
远程 127.0.0.1:17897
        ↓ SSH RemoteForward
本地开发机 127.0.0.1:7989
        ↓
本地网络出口
        ↓
目标 AI 编程服务 / API 服务

本文使用的端口:

名称 地址
本地网络出口端口 127.0.0.1:7989
远程转发入口端口 127.0.0.1:17897

2. 复制本机 Codex 认证目录

先在本地开发机确认已经登录过 Codex:

ls ~/.codex

推荐直接复制整个目录到远程:

scp -r ~/.codex a5000@你的服务器IP:~/

也可以只复制认证文件:

ssh a5000@你的服务器IP "mkdir -p ~/.codex"
scp ~/.codex/auth.json a5000@你的服务器IP:~/.codex/auth.json

远程服务器上设置权限:

chmod -R go-rwx ~/.codex
ls -la ~/.codex

如果能看到 auth.json,说明认证信息已经复制过去。

注意:~/.codex/auth.json 是认证文件,包含登录信息,不要提交到 Git 仓库,也不要贴到公开网页或截图里。


3. 本地 SSH 配置 RemoteForward

在本地开发机编辑:

nano ~/.ssh/config

加入:

Host ThinkStation
    HostName 你的服务器IP或连接域名
    User a5000
    ServerAliveInterval 60
    ExitOnForwardFailure yes
    RemoteForward 127.0.0.1:17897 127.0.0.1:7989

关键是这一行:

RemoteForward 127.0.0.1:17897 127.0.0.1:7989

含义是:

远程服务器 127.0.0.1:17897  ->  本地开发机 127.0.0.1:7989

这里一定要用 RemoteForward,对应 SSH 的 -R,不是 LocalForward / -L

如果不用配置文件,手动测试命令是:

ssh -R 127.0.0.1:17897:127.0.0.1:7989 ThinkStation

4. 验证 SSH 转发

连接远程服务器后,在远程执行:

curl -I -x http://127.0.0.1:17897 https://example.com

如果能看到类似:

HTTP/2 200

或者:

HTTP/1.1 200 OK

说明转发链路已经可用。

也可以使用你自己的目标 API 地址替换 https://example.com,只要不是连接超时或无法解析域名即可。


5. 配置远程环境变量

远程服务器编辑:

nano ~/.bashrc

建议放在 .bashrc 前面,尤其是放在 case $- in 判断之前:

export HTTP_PROXY=http://127.0.0.1:17897
export HTTPS_PROXY=http://127.0.0.1:17897
export NO_PROXY=127.0.0.1,localhost,::1

export http_proxy=http://127.0.0.1:17897
export https_proxy=http://127.0.0.1:17897
export no_proxy=127.0.0.1,localhost,::1

生效并验证:

source ~/.bashrc
env | grep -i proxy

这里不配置 ALL_PROXY,实测 Codex 使用 HTTP_PROXY / HTTPS_PROXY 更稳定。


6. 配置 VSCode Remote Server 和 Codex 环境

只配置 .bashrc 不一定够,因为 VSCode extension host 不一定继承远程 terminal 的环境变量。

6.1 配置 VSCode Remote Server

远程执行:

mkdir -p ~/.vscode-server
nano ~/.vscode-server/server-env-setup

写入:

#!/usr/bin/env sh
export HTTP_PROXY=http://127.0.0.1:17897
export HTTPS_PROXY=http://127.0.0.1:17897
export NO_PROXY=127.0.0.1,localhost,::1
export http_proxy=http://127.0.0.1:17897
export https_proxy=http://127.0.0.1:17897
export no_proxy=127.0.0.1,localhost,::1
unset ALL_PROXY
unset all_proxy

赋权:

chmod +x ~/.vscode-server/server-env-setup

6.2 配置 Codex 专用 .env

这一步是解决 Codex 反复 Reconnecting 的关键。

远程执行:

mkdir -p ~/.codex

cat > ~/.codex/.env <<'CODEX_ENV'
HTTP_PROXY=http://127.0.0.1:17897
HTTPS_PROXY=http://127.0.0.1:17897
NO_PROXY=127.0.0.1,localhost,::1

http_proxy=http://127.0.0.1:17897
https_proxy=http://127.0.0.1:17897
no_proxy=127.0.0.1,localhost,::1
CODEX_ENV

chmod 600 ~/.codex/.env

7. 重启并验证

远程执行:

pkill -u "$USER" -f 'codex|app-server' || true
pkill -u "$USER" -f 'extensionHost' || true
pkill -u "$USER" -f '.vscode-server' || true

然后重新用 VSCode Remote SSH 连接服务器。

验证基础链路:

curl -I https://example.com
curl -I -x http://127.0.0.1:17897 https://example.com

验证 Codex / VSCode 进程是否拿到环境变量:

for p in $(pgrep -f 'codex|app-server|extensionHost'); do
  echo "===== PID $p ====="
  tr '\0' '\n' < /proc/$p/environ 2>/dev/null | grep -i proxy
done

正常应该能看到:

HTTP_PROXY=http://127.0.0.1:17897
HTTPS_PROXY=http://127.0.0.1:17897
http_proxy=http://127.0.0.1:17897
https_proxy=http://127.0.0.1:17897

最后确认 Codex 扩展安装在远程侧:

SSH: ThinkStation

而不是只安装在本地。


8. 常见坑

8.1 Could not resolve hostname your-server-alias

说明用了占位符,或者本地 ~/.ssh/config 没有配置对应 Host。应该使用真实配置好的别名,例如:

ssh ThinkStation

8.2 -L-R 用反

当前需求是远程服务器访问本地网络出口,所以要用 RemoteForward / -R

ssh -R 127.0.0.1:17897:127.0.0.1:7989 ThinkStation

8.3 .bashrc 中文引号错误

如果执行 source ~/.bashrc 报:

Command '“export' not found

说明混入了中文引号,检查并替换:

grep -n "“\|”" ~/.bashrc
sed -i 's/“//g; s/”//g' ~/.bashrc

8.4 Codex 仍然 Reconnecting

重点检查三件事:

curl -I https://example.com
cat ~/.vscode-server/server-env-setup
cat ~/.codex/.env

然后重启 VSCode Remote Server:

pkill -u "$USER" -f 'codex|app-server|extensionHost|.vscode-server' || true

9. 总结

这次能成功,关键是同时处理三个层面:

1. Codex 认证:复制本地 ~/.codex 到远程。
2. 网络转发:用 SSH RemoteForward,把远程 17897 转发到本地 7989。
3. 运行环境:配置 ~/.bashrc、~/.vscode-server/server-env-setup 和 ~/.codex/.env。

最终效果是:即使远程服务器的外部网络受限,也可以在 VSCode Remote SSH 的远程窗口里正常使用 Codex 扩展。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐