Skip to content
advanced

构建本地 SOCKS5 配置器以串联并轮换 ChangeMyIP 代理(Windows、macOS、Linux)

将任何应用变成走代理的应用:使用 gost 运行本地 SOCKS5 配置器,串联两个 ChangeMyIP 端点实现国家到国家路由,并在住宅节点之间轮换。

Windows macOS Linux SOCKS5 隐私/匿名性

概述

SOCKS5 配置器是一个小型的本地服务,它监听你机器上的某个端口,并将你的应用通过它发送的所有内容转发到上游代理,或经过代理链转发。当应用本身没有代理设置,或者你希望多个互不相关的应用共享同一份代理配置,而不是分别编辑每一个应用时,它是实用的解决方案。

在本教程中,你将使用 gost(一个开源代理工具)构建该配置器,并让它指向 ChangeMyIP SOCKS5 端点。然后,你将添加第二跳以实现国家到国家串联,在一跳内轮换多个端点,避免凭据暴露,并在 Windows、macOS 和 Linux 上持久运行该监听器。

下面的配置适用于任何 SOCKS5 提供商。以 ChangeMyIP 为例,是因为它在专用和共享数据中心端点以及轮换住宅端点上提供 SOCKS5,并且因为按月固定计费意味着常开的本地监听器不会增加按请求计费的成本。

先决条件

  • 一个包含 SOCKS5 访问权限的 ChangeMyIP 套餐,以及从仪表板获取的端点主机、端口、用户名和密码。
  • 你计划串联的每一跳都需要一个端点(串联需要两个独立端点)。
  • 有权在 127.0.0.1:1080 或任何空闲本地端口上绑定监听器。
  • 用于验证的 curl。
  • 基本能够轻松编辑 YAML 文件。

配置器如何位于你的应用和 ChangeMyIP 之间

流量路径:

  1. 应用打开到 127.0.0.1:1080 的 SOCKS5 连接。
  2. 配置器接受该连接,并将会话转发到第一个 ChangeMyIP 端点(入口跳)。
  3. 如果定义了第二跳,入口端点会打开到出口端点的连接。
  4. 出口端点发出出站请求,响应沿代理链返回。

这为你带来什么:

  • 一个任何应用都可使用的本地端口,包括没有内置代理设置的应用。
  • 远程 DNS 解析,因此当你使用 socks5h 方案时,名称查询不会泄露到本地解析器。
  • 确定性的出口:需要稳定 IP 时使用数据中心端点,需要 IP 多样性时使用轮换住宅端点。
  • 链式路由:通过串联两个端点,强制流量经过特定的一对位置。

步骤

  1. 对你将使用的 ChangeMyIP 端点进行分类。复制每个端点的主机、端口、用户名和密码,并注明它是专用数据中心端点、共享数据中心端点,还是轮换住宅端点。
配置器中的角色 端点类型 何时使用
入口跳 专用数据中心 快速、稳定的第一段;让它靠近你所在地区以限制延迟
入口跳 住宅轮换 当第一段不应回指某个数据中心子网时
出口跳 目标国家的数据中心或住宅 当最终 IP 必须显示为特定国家或城市时
单跳(无链) 任意 一个出口 IP 就足够的日常路由
  1. 安装 gost。从官方 gost releases 页面下载适用于你的操作系统和架构的发布归档,然后解压。

Windows (PowerShell):

Expand-Archive -Path .\gost_*_windows_amd64.zip -DestinationPath .\gost
.\gost\gost.exe -V

macOS 和 Linux(使用 darwin 或 linux 归档以及匹配的 amd64 或 arm64 构建):

tar -xzf gost_*_linux_amd64.tar.gz
sudo install -m 0755 gost /usr/local/bin/gost
gost -V
  1. 为单跳创建配置器配置。将其保存为 gost.yaml 并限制其权限,因为它包含凭据。
chmod 600 gost.yaml
services:
  - name: socks-in
    addr: "127.0.0.1:1080"
    handler:
      type: socks5
      chain: cmi-single
    listener:
      type: tcp

chains:
  - name: cmi-single
    hops:
      - name: hop-exit
        nodes:
          - name: exit-dc
            addr: proxy-host.example:1080
            connector:
              type: socks5
              auth:
                username: YOUR_USERNAME
                password: YOUR_PASSWORD

将 proxy-host.example:1080 替换为你的 ChangeMyIP 仪表板中的端点,并填写随你的套餐发放的凭据。

  1. 启动监听器并进行冒烟测试。
gost -C gost.yaml

在第二个终端中,确认出口 IP 属于代理而不是你自己:

curl --silent --show-error --proxy socks5h://127.0.0.1:1080 https://api.ipify.org
echo
curl --silent https://api.ipify.org
echo

第一个请求应报告 ChangeMyIP 端点地址;第二个报告你自己的连接。

  1. 添加第二跳以串联两个位置。请求依次经过应用、入口端点、出口端点,然后到达目标站点。站点看到出口端点地址;出口端点将入口端点视为其客户端。
services:
  - name: socks-in
    addr: "127.0.0.1:1080"
    handler:
      type: socks5
      chain: cmi-two-hop
    listener:
      type: tcp

chains:
  - name: cmi-two-hop
    hops:
      - name: hop-entry
        nodes:
          - name: entry-de
            addr: entry-host.example:1080
            connector:
              type: socks5
              auth:
                username: YOUR_USERNAME
                password: YOUR_PASSWORD
      - name: hop-exit
        nodes:
          - name: exit-us
            addr: exit-host.example:1080
            connector:
              type: socks5
              auth:
                username: YOUR_USERNAME
                password: YOUR_PASSWORD
  1. 使用选择器在一跳内的多个端点之间轮换。这样你可以将流量分散到多个不同地址,而不是固定在一个节点上。
      - name: hop-exit
        selector:
          strategy: round
          maxFails: 1
          failTimeout: 30s
        nodes:
          - name: exit-us-1
            addr: exit-us-1.example:1080
            connector:
              type: socks5
              auth:
                username: YOUR_USERNAME
                password: YOUR_PASSWORD
          - name: exit-us-2
            addr: exit-us-2.example:1080
            connector:
              type: socks5
              auth:
                username: YOUR_USERNAME
                password: YOUR_PASSWORD
          - name: exit-us-3
            addr: exit-us-3.example:1080
            connector:
              type: socks5
              auth:
                username: YOUR_USERNAME
                password: YOUR_PASSWORD

如果你不想自己列出地址,可以将该跳指向单个轮换住宅端点:ChangeMyIP 会在其侧轮换 IP,而配置器只需要一个节点。其池覆盖 40+ 个国家、300+ 个城市和 1000+ 个子网,因此当任务依赖于看起来像互不相关的访客时,你可以将轮换分散到许多不同网络。

  1. 将你的应用指向本地监听器。浏览器代理设置采用 SOCKS5 主机 127.0.0.1 和端口 1080,并启用远程 DNS,以便名称由代理解析。命令行工具通常接受一个标志或环境变量:
export ALL_PROXY=socks5h://127.0.0.1:1080
export HTTPS_PROXY=socks5h://127.0.0.1:1080

有些工具会忽略这些变量,需要显式标志,例如 curl --proxy socks5h://127.0.0.1:1080。对于任何隐私敏感的场景,始终优先使用 socks5h 方案而不是 socks5。

  1. 让配置器保持运行。在 Linux 上,systemd 单元是最干净的选择:
[Unit]
Description=Local SOCKS5 configurator (gost)
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/gost -C /etc/gost/gost.yaml
Restart=on-failure
User=proxyuser
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target
sudo install -m 0600 gost.yaml /etc/gost/gost.yaml
sudo systemctl daemon-reload
sudo systemctl enable --now gost
systemctl status gost

在 Windows 上,创建一个任务计划程序任务,在登录时运行 gost.exe -C C:\gost\gost.yaml,并设置其无论用户是否登录都运行。在 macOS 上,测试时从终端运行相同命令,然后将其包装到 LaunchAgent 中,以便在登录时启动。

验证代理链和 DNS 行为

循环重复请求,以查看轮换是否确实发生:

for i in 1 2 3; do
  curl --silent --proxy socks5h://127.0.0.1:1080 https://api.ipify.org
  echo
done

检查出口地址报告的位置:

curl --silent --proxy socks5h://127.0.0.1:1080 https://ifconfig.co/json
  • 单跳返回该端点的地址。两跳链返回出口端点地址,绝不会返回入口地址。如果你看到入口地址,说明代理链没有被应用。
  • socks5h 方案要求代理解析主机名。普通的 socks5:// 在本地解析,这可能泄露你的解析器和大致位置,即使流量本身已经走代理。
  • 如果配置了选择器但每个请求都返回相同地址,请检查 maxFails 和 failTimeout 是否排除了节点,以及端点本身是否是一个固定数据中心地址。

故障排除

症状 可能原因 修复
Failed to connect to 127.0.0.1 port 1080 监听器未运行,或绑定到另一个端口 启动 gost -C gost.yaml 并检查配置中的 addr 值
SOCKS5 认证失败 用户名、密码或端点主机错误 从仪表板重新复制凭据,并用 curl 直接测试端点
每个请求都超时 防火墙阻止到端点端口的出站访问,或你的源 IP 未获授权 在不使用配置器的情况下测试原始端点,然后在防火墙中允许该连接
报告的 IP 是你自己的 应用绕过了监听器,或你使用了 socks5:// 而不是 socks5h:// 将应用指向 127.0.0.1:1080,并将方案切换为 socks5h
IP 从不变化 没有选择器的单个节点,或固定数据中心端点 添加包含多个节点的选择器,或将该跳移到轮换住宅端点
串联可用但很慢 两跳会使往返时间加倍 降为一跳,或将入口跳放在更靠近你所在地区的位置
配置编辑没有效果 旧进程仍在运行 使用 systemctl restart gost 重启服务,或停止终端进程并重新启动

总结

  • 本地 SOCKS5 配置器(此处用 gost 构建)为机器上的每个应用提供一个位于 127.0.0.1:1080 的代理端点,无论应用是否支持代理。
  • 一跳提供稳定的出口;两跳提供国家到国家路由,站点看到的是出口端点地址。
  • 选择器在一跳内的多个端点之间轮换,而轮换住宅端点则负责提供商侧的轮换。
  • 使用 socks5h 方案以便 DNS 由代理解析,并通过重复的 curl 循环和地理位置查询来验证结果。
  • 将 YAML 文件权限保持为 0600,并将监听器作为服务运行,以便它在重启和注销后仍能存活。