Claude 桌面版的 Code 标签页可以直接添加 SSH 连接,在远程服务器上跑 Claude Code。桌面版会自己把程序传到服务器上,登录凭证也由桌面版负责,服务器上不用装 Claude,也不用登录。
问题是:如果服务器的出口访问不了 Anthropic(比如服务器在香港等 Anthropic 不提供服务的地区,直连会被拒),或者你想指定它走某个网络出口,远端 Claude 就发不出请求。解决办法是在服务器上给 Claude 单独配一个代理,只影响 Claude,不动整台机器的网络。
不想手动配?我把这套流程做成了一个 skill,装上之后跟 Claude 说一句「帮我给 xxx 服务器配 Claude 代理」,它会自己检查、写配置、重启、验证。安装方法、以及复制一句话交给 AI 的用法,见文末「用 skill 自动配置」。
症状
在桌面版里连上服务器、发消息,一直没有回复,或者卡在「Starting session…」。
在服务器上直接请求 API 看一下:
curl -sI https://api.anthropic.com | head -1
返回 403 基本就是出口地区被拦了。能正常连通的机器,不带凭据请求一般回的是 401 或 405。
一、在服务器上写 Claude 的配置
先 SSH 登录服务器,在你用来连接的那个用户的家目录下编辑 ~/.claude/settings.json:
{
"env": {
"HTTPS_PROXY": "http://127.0.0.1:7890",
"HTTP_PROXY": "http://127.0.0.1:7890",
"NO_PROXY": "localhost,127.0.0.1,192.168.0.0/16"
}
}
127.0.0.1:7890换成你自己的代理地址。可以是服务器本机跑的代理,也可以是局域网里旁路由的地址,比如http://192.168.1.2:7890。- 只能用 HTTP / HTTPS 代理。 官方文档写明 Claude Code 不支持 SOCKS 代理。Clash / mihomo 的 mixed 端口同时支持 HTTP,用
http://就行。 - 代理需要认证的话,把用户名和密码写进地址:
https://user:pass@proxy.example.com:443。密码里有@、:这类特殊字符要做 URL 编码。密码是明文存在文件里的,记得chmod 600 ~/.claude/settings.json。 NO_PROXY里放不需要走代理的地址,比如本机和内网网段。用 Tailscale 的话,可以再加上100.64.0.0/10,.ts.net。- 如果文件已经存在,把
env这一段合并进去,别整个覆盖掉。
改完检查一下 JSON 格式:
jq . ~/.claude/settings.json
这个
env只作用于 Claude 自己,以及它在会话里执行的命令。你手动 SSH 登录的 shell 还是干净的,整台机器的网络不受影响。
二、在桌面版里添加 SSH 连接
在 Code 标签页的环境下拉菜单里选「+ Add SSH connection」,填上服务器地址、用户名、端口和私钥,新建会话发一句话就可以了。
服务器上不需要运行 claude 登录。这样少一份登录记录,账号只在自己电脑上登录,风控上也更干净。
三、之前已经连过的话:停掉旧的远端服务
桌面版在服务器上启动的远端服务是常驻进程,下次连接会直接复用。它在第一次启动时就读好了配置,之后改 settings.json 不会自动生效。
改完配置后,在服务器上停掉它:
pkill -f 'claude/remote/srv/.*/server'
下次桌面版连上来会重新拉起,这时才会读到新的代理设置。
如果是通过
ssh 主机 "pkill -f ..."远程执行,pkill可能会把执行这条命令的 shell 自己也匹配上杀掉。登录上去再执行就没这个问题。
为什么不用 SSH config 里的 SetEnv
我一开始想在本机 ~/.ssh/config 里用 SetEnv 把代理变量传过去,这条路走不通:
SetEnv要服务端 sshd 用AcceptEnv放行才会收下,默认只放行LANG、LC_*,其他变量会被悄悄丢掉。- 就算改了 sshd,桌面版也不一定读你的
~/.ssh/config里的SetEnv。 - 远端服务是常驻复用的,环境在它第一次启动时就定了。
写在 ~/.claude/settings.json 里最稳:不管用哪个连接别名、哪种 SSH 客户端连过来,Claude 都会读到。
验证
最简单的是在那个远程会话里让 Claude 执行:
env | grep -i proxy
能看到上面配置的三个变量就说明生效了。
也可以在服务器上看 Claude 进程的连接,应该全部连向代理的地址和端口:
ss -tnp | grep claude
不要用
/proc/<pid>/environ判断。settings.json里的env是 Claude 启动之后才加进去的,/proc只记录进程启动那一刻的环境,所以在那里看不到代理变量是正常的。
注意事项
- 小内存机器慎用。 桌面版下发到
~/.claude/remote/的 Claude 程序约 230 MB。我实测的内存占用:常驻的远端服务(server --serve和--bridge)一共约 20 MB;每开一个会话会再起一个 Claude 进程,约 270 MB,峰值 330 MB 左右,Claude 在会话里跑的命令另算。1G 内存的小 VPS 开一个会话就比较紧张了。
用 skill 自动配置
上面的步骤我做成了一个 Agent Skill。它会:
- 先找代理地址:Claude 的记忆或笔记里有就拿来跟你确认,也会到服务器上查已有的配置和本机在跑的代理;都没有就问你。你本地电脑有代理的话,它还可以用 SSH 反向隧道借给服务器用。
- 在服务器上测试直连和走代理能不能访问 API,代理不通就不写配置。
- 把代理合并进
~/.claude/settings.json,保留原有内容,先备份,权限设为 600。 - 停掉旧的远端服务:有会话正在跑的话,会先问你。
- 等你从桌面版连一次,再检查 Claude 的连接是不是都走了代理。
Claude Code 安装,在本地电脑上运行:
/plugin marketplace add ma-wenqian/skills
/plugin install claude-ssh-proxy@vinkey-skills
其他 AI 工具(Codex、Gemini CLI、Cursor 等支持 Agent Skills 的):把仓库里 skills/claude-ssh-proxy 整个文件夹复制到该工具的 skills 目录。
一句话交给 AI
也可以不自己敲命令:复制下面这句话,发给能执行命令的 AI(Claude Code、Codex 等),它会自己把 skill 装上,然后开始配置:
从 https://github.com/ma-wenqian/skills 安装 claude-ssh-proxy 这个 skill,然后用它帮我给远程服务器上的 Claude 配置代理