vendredi 10 juin 2011

Proxychains ou l'art de proxifier

S'il vous est arrivé de vous retrouver dans l'impossibilité de sortir sur certains ports mais que vous avez su mettre en place un proxy socks ou http, il n'est pas forcément aisé de configurer les différents outils que vous utilisez.
Ce fut mon cas par exemple avec git. En effet, il est possible avec git d'utiliser un proxy socks, mais cela nécessite de créer un script basé sur netcat et d'affecter à la variable d'environnement GIT_PROXY_COMMAND le chemin associé à ce script. Bref, quelles que soient les commandes que vous utilisez vous aurez ou non la possibilité de configurer l'utilisation d'un proxy en modifiant un fichier de configuration, une variable de d'environnement etc...
L'intérêt de proxychains est que la configuration ne se fait qu'une seule fois, dans son propre fichier de configuration. Ensuite vous utilisez la syntaxe proxychains <command> <args> et votre commande utilisera le proxy spécifié dans le fichier de configuration de proxychains !

Voyons tout de suite un exemple :

git pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git master
git.kernel.org[0: 199.6.1.168]: errno=Connection timed out
git.kernel.org[0: 130.239.17.8]: errno=Connection timed out
git.kernel.org[0: 2001:6b0:e:4017:1994:313:1:2]: errno=Network is unreachable
git.kernel.org[0: 2001:500:60:10:1994:313:1:2]: errno=Network is unreachable
fatal: unable to connect a socket (Network is unreachable)

Maintenant en utilisant un proxy socks.

- Je mets donc en place mon proxy
ssh -fND localhost:10123 my_proxy

- J'installe proxychains et mets en place ma configuration
sudo apt-get install proxychains

- Voici mon fichier de configuration /etc/proxychains
strict_chain

# Quiet mode (no output from library)
quiet_mode

# Proxy DNS requests - no leak for DNS data
#proxy_dns

# Some timeouts in milliseconds
tcp_read_time_out 15000
tcp_connect_time_out 8000

[ProxyList]
socks5 127.0.0.1 10123

- Il ne reste plus qu'à tester proxychains pour proxifier le flux de ma commande git. Pour ce test j'ai commenté l'instruction quiet_mode dans le fichier de configuration de proxychains
proxychains git pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git master
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-127.0.0.1:10123-<><>-130.239.17.8:9418-<><>-OK
From git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
* branch master -> FETCH_HEAD
Already up-to-date.

Comme on peux le voir on passe par le proxy socks local pour atteindre git.eu.kernel.org(130.239.17.8) sur le port git (9418)

Pour ceux qui veulent en savoir plus, le fonctionnement de proxychains est assez simple ainsi que son code (~ 1000 lignes). Il affecte à la variable d'environnement LD_PRELOAD le chemin de sa bibliothèque dynamique (libproxychains.so) surchargeant les fonctions réseaux de base que sont gethostbyaddr, getnameinfo, gethostbyname, connect


Lire la suite...