使用强大的 python 协作并发框架asyncio实现的 SOCKS 代理服务器。
如果 Python 版本 3.8.0 或更高版本可用,请使用 pip 安装。
pip install asyncio-socks-server
或者从 Docker Hub 注册表中提取 Docker 映像。
docker pull amaindex/asyncio-socks-server
使用 pip 安装时,您可以从命令行调用 asyncio-socks-server:
asyncio_socks_server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
在哪里:
asyncio_socks_server
:您可以在开发中使用 python -m asyncio_socks_server 。-h
, --help
:显示帮助消息并退出。-v
, --version
: 显示程序的版本号并退出。-H HOST
, --host HOST
:要侦听的主机地址(默认 0.0.0.0)。-P PORT
, --port PORT
:要监听的端口(默认 1080)。-A METHOD
, --auth METHOD
: 身份验证方法(默认 0)。可能的值:0(无身份验证)、2(用户名/密码身份验证)--access-log
:显示访问日志。--debug
:在调试模式下工作。--strict
:严格按照RFC1928和RFC1929工作。如果METHOD
的值为2,即指定用户名/密码认证时,需要通过--config
选项提供一个包含json格式的用户名和密码的配置文件。您还可以在配置文件中列出其他选项来代替命令:
config.json
:
{
"LISTEN_HOST" : " 0.0.0.0 " ,
"LISTEN_PORT" : 1080 ,
"AUTH_METHOD" : 2 ,
"ACCESS_LOG" : true ,
"DEBUG" : true ,
"STRICT" : true ,
"USERS" : {
"username1" : " password1 " ,
"username2" : " password2 " ,
"username3" : " password3 "
}
}
asyncio_socks_server --config ${ENV} /config.json
此外,任何以AIOSS_
开头的环境变量也将应用于该选项。可以通过指定--env-prefix
选项来更改前缀,例如:
export MY_LISTEN_HOST=127.0.0.1
export MY_LISTEN_PORT=9999
asyncio_socks_server --env-prefix MY_
注意:选项的加载顺序是:配置文件、环境变量、命令选项。如果以多种方式给出选项,则后者将覆盖前者。
或者,如果您使用 docker 映像,则可以使用以下命令启动 asyncio-socks-server:
docker run amaindex/asyncio-socks-server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
建议使用网络模式host
,因为 asyncio-socks-server 动态使用多个端口。如果您还想提供配置文件,则应手动安装。
docker run
--rm
--net=host
-v /host/path/config.json:/config.json
amaindex/asyncio-socks-server
--config /config.json
由于各种原因,asyncio-socks-server 在协议的实现细节上做了一些妥协。因此,在以下场景中,asyncio-socks-server 的行为将与 RFC1928 和 RFC1929 中描述的行为有所不同。
在 SOCKS5 协商中,如下形成的 UDP ASSOCIATE 请求用于在 UDP 中继进程内建立关联以处理 UDP 数据报:
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
通常,DST.ADDR 和 DST.PORT 字段包含客户端希望用于发送关联的 UDP 数据报的地址和端口,或者如果客户端不拥有此信息,则使用全零的端口号和地址。因此,当客户端工作在使用NAT的网络中时,应该使用全0的DST.ADDR以避免错误。但如果某些客户端没有正确遵循此原则,asyncio-socks-server 默认情况下会中继其收到的所有 UDP 数据报,而不是使用 DST.ADDR 和 DST.PORT 来限制访问。
客户端在协商时一旦选择了用户名/密码认证,就会与服务器进行子协商。该子协商从客户端产生请求开始:
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
VER 字段包含子协商的当前版本,即 X'01',但通常被视为 X'05',因为它有点违反直觉。因此 asyncio-socks-server 允许在非严格模式下使用 VER X'05' 进行请求。
--strict
选项要禁用上述妥协,您可以指定--strict
选项:
asyncio_socks_server --strict