一日一技:WSL2 网络大逃杀,OpenClaw 连不上 Discord?ProxyChains 才是真神

2026-03-09 更新: OpenClaw 现已原生支持 Discord 代理配置,只需运行 openclaw config set channels.discord.proxy "http://127.0.0.1:7890" 即可,不再需要 ProxyChains。以下内容仅作历史参考。

如果你也遇到这种问题,且你的 Telegram 是正常工作的,你只需要把这篇文章的 URL 发给 OpenClaw 就好了。它自己会根据这个说明,帮你解决问题的。

在 WSL2 中部署 OpenClaw Agent 本应该是一件轻松愉快的事情,直到我撞上了一堵看似无形的墙:Discord Gateway 连接超时

如果你也在 WSL 里跑 Node.js 应用,并且遇到了莫名其妙的 ETIMEDOUTECONNRESET,甚至你已经设置了 http_proxy 环境变量却依然无效,那么这篇文章可能会救你一命。

我们来看一眼报错日志:

1
[discord] gateway error: Error: connect ETIMEDOUT 31.13.92.5:443

仔细看这个 IP 31.13.92.5,这根本不是 Discord 的 IP(这看起来像是 Facebook 的段)。这是典型的 DNS 污染 症状。

明明我在 systemd 服务里已经设置了 http_proxy,为什么还会解析到错误的 IP?

为什么环境变量没用?

很多同学(包括之前的我)都认为,只要设置了 export http_proxy=http://127.0.0.1:7890,所有的网络请求就会乖乖走代理。

但事实并非如此。

Node.js 的某些网络库(特别是涉及到 WebSocket 握手时),并不一定会完全遵循系统的 HTTP 代理设置进行 DNS 解析。也就是说,它可能先在本地进行了 DNS 查询,拿到了一个被污染的 IP(比如上面的 31.13.x.x),然后试图通过代理(或者直连)去连接这个错误的 IP。

结果就是:连不上,死活连不上。

失败的尝试:Clash Tun 模式

既然应用层代理管不住 DNS,那我用 Tun 模式接管系统层流量总行了吧?我开启了 Clash 的 tun 模式,试图让它劫持所有流量。

结果是更严重的失败。

WSL2 的网络环境本身就是经过一层虚拟化的,再加上 Tailscale 的虚拟网卡,再叠加上 Clash 的 Tun 网卡……路由表乱成了一锅粥。要么是端口冲突(53 端口被 systemd-resolved 占用),要么是流量死循环。

在被 Tun 模式折磨得焦头烂额时,我决定回归最原始、最暴力的应用层劫持方案。

最终解法:ProxyChains-NG (真神降临)

ProxyChains 是一个的神器,它的原理是通过 LD_PRELOAD 钩住 libc 的网络相关函数(如 connect, gethostbyname),强制将 socket 流量塞进 SOCKS5 代理。

它有两个巨大的优势:

  1. 无视路由表:它不依赖复杂的系统路由,直接在进程级别接管。
  2. Remote DNS:它能强制将 DNS 请求通过代理发送(proxy_dns 选项),彻底解决了本地 DNS 污染得到假 IP 的问题。

也就是说,OpenClaw 以为自己连的是 discord.com,实际上 ProxyChains 帮它在代理服务器端完成了正确的解析。

操作步骤

1. 安装 ProxyChains

1
sudo apt install proxychains4

2. 编写配置文件

我们需要一个独立的配置,指向 WSL 本地运行的 Clash(假设你的 Clash 跑在 127.0.0.1:7890):

创建一个文件 ~/proxychains_openclaw.conf

1
2
3
4
5
6
7
strict_chain
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
http 127.0.0.1 7890

注意那个 proxy_dns,这行配置是解决 DNS 污染的关键。

3. 修改 Systemd 服务

在你的服务文件(例如 ~/.config/systemd/user/openclaw-gateway.service)中,用 proxychains4 包裹启动命令:

1
2
3
4
[Service]
# 原来的命令可能是:ExecStart=/usr/bin/node ...
# 修改后的命令:
ExecStart=/usr/bin/proxychains4 -f /home/kingname/proxychains_openclaw.conf /usr/bin/node "/home/kingname/.npm-global/lib/node_modules/openclaw/dist/index.js" gateway --port 18789

4. 重启服务

1
2
systemctl --user daemon-reload
systemctl --user restart openclaw-gateway

见证奇迹

重启后,查看日志,你会发现 ProxyChains 开始疯狂输出绿色的 OK

1
2
3
[proxychains] Strict chain  ...  127.0.0.1:7890  ...  127.0.0.1:7890  ...  OK
...
[discord] logged in to discord as 1465213117548990701

连接成功!

在 WSL2 这种本身网络结构就比较奇特,且伴随着 DNS 污染的环境下,与其费劲去调教全局路由(Tun),不如直接用 ProxyChains 进行精准打击。它简单、粗暴,且极其有效。

如果你也遇到了类似的问题,别犹豫,ProxyChains 才是真神