ProxyCat V3.0 发布:从「换 IP 的小工具」,到一台代理池中间件
原创
shironeko
shironeko
樱花庄的本间白猫
2026年10月5日 17:33
福建
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
部署一次、永久可用的代理池中间件。
全新UI
写在前面
做渗透测试的人大多遇到过这种情况:目标站的 WAF 开始封 IP,扫描器刚跑出点东西就卡住了。
想换 IP,隧道代理一天要 10 到 500 元;自己攒一批短效 IP,又总是卡在「这些 IP 到底还能不能用」上。
ProxyCat 最早就是为了解决这个问题。短效 IP 便宜得很(平均 0.03–0.4 元一天),但直接拿来用体验很差,于是这个项目对外提供一个固定的代理端口,背后自动换 IP,Yakit、Burp、sqlmap 这些工具照常填地址就能用,部署一次可以长期跑。
项目原理图
V2.x 解决的是「有没有」的问题,V3.0 想解决的是「扛不扛得住」。这次改动很大,几乎每个核心模块都重写过,不是打补丁的程度。
一、一次同时用多个出口,而不是换着用
V2.x 的运行方式是:当前用一个上游代理,到点或者失效了再换下一个。这个模式有个绕不过去的问题,你的速度上限被单个出口 IP 的限流卡死了。
V3.0 改成维护一个出口池,同时有 10 个上游代理在用(exit_count,可调),请求按各出口当前的负载分配,不是简单地轮流来。如果上游是按 IP 限流的,出口越多,能扛住的并发就越高。
每个出口有各自的寿命,到期单独换掉,不是攒一批一起换。寿命这里还分了两种算法:一种是按时间(interval,默认 60 秒),一种是按这个出口被分配了多少次请求(request_interval)。两条规则同时生效,谁先到就换谁,因为有的代理商是按时间掐你,有的按次数掐你。
出口轮换配置
面板上能逐个看到在用出口的地址和剩余寿命,命令行也一样会打印。
二、坏出口怎么判
旧的判断方式是「连续失败 N 次就换掉」。但真实网络里,一次抖动可能同时掐断好几条隧道,连续计数很容易被清零,中间随便成功一次,之前的失败就算过去了。
V3.0 改成看最近 10 次结果里的失败占比:
- 占比过半:分配请求时排到健康出口后面,但还能用,也没有冷却时间。后面成功几次,占比自然就降回来了。
- 占比到九成,并且这 10 次里至少有 5 次结果:直接从名册里移出去,后台补新的。
- 名册里最后一个出口永远不动。停掉它等于全线 503,让它继续顶着,比没有出口强。
这样「一次网络抖动」和「这个出口真坏了」就能分开:前者的失败会被后面的成功稀释掉,后者占比只会一路涨。
三、内置的代理池
V3.0 把代理池并进了主进程,不再单独占一个端口,管理入口就在面板的「代理池」页签,接口统一挂在 /api/pool/* 下面。配置也从原来单独的 yaml 搬进了 config.ini,旧配置第一次启动会自动迁移。
池里每条代理都有一份质量画像:
- 健康分 0–100,由延迟、成功率、稳定性、可用时长、匿名度、存活时长加权算出来。成功率那一项取的是 Wilson 置信下界,新入库的代理不会因为一两次偶然失败就被打到很低。
- 匿名度分透明、匿名、高匿三档,判定方式改成了校验证书,第三方代理没法再靠伪造回显把自己刷成高匿。
- 归属地离线解析(GeoLite2 加纯真库),中英文名字按界面语言显示。
还有一条使用反馈的闭环:转发时真的发现某个出口不通,确认之后回报给池子,连续失败到阈值就标记失效,下一轮自动重验证测通了再恢复。
这里有个刻意的取舍:反馈只改「是否可用」和检查次数,不碰健康分。因为程序分不清是代理坏了,还是我们自己网络抖了,不该让一次偶发失败把一条好代理永久删掉。
四、面板
面板从横排页签改成了左侧边栏,四个区:代理配置、代理池、访问控制、运行日志。
访问控制
新增的东西比较多:
- 命令面板:
Ctrl/⌘+K打开,可以直接搜命令。1–4切视图、r刷新、/聚焦搜索、?看快捷键;表格里方向键移动,空格选中,Shift扩选。 - 深色主题:没手动切过时跟随系统,深色下的文字配色按对比度重做过。
- 访问明细:每次请求都能查到,支持按时间筛选、分页、导出 CSV 或 JSON。CSV 带 BOM,Windows 的 Excel 打开不乱码;记录存在 SQLite 里,重启不丢。
- 域名统计:按「域名 + 上游代理」两个维度聚合。同一个域名走不同代理结果可能完全不同,只按域名统计会把最有用的信息抹平。
- 批量任务:导入、批量验证、插件抓取这些耗时操作会显示进度、速度、剩余时间和分类计数,随时能取消。
- 日志分了四类:主程序、访问、代理、错误分别写四个文件,各自按大小轮转,支持级别和关键词过滤、看历史文件、导出、清理。
另外几个小改动,都是实际用起来才会想到的:
- 绕过白名单:命中的目标(支持
*.baidu.com、192.168.1.*这种通配符)直接本机连,不走上游,HTTP 和 SOCKS5 都生效。 - 凭据管理:取代理接口的账号密码可以存好几套,起个名字,用的时候一键切换,不用再改
config.ini。 - 配置全部收进面板,93 个键按用途分组,调优参数收在「高级选项」里。
- 表格右键能复制成 curl 命令,列宽能拖而且会记住,删除之类的操作换成了自己画的确认框。
五、性能
内部改了几处:生产启动换成 waitress,监听连接交给独立线程 accept(Windows 上实测接受速率从 825 次/秒提到 3000+),日志改成异步写,池子的落库改成先写内存再批量入库。
实测数据:
| 场景 | 数字 |
|---|---|
| 压测(3000 请求 / 500 并发) | 成功 3000,失败 0,单次延迟约 550–670 ms |
| 并发空隧道(2000 条) | 每连接约 148 KB 内存,空转 CPU 低于 0.5% |
| 单隧道吞吐(回环) | 约 520 MB/s |
| 小报文往返 | p50 0.27 ms / p95 0.47 ms |
六、怎么部署
Docker:
docker compose up -d --build
源码运行,需要 Python 3.10 以上:
pip install -r requirements.txt
python3 app.py
两个端口:1080 是代理监听(HTTP 和 SOCKS5 共用),5001 是面板。
部署完跑两条命令,能通就说明它在工作:
# 面板在监听,期望 302
curl -i http://127.0.0.1:5001/
# 代理在转发,期望 200
curl -x http://neko:[email protected]:1080 https://www.baidu.com -I
有三件事提前说一下,能省不少时间:
- 面板返回 401 是正常的,设置过 token 就必须带
?token=才能打开。仓库自带的 token 是公开的,对外用之前记得改掉。 - Docker 容器以非 root 运行,
config/、logs/、modules/proxypool/data/三个挂载目录的属主得和 PUID/PGID 对上,对不上会写不进配置和日志。 stop_grace_period留的 60 秒是给写队列排空用的,请不要改小。
七、面板里的广告位是怎么回事
有朋友第一次打开面板会看到一块推广位,这里说清楚它是什么。
它不是统计代码,也不是什么第三方 SDK。V3.0 把 Bootstrap 和所有外部 JS 都移除了,面板不引任何外站脚本。这块推广位读的是 config/ads/ 目录下的 JSON 文件,标题、正文、图片、跳转链接都写在里面,直接打开文件就能看到它会往哪跳,图片也是浏览器自己去加载的,程序本身不发这个请求。
留着它的理由很简单:开源项目未打算做收费版,服务器、域名、开发和 IP 的开销只能靠赞助和广告回血。
不想看可以直接关:
- 面板上点关闭就行;
- 想彻底去掉,把
config/ads/里对应 JSON 的enabled改成false,或者干脆删掉这个文件。image_url留空的话只显示文字,不加载图片。
八、想请你也帮一把
开源项目最难的不是写代码,是长期维护。如果你觉得 ProxyCat 帮到了你,可以:
- 赞助作者:金额随意,一杯咖啡或者一顿饭都算数,赞助名单会记在 Thanks-for-sponsorship 里;
- 广告位合作:如果你是代理服务商或者有相关产品,面板的广告位、README 的推荐位都可以放,可以直接找作者谈;
- 顺手帮个忙:点个 Star、提个 Issue 说说不顺手的地方、把文章转给同样在做网安的朋友,这些也都算。
来杯瑞幸吧
联系作者:公众号「樱花庄的本间白猫」,或者直接在 GitHub 提 Issue。
写在最后
V3.0 还有不少零散的改动:版本检查、归属地库更新、插件级的验证策略和测试地址、数据库备份恢复、配置热重载、以及一批稳定性修复,完整的记录都在仓库的更新日志里。
项目地址:https://github.com/honmashironeko/ProxyCat
文档是中英双语,功能特性、详细配置、使用手册、报错排查、接口文档都有。
免责声明:本工具仅供授权范围内的安全测试与学习研究使用,使用者需自行承担因使用本工具产生的一切责任。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论