文章 ·
在 WSL、Docker、远程服务器里跑 Claude Code,实际走的是哪个出口?
Claude Code 只读它所在那个环境里的代理变量(https_proxy 等)。在 WSL 2、Docker 容器、远程服务器里运行时,Windows 或 Mac 上开着的代理不会自动带进去,没设就从那个环境自己的网络直连出去;在远程服务器上,出口就是服务器的 IP。下面按环境讲代理地址怎么写、怎么确认(2026 年 10 月 6 日按官方文档核对)。
为什么本机能走代理,WSL、容器里却在直连?
因为它们各有一套环境变量和网络。按 Claude Code 官方网络配置文档,Claude Code 依次读 https_proxy、HTTPS_PROXY、http_proxy、HTTP_PROXY,取第一个有值的;不支持 SOCKS 代理;变量只在启动时读一次。WSL、容器、服务器里的 shell 不会继承你本机终端或系统代理的设置,所以要在里面单独设。
第二个坑是 127.0.0.1:在 WSL 2(默认模式)和容器里,它指的是 WSL 或容器自己,不是你的电脑。照抄本机的 http://127.0.0.1:端口,会连不上代理。
| 环境 | 代理地址怎么写 | 不设时从哪出去 |
|---|---|---|
| 本机终端 | 127.0.0.1:端口 | 本机网络 |
| WSL 2(NAT,默认) | Windows 主机 IP | 本机网络 |
| WSL 2(mirrored) | 127.0.0.1:端口 | 本机网络 |
| Docker 容器 | host.docker.internal:端口(Docker Desktop) | 宿主机网络 |
| 远程服务器 | 服务器能连到的代理 | 服务器的 IP |
WSL 里怎么让 Claude Code 走 Windows 上的代理?
先看 WSL 是哪种网络模式。按 微软 WSL 网络文档,默认是 NAT 模式。
NAT 模式(默认):要用 Windows 主机的 IP。微软给的查询命令是:
ip route show | grep -i default | awk '{ print $3}'
把它拼进代理变量(端口换成代理软件的 HTTP / 混合端口):
WIN=$(ip route show | grep -i default | awk '{ print $3}')
export https_proxy=http://$WIN:7890 http_proxy=http://$WIN:7890
同一份文档说明,用这种 IP 连过去会被当成局域网连接,所以 Windows 上的代理软件要能接受局域网连接(很多软件里叫「允许局域网连接」),只监听 127.0.0.1 时 WSL 连不上。
mirrored 模式:Windows 11 22H2 及以上,可以在 .wslconfig 的 [wsl2] 下写 networkingMode=mirrored。开启后,WSL 可以直接用 127.0.0.1 连 Windows 上的服务,代理地址照本机写法即可。
autoProxy:同样要求 Windows 11 22H2 及以上,在 [wsl2] 下写 autoProxy=true,WSL 会使用 Windows 的 HTTP 代理设置。设好后,在 WSL 里跑 env | grep -i proxy 确认 Claude Code 读到的变量是不是你想要的。
Docker 容器里怎么设?
容器里的 Claude Code 只看容器自己的环境变量。常见三种设法:
- 启动时传进去:
docker run -e https_proxy=http://host.docker.internal:7890 …。按 Docker Desktop 文档,host.docker.internal会解析到宿主机的内部 IP,用来连宿主机上的服务。 - 写进
~/.docker/config.json:在proxies.default里填httpsProxy、httpProxy,Docker 会给新容器和构建设上HTTPS_PROXY/https_proxy等变量(Docker 文档)。只对新容器生效,已经在跑的容器不会变。 - Dev Container:写在
devcontainer.json的containerEnv里,Claude Code 的 Dev Container 文档用的也是这种方式传环境变量。
两个容易漏的地方:Docker 的 allProxy 对应 ALL_PROXY,Claude Code 不读这个变量,要填 httpsProxy;Docker Desktop 设置里可以填 SOCKS5 代理,但 Claude Code 不支持 SOCKS,给它的地址要用 HTTP 代理。用 Anthropic 参考容器里的 init-firewall.sh 限制了出站的,还要把代理地址加进放行范围。
在远程服务器上跑,Anthropic 看到的是谁的 IP?
是服务器的 IP。SSH 上去以后,Claude Code 在服务器上运行,用的是服务器的网络和服务器上的环境变量,和你本机开不开代理无关。所以要看的是服务器出口:地区要在 Anthropic 支持的地区里,而云服务器的出口一般属于机房网络,在本站检测里会显示为「机房」。
如果想让服务器上的 Claude Code 借用本机的代理,可以用 SSH 的远程端口转发。按 OpenSSH 手册,-R 会把服务器上某个端口的连接转回本机:
ssh -R 7890:127.0.0.1:7890 你的服务器 export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890
第一行在本机执行,第二行在登录后的服务器里执行。这样请求会经本机代理出去,SSH 断开后就不通了。
另外,用 --bg、claude agents 等方式跑的后台会话,不一定继承当前 shell 的变量。官方文档建议把代理变量写进 ~/.claude/settings.json 的 env,后台会话都能读到。
怎么确认 Claude Code 实际从哪里出去?
在 WSL、容器或服务器里,和 Claude Code 同一个 shell 运行:
curl -sL ipjudge.org/cc | bash
脚本按 Claude Code 的规则(只读 https_proxy 等四个变量、不支持 SOCKS、不读 ALL_PROXY)算出它会用的代理,再问 api.anthropic.com 看到的 IP,并对照不走代理时的出口。只读,不安装、不修改、不上传。
也可以在 Claude Code 里运行 /status,看 Proxy 一行;地址写错、解析不了时,这里会标为无效并忽略。
常见问题
WSL 里 curl 能通,Claude Code 却还是直连?多半是只设了 ALL_PROXY,或者代理写成了 socks5://。curl 认这两种,Claude Code 都不认,改成 https_proxy=http://…。
容器里写 127.0.0.1:7890 为什么连不上?容器里的 127.0.0.1 是容器自己。Docker Desktop 下改成 host.docker.internal:7890;还连不上的,检查宿主机代理是否只监听 127.0.0.1。
改了变量,正在跑的 Claude Code 没反应?官方说明变量只在启动时读一次,退出后重新启动才生效。后台会话的变量要写进 ~/.claude/settings.json。
远程服务器一定要配代理吗?不一定。服务器所在地区在支持名单里,就可以直接用服务器出口。想知道它在平台眼里是什么类型,先用上面的脚本在服务器上测一次。
WSL 开了 mirrored,还需要设变量吗?需要。mirrored 只是让 127.0.0.1 能连到 Windows,Claude Code 仍然只看变量。开了 autoProxy=true 的,先用 env | grep -i proxy 确认有没有自动设上。
Anthropic 的条款要求在支持的地区使用。人不在支持地区而绕过限制使用的账号,可能被限制或停用,请自行判断。
相关:Claude Code 出口检测 · Claude 专项检测 · 终端为什么在直连 · Claude Code 报 403 怎么排查 · 住宅 IP 和机房 IP 的区别
想知道你自己的 IP 属于哪一类?
检测我的终端走哪个出口