Considérons que votre administrateur de pare-feu autorise les connexions TCP transparentes vers un port quelconque sur un serveur de l’autre côté du pare-feu (que ce soit le port du ssh normal, le 22, un autre port de destination, tel que le port http, le 80, ou autre), ou que vous vous débrouillez d’une façon ou d’une autre pour qu’un port quelconque d’un côté du pare-feu soit redirigé vers un port de l’autre côté (en utilisant httptunnel, mailtunnel, un tunnel sur le telnet, ou autre).
Vous pouvez alors lancer un sshd sur le port côté serveur, et vous y connecter avec un ssh sur le port côté client. Des deux côtés de la connexion ssh vous lancez des émulateurs d’IP ( pppd), et là vous avez votre VPN, réseau privé virtuel, qui évite les restrictions stupides du pare-feu, avec un bonus en plus : la confidentialité grâce au cryptage (faites attention, l’administrateur du pare-feu connaît tout de même l’autre bout du tunnel, et toute information d’authentification quelle qu’elle soit que vous pouvez avoir envoyée avant de lancer le ssh).
Exactement la même technologie peut être utilisée pour construire un VPN, réseau privé virtuel, qui permet de regrouper de façon sécurisée des sites physiques en un seul réseau logique sans sacrifier la sécurité au niveau du réseau de transport entre les sites.
Ci-dessous se trouve un exemple de script que vous pouvez adapter à vos besoins. Il utilise le système de rangée de zsh, mais vous pouvez l’adapter facilement à votre shell favori. Utilisez l’option -p pour que ssh essaie un autre port que le port 22 (mais à ce moment-là, veillez à bien lancer sshd sur le même port).
Notez que le script suppose que ssh peut s’ouvrir sans que vous ayez à taper interactivement votre mot de passe (en effet, son tty de contrôle sera connecté à pppd, alors s'il vous demande un mot de passe, c’est raté). Ceci peut se faire soit avec les clefs ssh dans votre
˜/.ssh/authorized_keys
pour lesquelles un mot de passe n'est pas nécessaire, ou que l'on peut débloquer en utilisant
ssh-agent ou ssh-askpass. Regardez votre documentation sur ssh. En fait vous pourriez aussi utiliser un script de chat pour entrer votre mot de passe, mais ce n’est assurément pas la chose à faire.
Si vous n’êtes pas root ou simplement si vous voulez protéger le réseau de votre client des connexions sortantes, vous pouvez utiliser slirp au lieu de pppd comme émulateur PPP du serveur. Il n’y a qu’à décommenter la ligne appropriée.
#!/bin/zsh -f SERVER_ACCOUNT=root@server.fqdn.tld SERVER_PPPD="pppd ipcp-accept-local ipcp-accept-remote" #SERVER_PPPD="pppd" ### Ceci suffit normalement si c’est dans /usr/sbin/ #SERVER_PPPD="/home/joekluser/bin/slirp ppp" CLIENT_PPPD=( pppd silent 10.0.2.15:10.0.2.2 ### Si vous voulez tester décommentez les lignes suivantes: # updetach debug ### Une autre option potentiellement utile (allez voir la section sur le routage) : # defaultroute ) $CLIENT_PPPD pty "ssh -t $SERVER_ACCOUNT $SERVER_PPPD"
Notez que les options par défaut de votre /etc/ppp/options
ou ˜/.slirprc
peuvent casser ce script, enlevez donc toute option non désirée.
Notez également que 10.0.2.2
est le paramétrage par défaut pour slirp, ce qui peut ne pas fonctionner avec votre installation particulière. En tout cas, vous devriez de préférence utiliser une adresse dans l’une des catégories réservées par la RFC-1918 pour les réseaux privés :
10.0.0.0/8
,
172.16.0.0/12
ou 192.168.0.0/16
.
Il se pourrait que le réseau local protégé par pare-feu utilise certaines d’entre elles et il est de votre responsabilité d’éviter les conflits. Pour une plus grande personnalisation, lisez la documentation appropriée.
Si le pppd de votre client est vieux ou non-linux (par exemple BSD) et n’a pas d’option pty, utilisez :
cotty -d -- $CLIENT_PPPD -- ssh -t $SERVER_ACCOUNT $SERVER_PPPDPièges : ne mettez pas les commandes données à cotty entre guillemets, car elles s’exécutent exec()telles quel, et n’oubliez pas de spécifier le chemin complet pour le pppd du serveur s’il n’est pas dans le chemin standard installé par ssh.
On laisse au lecteur la reconnexion automatique (conseil : l’option nodetach de pppd pourrait être utile pour ça).