使用 ProxyChains 让 macOS 应用使用代理访问网络

标签:Mac OS X, 翻墙

这两天在用 VCMI 玩英雄无敌3,发现之前遇到的很多崩溃 bug 都已经解决了。但是在下载 mods 时,仍然遇到一个问题:mods 的仓库托管于 raw.githubusercontent.com,而这个域名早就被墙了,导致无法通过 VCMI Launcher 下载。
我查看了一下 VCMI 的源码,发现它是用 Qt 的 QNetworkRequest 来创建网络连接的,没有写任何代理相关的代码。由于我是用 SOCKS5/HTTP 代理翻墙,并没有采用 VPN 这种全局代理的方式,因此只能另找方法让它使用代理。

问了下 ChatGPT,从它推荐的几个方案里,我找到了 ProxyChains。原理就是 ProxyChains 的动态链接库重写了 socket 相关的接口,然后通过 LD_PRELOAD(Linux) 或 DYLD_INSERT_LIBRARIES(macOS)环境变量让其优先加载,从而取代了 libc 的默认实现。QNetworkRequest 底层也是使用 libc 来建立网络连接,理论上是可以生效的。

使用步骤如下:
  1. 安装 ProxyChains:
    brew install proxychains-ng
  2. 创建配置文件(改成自己的代理地址):
    proxy_dns
    [ProxyList]
    socks5 127.0.0.1 1080
  3. 使用 ProxyChains 启动 VCMI(不能直接启动 VCMI.app,需要找里面的可执行文件):
    proxychains4 -f proxychains.conf /Applications/VCMI.app/Contents/MacOS/vcmilauncher

顺带一提,第二步的 proxy_dns 指的是用代理来解析域名,默认是用本地 DNS 来解析的。由于 raw.githubusercontent.com 的 DNS 被劫持了,这里必须启用,或者修改 /etc/hosts 文件。
另外,ProxyChains 只能代理 TCP 连接,因此不支持用 UDP 协议来通信的应用,还有 ping 这种用 ICMP 协议的程序。

0条评论 你不来一发么↓

    想说点什么呢?