ProxyPoolxSocks Socks代理池服务端自动化搭建工具
Github项目: https://github.com/Anyyy111/ProxyPoolxSocks
声明:本工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担。
0x01 介绍
作者: Anyyy
本文地址: https://www.anyiblog.top/2023/05/15/20230515/
ProxyPoolxSocks 是一个代理池服务端工具,可以导入自定义的socks节点,其作用是利用多个代理IP绕过WAF防火墙。同时它支持代理池之间的迭代更新和切换。
当前处于测试阶段,任何问题欢迎向我发送邮件:[email protected] 或向我提交issue
工具支持Windows和Linux系统。
0x02 安装
注意python环境3.7以上即可。
服务端
git clone https://github.com/Anyyy111/ProxyPoolxSocks.git
cd ProxyPoolxSocks
pip install -r requirements.txt
python3 run.py
详细配置请参考 0x04 使用说明
客户端
服务端配置好之后,修改client.py,运行即可测试可用性。
详细配置请参考 0x04 使用说明
git clone https://github.com/Anyyy111/ProxyPoolxSocks.git
cd ProxyPoolxSocks
python3 Client-check/client.py
测试可用之后可跳转至 0x05 常见工具代理配置
0x03 效果展示
0x04 使用说明
服务端配置
1.设置config.py参数
# -*- coding: utf-8 -*-
import time
"""
必要参数
username&password: 服务端要求验证的账号密码 留空代表不需要账号密码
"""
username= ""
password= ""
"""
必要参数
port: 服务端开放的端口
"""
port = 12000
"""
必要参数
times: 代理切换速度 单位 ms 默认为 3 秒
detectTime: 更新可用节点的频率 单位 ms 默认为 5 分钟 不启用添为0即可
"""
times = 3000
detectTime = 300000
"""
可选参数
ServerLog: 显示服务端信息 1为开启 0为关闭
Record: 开启日志记录 1为开启 0为关闭 PS: 日志只记录 服务端 的连接记录
"""
ServerLog = 1
Record = 1
# 颜色参数 忽略即可
red = "\033[1;31m"
green = "\033[1;32m"
blue = "\033[1;34m"
cyan = "\033[1;36m"
yellow = "\033[1;33m"
end = "\033[0m"
# 日志名称 同样忽略即可
logname = f'Logs/Server_{time.strftime("%Y%m%d_%H%M%S")}.log'
配置文件我已经配置好了,你可以根据需求更改参数:
- username & password 服务端的连接账号密码,如果留空则代表不需要密码,如果填写必须二者都填写 且客户端连接要账密一致才能使用代理
- port 服务端搭起的端口,默认为12000,最终连接的端口就是这
- times 代理池之间代理切换的速度,单位为毫秒,times越小切换越快,尽量不要太小容易出问题。
- detectTime 更新可用节点的频率,单位位毫秒,设置为0即可关闭。程序会隔一段时间重新检测可用节点,以免过期。
- ServerLog 显示服务端的信息,设置为0则代表关闭 也就代表只显示客户端的连接信息。
- Record 开启日志文件记录,设置为0则代表关闭 日志文件存放在 Logs/Server_xxxx_xxxx.log
2.将socks节点添加至node.txt
node.txt是必须配置项,因为程序读取的节点就是来自这里。其中一行代表一个代理地址。
添加的形式要以以下的形式添加:
socks://base64(username:password)@IP:PORT
socks5://IP:PORT
## socks://base64(username:password)@IP:PORT
socks://[email protected]:59108#3
socks://[email protected]:38810#1
socks://[email protected]:38829
socks://[email protected]:59108#4
同样支持将所有节点base64加密后的形式:
c29ja3M6Ly9OVFUxTlRVNk5UVTFOVFU9QDgueHh4Lnh4eC4xMjo1OTEwOCMzCnNvY2tzOi8vWVdGaFlXRTZZV0ZoWVdFPUA4Lnh4eC54eHguMTI6Mzg4MTAjMQpzb2NrczovL1YzRkRjazFvVlVsdFZUcGFSMjFsVVVOMGVVNWFAMTUyLnh4Lnh4eC4yMjU6Mzg4MjkKc29ja3M6Ly9OVFUxTlRVNk5UVTFOVFU9QDQ3Lnh4eC54eHguMjE0OjU5MTA4IzQ=
(2023.5.24更新)
如果你的socks节点不带有任何账密,可以直接添加,就像这样:
##socks5://IP:PORT
socks://8.xxx.xxx.12:59108
socks://8.xxx.xxx.12:38810
socks://152.xx.xxx.225:38829
socks://47.xxx.xxx.214:59108
你可以直接从V2ray等代理软件里复制节点,选中节点并复制
如果你购买了机场,你也可以在你的代理软件里找到你订阅的服务器地址,然后在文件夹输入以下命令即可:
(一般订阅地址长这样:https://xxx.com/api/v1/client/subscribe?token=xxxxxx
)
curl https://xxx.com/api/v1/client/subscribe?token=xxxxxx -o node.txt
当你的node.txt存有节点信息后,就可以进行下一步的操作了。
注:测试的时候只拿了V2ray的socks节点来测试,如果你是其它的代理软件请将节点修改成符合以上的形式后写入node.txt中。
*程序只会调用订阅地址中存在socks协议的部分,其它部分忽略。
这里程序不提供免费的节点,如果你有socks节点就可以自定义添加。
3.运行run.py
在你的Windows/Linux系统下使用python3运行程序:
首次运行会读取节点并测试节点可用性,并会将可用的节点记录,等待下一次运行的时候可以直接调用可用节点:
等待测试完毕之后此时服务端就开启成功了:
然后找到你自己的 公网/内网 IP地址,客户端使用socks5协议连接你服务端的 IP、端口、用户名、密码 即可
这里以内网为例,我的服务端是192.168.31.226
客户端连接
客户端IP 192.168.31.225
1.client.py测试连接可用性
找到 Client-check/client.py
文件,该文件作用是验证连接可用性。
# -*- coding: utf-8 -*-
import requests
import socket
import socks
import os
print('Client 客户端测试代理连接脚本')
while 1:
try:
# 不存在密码就用这一条
socks.set_default_proxy(socks.SOCKS5, "0.0.0.0", 12000)
# 客户端存在密码用这一条
## socks.set_default_proxy(socks.SOCKS5, "0.0.0.0", 12000, username='aaa',password='bbb')
socket.socket = socks.socksocket
response = requests.get('https://ifconfig.me/',timeout=5).text
print("测试成功 当前代理:",response)
except KeyboardInterrupt:
os._exit(0)
*注意要根据客户端账密是否配置 来选择注释代码的部分。
配置完成后,运行脚本:
python client.py
显示测试成功则代表客户端与服务端通信无误,这个时候你就可以将代理地址写入各个代理软件,开心耍了~
2.服务端回显
此时服务端会显示连接信息:
同时会在 Logs/Server_xxxx_xxxx.log 记录服务端连接信息
0x05 常见工具代理配置
Proxifier
代理服务器配置
检查可用性:
这里测试设置中要记得勾去这一选项,不然会检验失败
这里其实也算是程序的一点缺陷,后续慢慢补全。
规则设置
将想要使用代理的应用程序设置刚刚配置好的代理服务器即可
设置成这样就可以了,默认的localhost记得要勾上,不然会连不到 一个localhost 一个你想代理的应用。
测试
访问ifconfig.m发现已经是代理IP了
Firefox
PS: 代理工具不要同时开好几个,不然会出问题的
打开火狐浏览器,设置-代理中:
这里要关闭 使用 SOCKS v5 时代理 DNS 查询 这一选项,不然会连接不上。
ProxyChains4
修改proxychains4.conf配置文件:
vim /etc/proxychains4.conf
在最后一行写入socks5代理地址
同时这里 strict_chain 要记得注释掉。
输入以下命令即可调用代理:
proxychains4 bash
curl https://ifconfig.me
Python脚本调用代理
方法一
在你的脚本添加这些代码:
import socks
# 不存在密码就用这一条
socks.set_default_proxy(socks.SOCKS5, "0.0.0.0", 12000)
# 客户端存在密码用这一条
## socks.set_default_proxy(socks.SOCKS5, "0.0.0.0", 12000, username='aaa',password='bbb')
socket.socket = socks.socksocket
方法二
使用requests库的时候可以设置proxies参数
import requests
## 带有密码的情况
# 格式: socks5://usernm:passwd@IP:PORT
proxies = {
'http':'socks5://aaa:[email protected]:12000'
'https':'socks5://aaa:[email protected]:12000'
}
## 无密码的情况
# 格式: socks5://IP:PORT
proxies = {
'http':'socks5://0.0.0.0:12000'
'https':'socks5://0.0.0.0:12000'
}
print(requests.get('https://ifconfig.me/').text)
Curl调用
curl -x "socks5://0.0.0.0:12000" https://ifconfig.me // 无密码
curl -x "socks5://aaa:[email protected]:12000" https://ifconfig.me // 存在密码
0x06 程序原理
服务端运行时,程序首先会获取node.txt里的socks节点并测试socks节点可用性,然后添加到一个列表里,暂且称之为代理池;
之后是一个随机取的操作,将代理池的代理随机取出,并添加到另一个新的列表代理池中,当代理池代理用完之后就会换用新的代理池,这样就实现了循环代理;
使用socks模块将取出的代理服务器进行代理,同时服务端调用 server.py
,该脚本文件就是一个简单的socks5代理服务器实现。
根据搭起的socks5通道,将先前代理流量分配到这个通道中,就实现了以一个代理服务器来代理服务端和客户端之间的通信,那么这时候客户端得到的就是代理服务器的流量
那么再循环代理池的任一代理服务器给服务端,客户端请求服务端,这时候就实现了服务端的多个代理流量变换,客户端也就得到了一个 可任意更换代理频率的代理服务器流量
0x07 参考文章
Server.py
部分参考了这位大佬写的socks5代理代码:https://github.com/dyboy2017/DYPROXY/
原理讲的很详细,测试过来有些地方有bug我自己稍加修改了。
其它的代码部分都是用头发换的(
0x08 尾声End
第一次正式的提交Github项目,其实我本人还是喜欢开发的,只是比较懒不想传github XD,之后有空我会将更多的实用项目分享出来。如果你觉得我的工具还不错的话那么不妨点一个Star或者提交一个Issue,这些都是我前进的动力。
测试过来程序还是存在很多bug,包括我后续想添加vmess、Shadowsocks等节点,奈何网上相关的文章较少同时也是比较耗时的,导致这不是一个完整的项目,还需要慢慢改进修改。师傅们有什么想法可以交流下。
如果你觉得有说的不对的地方请指出 希望能让这个工具更加完善 更加适用。