Un servidor proxy SOCKS implementado con el potente marco de concurrencia cooperativa de Python asyncio .
Instale con pip si está disponible la versión 3.8.0 o superior de Python.
pip install asyncio-socks-server
O extraiga una imagen de Docker del registro de Docker Hub.
docker pull amaindex/asyncio-socks-server
Cuando se instala con pip, puede invocar asyncio-socks-server desde la línea de comandos:
asyncio_socks_server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
dónde:
asyncio_socks_server
: puedes usar python -m asyncio_socks_server en desarrollo.-h
, --help
: muestra un mensaje de ayuda y sale.-v
, --version
: muestra el número de versión del programa y sale.-H HOST
, --host HOST
: Dirección del host para escuchar (predeterminado 0.0.0.0).-P PORT
, --port PORT
: Puerto para escuchar (predeterminado 1080).-A METHOD
, --auth METHOD
: Método de autenticación (predeterminado 0). Valores posibles: 0 (sin autenticación), 2 (autenticación de nombre de usuario/contraseña)--access-log
: muestra el registro de acceso.--debug
: trabaja en modo de depuración.--strict
: Trabaja en estricto cumplimiento de RFC1928 y RFC1929. Si el valor de METHOD
es 2, es decir, cuando se especifica la autenticación de nombre de usuario/contraseña, debe proporcionar un archivo de configuración que contenga los nombres de usuario y las contraseñas en formato json con la opción --config
. También puede enumerar otras opciones en el archivo de configuración en lugar del comando:
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
Además, cualquier variable de entorno cuyo nombre comience con AIOSS_
también se aplicará a la opción. El prefijo se puede cambiar especificando la opción --env-prefix
, por ejemplo:
export MY_LISTEN_HOST=127.0.0.1
export MY_LISTEN_PORT=9999
asyncio_socks_server --env-prefix MY_
NOTA: El orden de carga de las opciones es: archivo de configuración, variables de entorno, opciones de comando. Este último sobrescribirá al primero si se ofrecen opciones de varias maneras.
Alternativamente, si usa la imagen de la ventana acoplable, puede iniciar el servidor asyncio-socks con el siguiente comando:
docker run amaindex/asyncio-socks-server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
Se recomienda el host
en modo de red ya que asyncio-socks-server utiliza múltiples puertos dinámicamente. Si también desea proporcionar un archivo de configuración, debe montarlo manualmente.
docker run
--rm
--net=host
-v /host/path/config.json:/config.json
amaindex/asyncio-socks-server
--config /config.json
Por diversas razones, asyncio-socks-server ha hecho algunos compromisos en los detalles de implementación de los protocolos. Por lo tanto, en las siguientes escenas, el comportamiento del servidor asyncio-socks será diferente del descrito en RFC1928 y RFC1929.
En la negociación SOCKS5, se utiliza una solicitud UDP ASSOCIATE formada de la siguiente manera para establecer una asociación dentro del proceso de retransmisión UDP para manejar datagramas UDP:
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
Normalmente, los campos DST.ADDR y DST.PORT contienen la dirección y el puerto que el cliente espera usar para enviar datagramas UDP para la asociación, o usan un número de puerto y una dirección de todos ceros si el cliente no posee esta información. Por lo tanto, cuando el cliente está trabajando en una red que usa NAT, se debe usar DST.ADDR con todos ceros para evitar errores. Pero en caso de que algunos clientes no siguieran este principio correctamente, asyncio-socks-server retransmite todos los datagramas UDP que recibe de forma predeterminada en lugar de utilizar DST.ADDR y DST.PORT para limitar el acceso.
Una vez que el cliente selecciona la autenticación de nombre de usuario/contraseña durante la negociación, llevará a cabo una subnegociación con el servidor. Esta subnegociación comienza cuando el cliente presenta una solicitud:
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
El campo VER contiene la versión actual de la subnegociación, que es X'01' pero a menudo se considera X'05' ya que es un poco contrario a la intuición. Entonces asyncio-socks-server permite solicitudes con VER X'05' en modo no estricto.
--strict
Para desactivar el compromiso descrito anteriormente, puede especificar la opción --strict
:
asyncio_socks_server --strict