把 Clash 订阅拆成多个 SOCKS 端口,让不同服务固定走不同节点

发布于 最后更新 阅读 3

把 Clash 订阅拆成多个 SOCKS 端口,让不同服务固定走不同节点

很多人用 Clash 或 Mihomo 的时候,默认思路都是“全局代理”或者“系统代理”。但实际做服务、脚本、爬虫、接口调度时,真正需要的往往不是这个。

更常见的需求其实是:

  • 服务 A 走香港节点
  • 服务 B 走新加坡节点
  • 服务 C 走美国节点
  • 彼此互不影响

也就是说,我们想要的不是“整台机器统一翻”,而是“每个服务单独指定一个代理出口”。

这套方案就是为这个目的准备的。

这套方案到底在做什么

简单说,就是把一个 Clash / Mihomo 订阅里的多个节点,拆成多个本地 SOCKS5 端口。

拆完之后,你可以这样用:

服务 A -> socks5h://127.0.0.1:11001
服务 B -> socks5h://127.0.0.1:11021
服务 C -> socks5h://127.0.0.1:11030

每个端口都固定对应一个节点。

比如:

11001 -> 香港节点
11021 -> 新加坡节点
11030 -> 下载节点

这样你的不同程序,只需要写不同的代理地址,就能稳定走不同出口 IP。

核心原理

这套方案不是靠频繁切换当前选中的代理节点,而是靠 mihomoIN-PORT 规则做绑定。

思路如下:

  1. 订阅 YAML 里本来就有很多 proxies
  2. 脚本把这些真实节点筛出来
  3. 给每个节点生成一个本地 listener
  4. 再加上 IN-PORT,端口,节点名

于是就实现了:

哪个端口进来的流量,就强制走哪个节点

这就是这套方案稳定的原因。

这个项目里用到的文件

项目里最重要的文件只有几个:

  • generate_multi_socks.py
  • mihomo_multi_socks_local.yaml
  • mihomo_multi_socks_ports.txt
  • test_socks.py

这里不展开讲代码细节。要看实现,直接打开 generate_multi_socks.py 就够了。

实际使用流程

整个流程非常短:

  1. 准备好订阅 YAML
  2. 运行脚本生成多 SOCKS 配置
  3. Windows 下导入 Clash Verge Rev,Linux 下交给 mihomo 跑
  4. 在你的程序里指定 socks5h://127.0.0.1:某端口

就这么简单。

先安装依赖

Python 这边只要装三个包:

pip install requests pyyaml pysocks

如果你习惯用虚拟环境:

python -m pip install requests pyyaml pysocks

生成配置的命令

最常用的命令就是这一条:

python generate_multi_socks.py -i RfbtkKS6zU76.yaml --listen 127.0.0.1 -p 11001

这条命令的意思很直接:

  • 输入订阅文件 RfbtkKS6zU76.yaml
  • 11001 开始分配端口
  • 只监听本机 127.0.0.1

生成之后会得到两个结果:

  • mihomo_multi_socks_local.yaml
  • mihomo_multi_socks_ports.txt

其中端口映射文件最重要,因为它告诉你:

11001 对应哪个节点
11021 对应哪个节点
11030 对应哪个节点

Windows 下怎么用

如果你在 Windows 上用 Clash Verge Rev,这套方法非常顺。

你只要:

  1. 先生成 mihomo_multi_socks_local.yaml
  2. 把这个 YAML 导入 Clash Verge Rev
  3. 保持内核运行
  4. 模式设成 Rule
  5. 不开系统代理
  6. 不开 TUN

然后你的程序自己写代理地址就行:

socks5h://127.0.0.1:11021

为什么这里不需要开系统代理?

因为你的服务已经显式指定了代理地址。请求会直接发到本地 SOCKS 端口,不依赖系统代理设置。

为什么也不需要开 TUN?

因为这里不是让整台机器的流量接管,而是让某一个程序主动把流量交给指定的 SOCKS 端口。

Linux 下怎么用

Linux 这边不用 Clash Verge Rev,直接运行 mihomo。

常见安装过程可以压缩成下面这些命令:

sudo apt update
sudo apt install -y curl gzip tar
sudo mkdir -p /opt/mihomo
cd /opt/mihomo
VERSION=1.19.20
sudo curl -L -o mihomo.gz "https://github.com/MetaCubeX/mihomo/releases/download/v${VERSION}/mihomo-linux-amd64-compatible-v${VERSION}.gz"
sudo gzip -d mihomo.gz
sudo chmod +x mihomo
sudo ln -sf /opt/mihomo/mihomo /usr/local/bin/mihomo
mihomo -v

然后把生成好的配置放到:

/opt/mihomo/config.yaml

例如:

sudo cp mihomo_multi_socks_local.yaml /opt/mihomo/config.yaml

前台测试:

mihomo -d /opt/mihomo

如果要后台长期运行,就配 systemd

服务文件可以写成:

[Unit]
Description=Mihomo Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=/opt/mihomo
ExecStart=/opt/mihomo/mihomo -d /opt/mihomo
Restart=always
RestartSec=5
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

启用命令:

sudo systemctl daemon-reload
sudo systemctl enable mihomo
sudo systemctl restart mihomo
sudo systemctl status mihomo

看日志:

sudo journalctl -u mihomo -f

怎么验证真的生效了

最简单的办法,就是直接查出口 IP。

例如测试 11021:

curl --max-time 20 -x socks5h://127.0.0.1:11021 https://ipinfo.io/json

如果返回的是新加坡 IP,那就说明这个端口已经固定走新加坡节点。

再测另外几个端口:

curl --max-time 20 -x socks5h://127.0.0.1:11001 https://ipinfo.io/json
curl --max-time 20 -x socks5h://127.0.0.1:11021 https://ipinfo.io/json
curl --max-time 20 -x socks5h://127.0.0.1:11030 https://ipinfo.io/json

如果不同端口出来的是不同国家、不同地区、不同 IP,这套方案就已经成功了。

项目里也有一个现成测试文件:

  • test_socks.py

直接运行:

python test_socks.py

程序里怎么接入

这套方案一旦跑起来,接入其实非常轻。

Python requests

import requests

proxies = {
    "http": "socks5h://127.0.0.1:11021",
    "https": "socks5h://127.0.0.1:11021",
}

resp = requests.get("https://ipinfo.io/json", proxies=proxies, timeout=20)
print(resp.text)

环境变量方式

Linux:

ALL_PROXY=socks5h://127.0.0.1:11021 python your_service.py

Windows PowerShell:

$env:ALL_PROXY="socks5h://127.0.0.1:11021"
python your_service.py

本质上就是一句话:

哪个服务想走哪个节点,就给它对应的 socks5h 端口

为什么推荐 socks5h,而不是 socks5

建议统一写:

socks5h://127.0.0.1:端口

不要默认写:

socks5://127.0.0.1:端口

原因很简单,socks5h 会把域名解析也交给代理侧处理,能避免本地 DNS 解析带来的偏差和泄漏。

什么时候用 127.0.0.1,什么时候用 0.0.0.0

如果只是本机程序使用,最推荐:

127.0.0.1

因为最安全,也最省事。

如果是 Docker、局域网机器、远端机器也要访问,才考虑:

0.0.0.0

但这时候一定要有安全措施。最少也要做两件事:

  • 开启认证
  • 配好防火墙

否则你就是把一个可滥用的 SOCKS 代理直接暴露出去了。

这套方案适合哪些场景

它特别适合下面几类场景:

  • 多个爬虫分别走不同出口
  • 多个 API 服务分别绑不同地区节点
  • 下载任务和业务请求分开走不同线路
  • 本地工具链按端口精确指定代理
  • 单机上同时跑多个需要不同出口的服务

最后总结

如果你只是想要一个结论,那就是:

不要再只盯着“系统代理”和“全局模式”。

真正灵活、稳定、适合服务化使用的方式,是把订阅拆成多个本地 SOCKS 端口,让每个服务自己指定出口。

这个项目已经把这件事跑通了。

最短操作可以压缩成三步:

pip install requests pyyaml pysocks
python generate_multi_socks.py -i RfbtkKS6zU76.yaml --listen 127.0.0.1 -p 11001
curl --max-time 20 -x socks5h://127.0.0.1:11021 https://ipinfo.io/json

Windows 下导入 Clash Verge Rev,Linux 下交给 mihomo。

后面你的服务只需要记住一件事:

给不同的服务分配不同的 socks5h 端口

问题就解决了。

相关推荐

评论

暂无评论