一日一技:在 WSL 中用 Docker 逃逸 ProxyChains 的魔爪

2026-03-09 更新: 如果你使用的是 OpenClaw,现在可以通过 openclaw config set channels.discord.proxy "http://127.0.0.1:7890" 直接配置原生代理,不再需要 ProxyChains。本文描述的 Docker 逃逸方案仍然适用于其他被 LD_PRELOAD 劫持的场景。

在 WSL (Windows Subsystem for Linux) 或者一些特定的 Linux 开发环境中,为了让终端命令走代理,很多人喜欢用 proxychains 或者直接在 .bashrc / .zshrc 里通过 LD_PRELOAD 强制注入代理钩子。

这样做的好处是全剧终(全局),curlwget 甚至 apt 都能自动翻越长城。

但坏处也很明显:它太霸道了。

背景:OpenClaw 的代理困局

最近我在家里的电脑安装了 OpenClaw。为了让它能正常连上 Discord,我修改了 OpenClaw 的 daemon 启动配置,在启动命令前强行加上了 proxychains4

这就导致了一个问题:由 OpenClaw 拉起的所有子进程,都会自动继承这个 proxychains4 的环境变量。

在这个环境下,大部分网络请求是正常的,甚至连 git push 到 GitHub 都没有问题。但唯独连接 MongoDB Atlas 时,死活连不上。

痛点:被绑架的 Python 和 MongoDB

当你试图运行一个需要直连内网,或者连接对延迟/证书敏感的服务(比如 MongoDB Atlas 的 SRV 记录,或者某些 SSL 握手严格的 API)时,LD_PRELOAD 会无差别地拦截所有 socket 调用。

表现出来的症状通常是:

  1. pymongo 报错:ServerSelectionTimeoutError,死活连不上。
  2. pip install 报 SSL 错误,因为流量被强制转发到了代理端口,而代理处理不了某些协议。
  3. 本地 localhost 调试也被劫持。

你可能会想:“那我临时取消一下不就行了?”

于是你敲下:

1
2
3
4
unset all_proxyunset http_proxyunset LD_PRELOADpython script.py

结果往往是:依然报错

为什么?因为当前的 Shell 进程本身可能已经被“污染”了,或者某些库在加载时已经读取了环境变量。在复杂的 Shell 环境配置下(尤其是用了 Oh My Zsh 各种插件时),想彻底“洗白”当前会话的网络环境,并不像看起来那么容易。

优雅的解法:Docker 逃逸

与其在宿主机上和环境变量斗智斗勇,不如直接换个干净的房间。

Docker 容器默认不会继承宿主机的 LD_PRELOAD 环境变量。

这意味着,只要你把代码丢进容器里跑,它就是在一个纯净的 Linux 网络环境中运行,直连外网(或者走 Docker 默认的网桥),完全不受宿主机上那些乱七八糟的代理钩子影响。

实战代码

假设你当前目录有一个 main.py 需要运行,且它需要连接一个在宿主机配代理怎么都连不上的数据库。

直接用一行 Docker 命令搞定:

1 docker run --rm -v $(pwd):/app -w /app python:3.11-slim python main.py

如果你需要安装依赖,也可以直接在容器里顺手装了:

1
2
docker run --rm -v $(pwd):/app -w /app python:3.11-slim \ sh -c "pip install pymongo requests && python main.py"

原理分析:

  1. --rm:跑完就删,不留垃圾。
  2. -v $(pwd):/app:把当前代码目录挂载进去,不需要构建镜像。
  3. python:3.11-slim:官方纯净镜像,没有 proxychains,没有 LD_PRELOAD
  4. 网络环境:容器内的网络是隔离的(默认 Bridge 模式),它看不到宿主机的 LD_PRELOAD,所以网络请求会直接出去。

如果你的脚本还需要连宿主机的服务(比如宿主机上跑了个 MySQL),加个 --network host 即可(注意 Linux/WSL 下 --network host 的行为区别,WSL2 中通常建议直接用 host ip 或 host.docker.internal)。

总结

当你发现 unset 也不灵,网络环境像一团乱麻理不清时,不要纠结。启动一个 Docker 容器,就像开辟了一块净土。

有时候,逃避(到容器里)虽然可耻,但真的有用。

一日一技,每天进步一点点。

————

本文来自于转载:

原文来源:
https://kingname.info/2026/02/10/2026-02-10-docker-bypass-proxychains/

posted @ 2026-04-18 14:35  晴云孤魂  阅读(15)  评论(0)    收藏  举报