Skip to content

☁️Socks代理池服务端自动化搭建工具☁️

Notifications You must be signed in to change notification settings

Anyyy111/ProxyPoolxSocks

Repository files navigation

ProxyPoolxSocks Socks代理池服务端自动化搭建工具

Github项目: https://github.com/Anyyy111/ProxyPoolxSocks

声明:本工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担。

0x01 介绍

作者: Anyyy

博客: https://www.anyiblog.top

本文地址: https://www.anyiblog.top/2023/05/15/20230515/

ProxyPoolxSocks 是一个代理池服务端工具,可以导入自定义的socks节点,其作用是利用多个代理IP绕过WAF防火墙。同时它支持代理池之间的迭代更新和切换。

当前处于测试阶段,任何问题欢迎向我发送邮件:anyiguys@qq.com 或向我提交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 效果展示

Snipaste_2023-12-01_23-35-10

Snipaste_2023-12-02_00-15-59

image-20230515161416289

0x04 使用说明

服务端配置

1.设置config.py参数

# -*- coding: utf-8 -*-
import time

"""
必要参数
username&password: 服务端要求验证的账号密码 留空代表不需要账号密码
"""
username= ""

password= ""

"""
必要参数
port: 服务端开放的端口
"""
port = 12000

"""
必要参数
times: 代理切换速度 单位 s 默认为 3 秒
detectTime: 更新可用节点的频率 单位 s 默认为 5 分钟 不启用添为0即可
"""
times = 3
detectTime = 60 * 5

"""
可选参数
ServerLog: 显示服务端信息 1为开启 0为关闭
Record: 开启日志记录 1为开启 0为关闭    PS: 日志只记录 服务端 的连接记录
FileSize: 日志文件最大大小 单位 kb 默认为 20 mb
"""
ServerLog = 1
Record = 1
FileSize = 1024 * 1024 * 20


# 颜色参数 忽略即可
red = "\033[1;31m"
green = "\033[1;32m"
blue = "\033[1;34m"
cyan = "\033[1;36m"
yellow = "\033[1;33m"
end = "\033[0m"

# 日志名称 同样忽略即可
logname = 'Logs/Server_{}.log'.format(time.strftime("%Y%m%d_%H'%M'%S"))
logger = logging.getLogger()

配置文件我已经配置好了,你可以根据需求更改参数:

  • username & password 服务端的连接账号密码,如果留空则代表不需要密码,如果填写必须二者都填写 且客户端连接要账密一致才能使用代理
  • port 服务端搭起的端口,默认为12000,最终连接的端口就是这
  • times 代理池之间代理切换的速度,单位为秒,times越小切换越快,尽量不要太小容易出问题。
  • detectTime 更新可用节点的频率,单位为秒,设置为0即可关闭。程序会隔一段时间重新检测可用节点,以免过期。
  • ServerLog 显示服务端的信息,设置为0则代表关闭 也就代表只显示客户端的连接信息。
  • Record 开启日志文件记录,设置为0则代表关闭 日志文件存放在 Logs/Server_xxxx_xxxx.log
  • FileSize 设置文件大小,单位为kb,设定记录的日志文件的最大文件大小,超出这个值会停止日志记录。

2.将socks节点添加至node.txt

node.txt是必须配置项,因为程序读取的节点就是来自这里。其中一行代表一个代理地址。

添加的形式要以以下的形式添加:

socks://base64(username:password)@IP:PORT

socks5://IP:PORT

## socks://base64(username:password)@IP:PORT

socks://NTU1NTU6NTU1NTU=@8.xxx.xxx.12:59108#3
socks://YWFhYWE6YWFhYWE=@8.xxx.xxx.12:38810#1
socks://YWFhYWE6YWFhYWE=@152.xx.xxx.225:38829
socks://NTU1NTU6NTU1NTU=@47.xxx.xxx.214: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等代理软件里复制节点,选中节点并复制

image-20230515163301348

如果你购买了机场,你也可以在你的代理软件里找到你订阅的服务器地址,然后在文件夹输入以下命令即可:

(一般订阅地址长这样:https://xxx.com/api/v1/client/subscribe?token=xxxxxx

curl https://xxx.com/api/v1/client/subscribe?token=xxxxxx -o node.txt

image-20230515164116160

当你的node.txt存有节点信息后,就可以进行下一步的操作了。

注:测试的时候只拿了V2ray的socks节点来测试,如果你是其它的代理软件请将节点修改成符合以上的形式后写入node.txt中。

*程序只会调用订阅地址中存在socks协议的部分,其它部分忽略。

这里程序不提供免费的节点,如果你有socks节点就可以自定义添加。

3.运行run.py

在你的Windows/Linux系统下使用python3运行程序:

image-20230515164753382

首次运行会读取节点并测试节点可用性,并会将可用的节点记录,等待下一次运行的时候可以直接调用可用节点:

image-20230515165032157

等待测试完毕之后此时服务端就开启成功了:

image-20230515171103341

然后找到你自己的 公网/内网 IP地址,客户端使用socks5协议连接你服务端的 IP、端口、用户名、密码 即可

这里以内网为例,我的服务端是192.168.31.226

image-20230515165322694

客户端连接

客户端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

image-20230515165842193

显示测试成功则代表客户端与服务端通信无误,这个时候你就可以将代理地址写入各个代理软件,开心耍了~

2.服务端回显

此时服务端会显示连接信息:

image-20230515170032093

同时会在 Logs/Server_xxxx_xxxx.log 记录服务端连接信息

image-20230515170603642

0x05 常见工具代理配置

Proxifier

代理服务器配置

image-20230515171813109

image-20230515172006451

检查可用性:

image-20230515172833070

这里测试设置中要记得勾去这一选项,不然会检验失败

这里其实也算是程序的一点缺陷,后续慢慢补全。

image-20230515172818825

image-20230515172755347

规则设置

image-20230515172153142

将想要使用代理的应用程序设置刚刚配置好的代理服务器即可

image-20230515172112825

设置成这样就可以了,默认的localhost记得要勾上,不然会连不到 一个localhost 一个你想代理的应用。

image-20230515172635381

测试

访问ifconfig.m发现已经是代理IP了

image-20230515172510772

image-20230515172549015

Firefox

PS: 代理工具不要同时开好几个,不然会出问题的

打开火狐浏览器,设置-代理中:

image-20230515173109942

这里要关闭 使用 SOCKS v5 时代理 DNS 查询 这一选项,不然会连接不上。

image-20230515173210822

image-20230515173220545

ProxyChains4

修改proxychains4.conf配置文件:

vim /etc/proxychains4.conf

在最后一行写入socks5代理地址

image-20230515173714217

同时这里 strict_chain 要记得注释掉。

image-20230515173733682

输入以下命令即可调用代理:

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:bbb@0.0.0.0:12000'
	'https':'socks5://aaa:bbb@0.0.0.0: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:bbb@0.0.0.0:12000" https://ifconfig.me // 存在密码

0x06 程序原理

服务端运行时,程序首先会获取node.txt里的socks节点并测试socks节点可用性,然后添加到一个列表里,暂且称之为代理池;

之后是一个随机取的操作,将代理池的代理随机取出,并添加到另一个新的列表代理池中,当代理池代理用完之后就会换用新的代理池,这样就实现了循环代理;

使用socks模块将取出的代理服务器进行代理,同时服务端调用 server.py ,该脚本文件就是一个简单的socks5代理服务器实现。

根据搭起的socks5通道,将先前代理流量分配到这个通道中,就实现了以一个代理服务器来代理服务端和客户端之间的通信,那么这时候客户端得到的就是代理服务器的流量

那么再循环代理池的任一代理服务器给服务端,客户端请求服务端,这时候就实现了服务端的多个代理流量变换,客户端也就得到了一个 可任意更换代理频率的代理服务器流量

image-20230515182500896

1

0x07 参考文章

Server.py部分参考了这位大佬写的socks5代理代码:https://github.com/dyboy2017/DYPROXY/

原理讲的很详细,测试过来有些地方有bug我自己稍加修改了。

其它的代码部分都是用头发换的(

0x08 更新日志

Date: 2023/12/01 Version: v1.3

1.经反映,优化了客户端连接过多导致日志文件存储过大的问题,现在可以在config.py设置日志文件最大大小(默认20mb), 存储大小超过了设定的文件大小会断开日志记录;将日志文件名字修改的更明显了。

2.修改了检测节点这个功能的逻辑,原先检测节点的逻辑是将node.txt里的节点拿去检测,现在修改成将已经检测好的节点进行二次检测。这样的好处是检测快,当然也可以通过修改代码的方式改成原先的模式,在run.py里我已经写好了注释

3.新Logo!浅蓝皮肤变好康了,添加了version(我宣布v1.3是最好用的版本)

4.更新了更新日志 优化了亿个细节

有任何bug和Issue可以向我提出,惊人的是这个项目Star还挺多,希望各位师傅可以多多推广 多点点Star! o.O

0x09 尾声End

第一次正式的提交Github项目,其实我本人还是喜欢开发的,只是比较懒不想传github XD,之后有空我会将更多的实用项目分享出来。如果你觉得我的工具还不错的话那么不妨点一个Star或者提交一个Issue,这些都是我前进的动力。

测试过来程序还是存在很多bug,包括我后续想添加vmess、Shadowsocks等节点,奈何网上相关的文章较少同时也是比较耗时的,导致这不是一个完整的项目,还需要慢慢改进修改。师傅们有什么想法可以交流下。

如果你觉得有说的不对的地方请指出 希望能让这个工具更加完善 更加适用。