有关在 MacOS M 系列芯片上使用 Proxychains 的问题与相关探索

Proxychains 是我在 Linux 上经常使用的一个工具,它可以让你在终端中使用 SOCKS 代理。然而,在我使用的 M 系列芯片的 Mac Mini 上时,它的工作似乎并不太好。此篇文章将介绍我遇到的问题,以及我为此做的探索。

问题描述

我使用的是一台 M 系列芯片的 Mac Mini,装的是 MacOS 14.5。当我使用 proxychains 时,我发现它并不能正确地工作。具体表现为,当我使用 proxychains curl http://httpbin.org/ip 时,我并没有成功地使用代理。具体会表现为:

$ proxychains4 curl www.google.com [proxychains] config file found: /opt/homebrew/etc/proxychains.conf [proxychains] preloading /opt/homebrew/Cellar/proxychains-ng/4.16/lib/libproxychains4.dylib dyld[23687]: terminating because inserted dylib '/opt/homebrew/Cellar/proxychains-ng/4.16/lib/libproxychains4.dylib' could not be loaded: tried: '/opt/homebrew/Cellar/proxychains-ng/4.16/lib/libproxychains4.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need '')), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/Cellar/proxychains-ng/4.16/lib/libproxychains4.dylib' (no such file), '/opt/homebrew/Cellar/proxychains-ng/4.16/lib/libproxychains4.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need '')) dyld[23687]: tried: '/opt/homebrew/Cellar/proxychains-ng/4.16/lib/libproxychains4.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need '')), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/Cellar/proxychains-ng/4.16/lib/libproxychains4.dylib' (no such file), '/opt/homebrew/Cellar/proxychains-ng/4.16/lib/libproxychains4.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need '')) [1] 23687 abort proxychains4 curl www.google.com

探索过程

该问题首先出现在使用 brew 安装的 proxychains-ng 上。

随后我在 Proxychains-NG 的 GitHub 仓库上找到了一个 issue,看起来是与我的情况一致的。

根据里面的导引,我尝试使用 ./configure --fat-binary-m1 --hookmethod=dyld 来编译一个适用于 M 系列芯片的代理链库。

但实际操作后,错误同上。

在多次尝试 issue 中提到的解决方法后,仍然无法正常工作。

解决方法

先决条件 - 删除/卸载/删除之前的 proxychains 文件。

这一步虽然不是绝对必要的,但为了避免潜在的问题,我还是执行了。主要目的是清理之前可能存在的 proxychains/proxychains-ng 相关文件,尤其是通过 brew 安装或手动执行 make install 安装的文件。

虽然可能存在更优雅的方法,但我采用了一个简单直接的方式:使用 find 命令搜索并删除所有包含 "proxychains" 子串的文件。具体操作如下:

find / -name "*proxychains*" 2>/dev/null /some/directory/proxychains.conf /some/other/directory/proxychains4 sudo rm /some/directory/proxychains.conf sudo rm /some/other/directory/proxychains4

编译 proxychains-ng

  1. 克隆并进入 proxychains-ng 仓库:

    git clone https://github.com/rofl0r/proxychains-ng && cd proxychains-ng
  2. 配置编译选项并执行:

    CFLAGS="-arch arm64" LDFLAGS="-arch arm64" ./configure
  3. 编译源码:

    make
  4. 返回上级目录并重命名文件夹(为后续步骤做准备):

    cd .. && mv proxychains-ng proxychains-ng-temp

注意:此步骤仅编译源码,不进行安装。确保不要执行 make install 命令。

启用 arm64e 架构支持

为了在 M 系列芯片的 Mac 上正确编译和运行 proxychains-ng,我们需要启用 arm64e 架构支持。以下是详细的操作步骤:

  1. 关闭您的 Mac 设备。

  2. 进入恢复模式:

    • 长按电源按钮开机。
    • 持续按住,直到看到"正在加载启动选项"或类似提示。
  3. 在恢复模式界面中:

    • 选择"选项"或"实用工具"。
    • 点击您的用户账户并输入密码。
  4. 打开终端:

    • 使用快捷键 ⌘CMD+SHIFT+T。
  5. 禁用系统完整性保护(SIP):

    • 在终端中执行以下命令:
      csrutil disable
    • 系统会要求您确认操作,输入 'y' 并回车。
    • 可能需要输入管理员密码。
    • 注意:此操作可能需要等待约一分钟完成。
  6. 重启进入正常模式:

    • 在终端中执行:
      reboot
  7. 启用 arm64e 支持:

    • 重启后登录系统。
    • 打开终端,执行以下命令:
      sudo nvram boot-args=-arm64e_preview_abi
  8. 再次重启以应用更改:

    • 在终端中执行:
      sudo reboot

完成这些步骤后,Mac 将支持 arm64e 架构,为后续编译 proxychains-ng 做好准备。

再次编译 proxychains-ng

  1. 再次克隆 proxychains-ng 仓库并进入目录:

    git clone https://github.com/rofl0r/proxychains-ng cd proxychains-ng
  2. 配置编译选项:

    CFLAGS="-arch arm64e" LDFLAGS="-arch arm64e" ./configure --prefix=/usr/local --bindir=/usr/local/bin --libdir=/usr/local/lib --fat-binary-m1
  3. 编译源码(注意不要执行安装):

    make

注意:以上步骤仅编译源码,不进行安装。请确保不要执行 make install 命令。

替换二进制文件

在步骤 1 中,我们编译了一个临时版本的 proxychains-ng 并将其重命名为 proxychains-ng-temp。现在,我们需要用这个临时版本中的二进制文件替换刚刚编译的 proxychains4 文件。

  1. 删除新编译的 proxychains4 文件:

    cd proxychains-ng rm proxychains4
  2. 将临时版本的 proxychains4 二进制文件移动到当前目录:

    mv ../proxychains-ng-temp/proxychains4 .
  3. 验证文件替换:

    ls -l proxychains4

这样,我们就成功用兼容 M 系列芯片的版本替换了新编译的二进制文件。

重要注意事项与最终配置

至此,我们已经成功编译并配置了适用于 M 系列芯片 Mac 的 proxychains-ng。现在,让我们完成最后的步骤,确保系统安全性并开始使用 proxychains。

清理与安全设置

  1. 删除临时文件: 可以安全地删除之前创建的 proxychains-ng-temp 文件夹,它已完成其任务。

  2. 重新启用系统完整性保护(SIP): 我们之前为了某些配置步骤暂时禁用了 SIP。现在是时候重新启用它以确保系统安全。以下是详细步骤:

    a) 关闭您的 Mac。 b) 进入恢复模式:长按电源按钮开机,直到看到"正在加载启动选项"。 c) 选择"选项"或"实用工具"。 d) 选择您的用户账户并输入密码。 e) 打开终端(使用 ⌘CMD+SHIFT+T)。 f) 执行以下命令启用 SIP:

    csrutil enable

    按提示输入 'y' 并回车,可能还需要输入管理员密码。 g) 等待约一分钟,然后重启进入正常模式:

    reboot

使用 proxychains

每次使用 proxychains 时,需要指定配置文件。配置文件位于 proxychains-ng 源码目录的 src 文件夹中。使用方法如下:

./proxychains -f src/proxychains.conf [COMMAND]

碎碎念

在你经历了上述的尝试之后,你会发现如果将系统完整性等安全性设置重新打开后,proxychains 将无法正常工作。至少在我这里是这样的。我猜测可能是因为 proxychains 的某些特性与系统完整性保护(SIP)存在冲突。

最后的结果是我不得不放弃使用 proxychains,转而使用 Proxifier 来作为我的代理工具。如果你也深受 proxychains 无法在 M 系列芯片的 Mac 上正常工作的问题的困扰,不妨试试 Proxifier。

Proxifier 在我使用的过程中,表现出了非常好的性能与稳定性。至于 proxychains,我仍然在 Linux 上使用它。