把 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。
核心原理
这套方案不是靠频繁切换当前选中的代理节点,而是靠 mihomo 的 IN-PORT 规则做绑定。
思路如下:
- 订阅 YAML 里本来就有很多
proxies - 脚本把这些真实节点筛出来
- 给每个节点生成一个本地
listener - 再加上
IN-PORT,端口,节点名
于是就实现了:
哪个端口进来的流量,就强制走哪个节点
这就是这套方案稳定的原因。
这个项目里用到的文件
项目里最重要的文件只有几个:
generate_multi_socks.pymihomo_multi_socks_local.yamlmihomo_multi_socks_ports.txttest_socks.py
这里不展开讲代码细节。要看实现,直接打开 generate_multi_socks.py 就够了。
实际使用流程
整个流程非常短:
- 准备好订阅 YAML
- 运行脚本生成多 SOCKS 配置
- Windows 下导入 Clash Verge Rev,Linux 下交给 mihomo 跑
- 在你的程序里指定
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.yamlmihomo_multi_socks_ports.txt
其中端口映射文件最重要,因为它告诉你:
11001 对应哪个节点
11021 对应哪个节点
11030 对应哪个节点
Windows 下怎么用
如果你在 Windows 上用 Clash Verge Rev,这套方法非常顺。
你只要:
- 先生成
mihomo_multi_socks_local.yaml - 把这个 YAML 导入 Clash Verge Rev
- 保持内核运行
- 模式设成
Rule - 不开系统代理
- 不开 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 端口
问题就解决了。