--[ 13. Le saviez vous ? La réponse ]------------------------------------ SSH permet de multiplexer plusieurs canaux au travers de sa connexion. Les deux canaux les plus connus étant le relais TCP et le relais SOCKS. La mise en place d'un relais TCP (options -L ou -R) peut-être effectuée lors de la connexion à l'aide de la commande suivante : user at local$ ssh -L 8080:10.0.0.1:80 user at remote Toute connexion locale sur le port 8080 sera redirigée sur le port 80 de la machine 10.0.0.1. Cette IP est accédée depuis le serveur distant. De la même façon, en remplaçant 10.0.0.1 par un nom d'hôte, le nom est alors résolu par le serveur distant et non par la machine locale, ce qui permet par exemple ceci : user at local$ ssh -L 8080:intranet:80 user at remote Une solution alternative est l'utilisation du relais SOCKS intégré dans le client SSH. De cette manière il est possible de se connecter sur l'ensemble des machines distantes sans avoir à les renseigner une à une. L'application cliente devra néanmoins supporter l'utilisation de relais SOCKS. Si ce n'est pas le cas, alors il est fréquent d'utiliser l'encapsuleur tsocks ou socksify de Dante, après avoir spécifié les plages d'adresses concernées et le relais SOCKS dans leur fichier de configuration respectif : user at local$ tsocks wget http://10.0.0.1/... user at local$ tsocks telnet 10.0.0.1 80 ... Dans SSH, ce canal peut-être activé par la commande suivante : user at local$ ssh -D1080 user at remote Le protocole implémenté est SOCKS4 ou SOCKS5, ne permettant donc pas la résolution des noms DNS au travers du proxy SOCKS. De plus, seuls les connexions TCP sont relayées par le proxy SOCKS. Tous ces mécanismes peuvent également être activés dynamiquement à l'aide du caractère d'échappement ~C proposant un interpréteur de commande SSH : user at local$ ~C ssh> help Commands: -L[bind_address:]port:host:hostport Request local forward -R[bind_address:]port:host:hostport Request remote forward -D[bind_address:]port Request dynamic forward -KR[bind_address:]port Cancel remote forward ssh> -D1080 Forwarding port. Il est ainsi possible d'ajouter dynamiquement un relais SOCKS ou TCP. Ces mécanismes de relais TCP sont autorisés par défaut sur les serveurs SSH (par la directive AllowTcpForwarding). Néanmoins l'utilisation de tels relais ne permet pas le relayage de tout type de paquet. Il n'est par exemple pas possible d'envoyer des paquets en mode "RAW" (envoi de SYN, de paquets spoofés). La troisième et dernière solution offerte par SSH est la possibilité de créer un tunnel IP entre les deux machines. Cette solution de dernier recours est néanmoins très contraignante. C'est toutefois la seule solution pour faire transiter tout type de paquet IP, notamment UDP, sans utiliser d'autre logiciel (nc ou socat). L'utilisation de cette fonctionnalité nécessite d'être root sur la machine locale mais également de se connecter en root sur la machine distante. Il est également nécessaire d'ajouter une directive (désactivée par défaut) sur le serveur distant afin d'autoriser l'utilisation du tunnel. Les deux options à activer sur le serveur distant sont les suivantes : PermitTunnel yes # Tunnel autorisé PermitRootLogin yes # Connexion en root La connexion SSH est effectuée avec l'option -w. Ci dessous nous demandons la création de l'interface locale tun0 qui sera relayée sur l'interface tun66 du serveur distant : root at local# ssh -w 0:66 root at remote Last login: Thu Jul 29 10:55:31 2010 from 10.0.0.1 root at remote# Il ne reste plus qu'a affecter une adresse IP sur les deux machines : root at local# ifconfig tun0 10.254.254.253 pointopoint 10.254.254.254 root at remote# ifconfig tun66 10.254.254.254 10.254.254.253 L'accès aux machines du réseau distant pourra ainsi être effectué au travers d'une configuration réseau classique (proxy ARP ou NAT). Olivier Dembour