Um servidor proxy SOCKS implementado com a poderosa estrutura de simultaneidade cooperativa python asyncio .
Instale com pip se o Python versão 3.8.0 ou superior estiver disponível.
pip install asyncio-socks-server
Ou extraia uma imagem do Docker do registro do Docker Hub.
docker pull amaindex/asyncio-socks-server
Quando instalado com pip, você pode invocar asyncio-socks-server na linha de comando:
asyncio_socks_server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
onde:
asyncio_socks_server
: Você poderia usar python -m asyncio_socks_server no desenvolvimento.-h
, --help
: mostra uma mensagem de ajuda e sai.-v
, --version
: Mostra o número da versão do programa e sai.-H HOST
, --host HOST
: Endereço do host para escutar (padrão 0.0.0.0).-P PORT
, --port PORT
: Porta para escuta (padrão 1080).-A METHOD
, --auth METHOD
: Método de autenticação (padrão 0). Valores possíveis: 0 (sem autenticação), 2 (autenticação de nome de usuário/senha)--access-log
: exibe o log de acesso.--debug
: trabalha no modo de depuração.--strict
: Trabalhe em estrita conformidade com RFC1928 e RFC1929. Se o valor de METHOD
for 2, ou seja, quando a autenticação de nome de usuário/senha for especificada, será necessário fornecer um arquivo de configuração contendo os nomes de usuário e senhas em formato json com a opção --config
. Você também pode listar outras opções no arquivo de configuração em vez do 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
Além disso, qualquer variável de ambiente nomeada começando com AIOSS_
também será aplicada à opção. O prefixo pode ser alterado especificando a opção --env-prefix
, por exemplo:
export MY_LISTEN_HOST=127.0.0.1
export MY_LISTEN_PORT=9999
asyncio_socks_server --env-prefix MY_
NOTA: A ordem de carregamento das opções é: arquivo de configuração, variáveis de ambiente, opções de comando. Este último substituirá o primeiro se as opções forem fornecidas de várias maneiras.
Alternativamente, se você usar a imagem docker, poderá iniciar o asyncio-socks-server com o seguinte 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]
O host
do modo de rede é recomendado, pois o asyncio-socks-server usa múltiplas portas dinamicamente. Se você também quiser fornecer um arquivo de configuração, ele deverá ser montado manualmente.
docker run
--rm
--net=host
-v /host/path/config.json:/config.json
amaindex/asyncio-socks-server
--config /config.json
Por vários motivos, o asyncio-socks-server fez alguns compromissos nos detalhes de implementação dos protocolos. Portanto, nas cenas seguintes, o comportamento do asyncio-socks-server será divergente daquele descrito em RFC1928 e RFC1929.
Na negociação SOCKS5, uma solicitação UDP ASSOCIATE formada da seguinte forma é usada para estabelecer uma associação dentro do processo de retransmissão UDP para lidar com datagramas UDP:
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
Normalmente, os campos DST.ADDR e DST.PORT contêm o endereço e a porta que o cliente espera usar para enviar datagramas UDP para a associação, ou usar um número de porta e endereço com zeros se o cliente não possuir essas informações. Portanto, quando o cliente estiver trabalhando em uma rede que utiliza NAT, deve-se utilizar o DST.ADDR com todos os zeros para evitar erros. Mas caso alguns clientes não sigam este princípio corretamente, o asyncio-socks-server retransmite todos os datagramas UDP que recebe por padrão, em vez de usar DST.ADDR e DST.PORT para limitar o acesso.
Assim que o cliente selecionar a autenticação de nome de usuário/senha durante a negociação, ele conduzirá uma subnegociação com o servidor. Esta subnegociação começa com o cliente produzindo uma solicitação:
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
O campo VER contém a versão atual da subnegociação, que é X'01', mas geralmente considerada como X'05', pois é um pouco contra-intuitivo. Portanto, asyncio-socks-server permite solicitações com VER X'05' em modo não estrito.
--strict
estrita Para desabilitar o comprometimento descrito acima, você pode especificar a opção --strict
:
asyncio_socks_server --strict