远程服务器无法连外网?用 VS Code RemoteForward 跑通 Codex CLI
整活开头:你是否还在为课题组服务器上无法连外网而使用不了 GPT + Codex cli 而发愁?你是否还在因自己冲了 GPT plus 而无法充分利用 Codex 额度而锤头顿足?跟着本文,我将手把手教你如何在无法连外网的远程服务器上使用 GPT + Codex cli 进行 vibe coding!
整活结束,其实这类教程在网上也已经有一些资源了,但是多多少少有些细节没讲清楚 or 有很多后续容易出问题的点没有讲清楚,所以干脆自己做个更详细的教程出来,也算水一篇博客。
前提需求:
- 订阅了 GPT plus 及以上的套餐。
- 有一个自己的 VPN/机场/梯子。
- 使用的 IDE 为 VScode(本文的示例是以 VScode 为准的)。
流程
1. 安装 Codex cli
安装 Codex cli 并不困难,可以参考我在前不久发的文章进行操作,仅需把命令换为 npm install -g @openai/codex。
2. Remote config 中配置 RemoteForward
通过配置 RemoteForward 可以让远端服务器走本地主机的某个端口,这是最关键的一步。首先点击左侧 Remote Explorer 标记,然后在 SSH 的小齿轮里打开 config,或者直接在上侧搜索栏中输入 >Remote-SSH: Open SSH Configuration File 打开。
在对应服务器的 SSH 配置下增加一行 RemoteForward 14514 localhost:7890,此处:
14514为后续注册的服务器上的监听端口。这个数字可以自己挑个喜欢的,但要遵守以下规则:1. 不能超过 65535,最好在 1024–49151 之间;2. 不要用服务器上已经被占用的端口(可以通过ss -ltnp | grep 14514)检查是否已经存在。7890为本地电脑的 VPN 端口。这个一般可在代理软件的某个界面可见,以 Clash for Windows 为例,其 General 的最上方即其端口:
在配置好后,打开/重新连接服务器,再次输入 ss -ltnp | grep 14514 检查是否出现该端口:
如果能看到 127.0.0.1:14514,说明 SSH 远程端口转发已经生效。
3. 配置转发
如果只是为了让 Codex cli 在终端中联网,通常配置环境变量即可(这里及之后使用的端口号都应和上面 RemoteForward 的设置保持一致):
1 | export http_proxy=http://127.0.0.1:14514 |
如果希望每次打开 terminal 都自动生效,可以把它们加入 ~/.bashrc。测试是否转发成功:
1 | curl -I https://google.com |
如果返回中有 Connection established,说明现在已经可以成功转发,此时就可以通过 Codex cli 中的 device code 方式登录 GPT 并且进行后续使用(注:设备码的使用要调整 chatGPT 中的一些设置,跟着其引导来即可)。
如果你想在 VScode remote 安装 Codex 插件并使用,则需要同时配置 VScode 本身的代理,可以在 VSCode Settings 的 Remote 设置中搜索 proxy:
Http: Proxy 选项卡中,输入 http://127.0.0.1:14514,保存后 Reload window 重启即可。这一个方法对 VScode 拓展中的 github Copilot 自动补全也有用(走本地转发能让其更稳定),因此推荐有需求的朋友进行配置。
注意事项
在设置转发后,终端里除了 Codex cli 以外的部分网络行为也会走你的本地机器 VPN,这会导致:
- 一些应用出现问题(例如 conda 下载安装包出错)。
wget/curl/python request 等走你的梯子过,如果你的梯子是有流量限制的,那么这可能会在不经意间消耗大量流量。- 解决方法是在当前 terminal 内临时取消代理,即将环境变量 unset 掉:
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY。
初次配置后,Codex cli 可能遇到 sandbox / bubblewrap 相关问题,例如:
1 | bwrap: Creating new namespace failed, likely because the kernel does not support user namespaces. bwrap must be installed setuid on such systems. |
如果服务器已经安装了 bubblewrap,并且你有 root 权限,可以通过临时启用 user namespace 解决该问题:
1 | sysctl -w user.max_user_namespaces=15000 |
如果想要持久化配置则可以创建 sysctl 配置文件:
1 | cat >/etc/sysctl.d/99-userns.conf <<'EOF' |
但经过 GPT 的搜索,这个策略有一定风险:启用普通用户创建 user namespace 后,一些原本普通用户触达不到的内核代码路径会变得可触达,从而扩大本地提权漏洞的攻击面。不过个人感觉对于用户都可信的课题组服务器,这个风险通常可以接受。
后记
总从有了 CC 和 Codex,工作效率已经不可同日而语。技术在发展,生产力在进步,只愿诸君不要成为那工业革命时拿手织布的人。
