跳转到主要内容

SANS-I/O实现SOCKS4、SOCKS4A和SOCKS5。

项目描述

SOCKSIO

Build Status codecov Supported Python Versions PyPI

客户端无I/O SOCKS代理实现。支持SOCKS4、SOCKS4A和SOCKS5。

socksio是一个类似于h11h2的无I/O库,这意味着库本身不处理通过网络发送字节的实际操作,它只处理SOCKS协议的实现细节,因此您可以在任何您想要的I/O库中使用它。

当前状态:稳定

尚未实现的功能

  • SOCKS5 GSS-API身份验证。
  • SOCKS5 UDP关联请求。

使用方法

TL;DR 查看示例目录 examples

无I/O意味着为了测试socksio,您需要一个I/O库。最基本的I/O当然是标准库的socket模块。

您需要提前知道您想连接的SOCKS代理类型。假设我们在本地机器上的8080端口运行一个SOCKS4代理,我们将首先创建一个连接到它的连接

import socket

sock = socket.create_connection(("localhost", 8080))

socksio公开了SOCKS4、SOCKS4A和SOCKS5的模块,每个模块都包含一个Connection

from socksio import socks4

# The SOCKS4 protocol requires a `user_id` to be supplied.
conn = socks4.SOCKS4Connection(user_id=b"socksio")

由于 socksio 是一个无-I/O 库,我们将使用套接字向我们的 SOCKS4 代理发送和接收数据。然而,原始数据将由我们的 SOCKS4Connection 创建和解析。

我们需要告诉我们的连接我们想要向代理发送请求。我们首先创建一个请求对象来实现这一点。

在 SOCKS4 中,我们只需要发送一个命令以及一个 IP 地址和端口。 socksio 在请求类中公开了不同类型的命令作为枚举,以及在请求类中的方便的 from_address 类方法来创建有效的请求对象。

# SOCKS4 does not allow domain names, below is an IP for google.com
request = socks4.SOCKS4Request.from_address(
    socks4.SOCKS4Command.CONNECT, ("216.58.204.78", 80))

from_address 方法在 socksio 的所有请求类中都是可用的,它们接受地址作为 (address, port) 的元组,以及字符串 address:port

现在我们要求连接发送我们的请求

conn.send(request)

SOCKS4Connection 将随后为我们组装必要的 bytes 数据,以正确的格式发送到我们的代理

data = conn.data_to_send()
sock.sendall(data)

如果一切顺利,代理将发送回复,我们只需要从套接字读取并将数据传递给 SOCKS4Connection

data = sock.recv(1024)
event = conn.receive_data(data)

连接将解析数据并从中返回一个事件,在这种情况下,一个包含 SOCKS 回复字段属性的 SOCKS4Reply

if event.reply_code != socks4.SOCKS4ReplyCode.REQUEST_GRANTED:
    raise Exception(
        "Server could not connect to remote host: {}".format(event.reply_code)
    )

如果一切顺利,连接已正确建立,我们可以开始直接向代理发送请求

sock.sendall(b"GET / HTTP/1.1\r\nhost: google.com\r\n\r\n")
data = receive_data(sock)
print(data)
# b'HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.google.com/...`

所有协议都使用相同的方法,有关更多信息,请参阅 示例目录

开发

使用 pip install -r test-requirements.txt 安装测试需求。

使用 flit install -s 以伪可编辑模式安装项目。

可以直接调用 pytest 运行测试。

该项目使用 nox来自动化测试和 linting 任务。 nox 作为测试需求的一部分被安装。调用 nox 将运行所有会话,但您也可以只运行其中的一些,例如,nox -s lint 将只运行 linting 会话。

为了测试一个实际的代理服务器,提供了一个基于 Dante SOCKS 服务器的 Docker 设置。

将启动一个容器,其中 danted 监听 1080 端口。docker-compose.yml 将启动容器并适当地映射端口。要后台启动容器

docker-compose -f docker/docker-compose.yml up -d

要停止它

docker-compose -f docker/docker-compose.yml down

或者,移除 -d 标志以在前台运行容器。

参考文档

每个实现都遵循以下列出的文档

许可证

MIT

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

socksio-1.0.0.tar.gz (19.1 kB 查看哈希)

上传时间 源代码

构建分发

socksio-1.0.0-py3-none-any.whl (12.8 kB 查看哈希值)

上传时间 Python 3

支持者