Un serveur proxy SOCKS implémenté avec le puissant framework de concurrence coopérative python asyncio .
Installez avec pip si Python version 3.8.0 ou supérieure est disponible.
pip install asyncio-socks-server
Ou extrayez une image Docker du registre Docker Hub.
docker pull amaindex/asyncio-socks-server
Lorsqu'il est installé avec pip, vous pouvez appeler asyncio-socks-server à partir de la ligne de commande :
asyncio_socks_server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
où:
asyncio_socks_server
: Vous pouvez utiliser python -m asyncio_socks_server en développement.-h
, --help
: Afficher un message d'aide et quitter.-v
, --version
: Afficher le numéro de version du programme et quitter.-H HOST
, --host HOST
: Adresse de l'hôte à écouter (par défaut 0.0.0.0).-P PORT
, --port PORT
: Port à écouter (par défaut 1080).-A METHOD
, --auth METHOD
: Méthode d'authentification (0 par défaut). Valeurs possibles : 0 (pas d'authentification), 2 (authentification par nom d'utilisateur/mot de passe)--access-log
: Afficher le journal d'accès.--debug
: Travaillez en mode débogage.--strict
: travaillez en stricte conformité avec RFC1928 et RFC1929. Si la valeur de METHOD
est 2, c'est-à-dire lorsque l'authentification nom d'utilisateur/mot de passe est spécifiée, vous devez fournir un fichier de configuration contenant les noms d'utilisateur et mots de passe au format json avec l'option --config
. Vous pouvez également lister d'autres options dans le fichier de configuration au lieu de la commande :
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
De plus, toute variable d'environnement nommée commençant par AIOSS_
sera également appliquée à l'option. Le préfixe peut être modifié en spécifiant l'option --env-prefix
, par exemple :
export MY_LISTEN_HOST=127.0.0.1
export MY_LISTEN_PORT=9999
asyncio_socks_server --env-prefix MY_
REMARQUE : L'ordre de chargement des options est : fichier de configuration, variables d'environnement, options de commande. Ce dernier écrasera le premier si les options sont proposées de plusieurs manières.
Alternativement, si vous utilisez l'image docker, vous pouvez lancer le serveur asyncio-socks avec la commande suivante :
docker run amaindex/asyncio-socks-server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
L' host
en mode réseau est recommandé car asyncio-socks-server utilise plusieurs ports de manière dynamique. Si vous souhaitez également fournir un fichier de configuration, il doit être monté manuellement.
docker run
--rm
--net=host
-v /host/path/config.json:/config.json
amaindex/asyncio-socks-server
--config /config.json
Pour diverses raisons, asyncio-socks-server a fait quelques compromis sur les détails d'implémentation des protocoles. Par conséquent, dans les scènes suivantes, le comportement du serveur asyncio-socks sera différent de celui décrit dans les RFC1928 et RFC1929.
Dans la négociation SOCKS5, une requête UDP ASSOCIATE formée comme suit est utilisée pour établir une association au sein du processus de relais UDP afin de gérer les datagrammes UDP :
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
Normalement, les champs DST.ADDR et DST.PORT contiennent l'adresse et le port que le client compte utiliser pour envoyer des datagrammes UDP pour l'association, ou utilisent un numéro de port et une adresse composés uniquement de zéros si le client ne possède pas ces informations. Par conséquent, lorsque le client travaille dans un réseau qui utilise NAT, le DST.ADDR avec uniquement des zéros doit être utilisé pour éviter les erreurs. Mais au cas où certains clients n'auraient pas suivi correctement ce principe, asyncio-socks-server relaie tous les datagrammes UDP qu'il reçoit par défaut au lieu d'utiliser DST.ADDR et DST.PORT pour limiter l'accès.
Une fois que le client a sélectionné l'authentification par nom d'utilisateur/mot de passe lors de la négociation, il mènera une sous-négociation avec le serveur. Cette sous-négociation commence lorsque le client produit une demande :
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
Le champ VER contient la version actuelle de la sous-négociation, qui est X'01' mais souvent considérée comme X'05' car c'est un peu contre-intuitif. Ainsi, asyncio-socks-server autorise les requêtes avec VER X'05' en mode non strict.
--strict
Pour désactiver la compromission décrite ci-dessus, vous pouvez spécifier l'option --strict
:
asyncio_socks_server --strict