Les HOWTO Linux...
Page suivante - Page précédente - Table des matières
4. Le client
Nous nous consacrons maintenant au client. En pratique, lorsqu'elle est utilisé pour permettre l'accès à un réseau distant, cette machine peut facilement servir de serveur Samba (réseau Windows), DHCP, ou même web interne. L'aspect important dont il faut se souvenir est que cette machine doit être aussi sécurisée que possible, étant donnée qu'elle fait fonctionner tout votre réseau distant.
4.1 Le noyau
Commençons par le commencement. Vous devez disposer de ppp dans votre noyau. Si vous souhaitez autoriser plusieurs machines à utiliser le tunnel, il vous faut aussi les services de firewall et de transmission (forwarding). Si le client consiste en une seule machine, ppp est suffisant.
4.2 Réaliser la liaison
La liaison est créée en lançant pppd
à travers un pseudo terminal
lui-même créé par pty-redir
et connecté à ssh
. C'est
ce que réalise la séquence de commande suivante.
# /usr/sbin/pty-redir /usr/bin/ssh -t -e none -o 'Batchmode yes' -c blowfish -i /root/.ssh/identity.vpn -l joe> /tmp/vpn-device # sleep 10 # /usr/sbin/pppd `cat /tmp/vpn-device` # sleep 15 # /sbin/route add -net 172.16.0.0 gw vpn-internal.mycompany.com netmask 255.240.0.0 # /sbin/route add -net 192.168.0.0 gw vpn-internal.mycompany.com netmask 255.255.0.0
Clairement, on lance ssh, et on redirige ses entrées et sorties vers pppd. Les options passées à ssh le configurent pour s'exécuter sans caractère d'échappement (-e), en utilisant l'algorithme de chiffrement blowfish (-i), en mode terminal (-l), avec les options 'Batchmode yes' (-o). Les commandes sleep sont utilisées pour espacer les exécutions des commandes pour que chacune puisse compléter son initialisation avant que la suivante ne soit lancée.
4.3 Faire des scripts
Bien sûr, vous ne souhaitez pas avoir à taper ces commandes à chaque fois que vous souhaitez voir le tunnel fonctionner. J'ai écrit un ensemble de scripts bash qui gardent le tunnel en état de fonctionnement. Vous pouvez télécharger le package à partir d'ici. Il suffit de les télécharger et de les décompresser dans /usr/local/vpn. Vous trouverez trois fichiers à l'intérieur:
- vpnd: le script qui contrôle la connexion du tunnel.
- check-vpnd: un script qui sera lancé par le cron pour vérifier que le VPN fonctionne toujours.
- pty-redir: un petit exécutable requis pour l'initiation du tunnel.
Vous aurez besoin d'éditer le script vpnd
pour assigner quelques
valeurs telles que le nom d'utilisateur du client et le nom du serveur.
Vous pourrez aussi avoir besoin de modifier la section starttunnel du
script pour spécifier le réseau utilisé.
Vous trouverez ci-dessous une copie du script pour le plaisir des yeux.
Remarquez que vous pouvez mettre le script dans un répertoire différent,
il suffit de changer la variable VPN_DIR.
#! /bin/bash # # vpnd: Monitor the tunnel, bring it up and down as necessary # USERNAME=vpn-username IDENTITY=/root/.ssh/identity.vpn VPN_DIR=/usr/local/vpn LOCK_DIR=/var/run VPN_EXTERNAL=vpn.mycompany.com VPN_INTERNAL=vpn-internal.mycompany.com PTY_REDIR=${VPN_DIR}/pty-redir SSH=${VPN_DIR}/${VPN_EXTERNAL} PPPD=/usr/sbin/pppd ROUTE=/sbin/route CRYPTO=blowfish PPP_OPTIONS="noipdefault ipcp-accept-local ipcp-accept-remote local noauth nocrtscts lock nodefaultroute" ORIG_SSH=/usr/bin/ssh starttunnel () { $PTY_REDIR $SSH -t -e none -o 'Batchmode yes' -c $CRYPTO -i $IDENTITY -l $USERNAME> /tmp/vpn-device sleep 15 $PPPD `cat /tmp/vpn-device` $PPP_OPTIONS sleep 15 # Add routes (modify these lines as necessary) /sbin/route add -net 10.0.0.0 gw $VPN_INTERNAL netmask 255.0.0.0 /sbin/route add -net 172.16.0.0 gw $VPN_INTERNAL netmask 255.240.0.0 /sbin/route add -net 192.168.0.0 gw $VPN_INTERNAL netmask 255.255.0.0 } stoptunnel () { kill `ps ax | grep $SSH | grep -v grep | awk '{print $1}'` } resettunnel () { echo "reseting tunnel." date>> ${VPN_DIR}/restart.log eval stoptunnel sleep 5 eval starttunnel } checktunnel () { ping -c 4 $VPN_EXTERNAL 2>/dev/null 1>/dev/null if [ $? -eq 0 ]; then ping -c 4 $VPN_INTERNAL 2>/dev/null 1>/dev/null if [ $? -ne 0 ]; then eval resettunnel fi fi } settraps () { trap "eval stoptunnel; exit 0" INT TERM trap "eval resettunnel" HUP trap "eval checktunnel" USR1 } runchecks () { if [ -f ${LOCK_DIR}/tunnel.pid ]; then OLD_PID=`cat ${LOCK_DIR}/vpnd.pid` if [ -d /proc/${OLD_PID} ]; then echo "vpnd is already running on process ${OLD_PID}." exit 1 else echo "removing stale pid file." rm -rf ${LOCK_DIR}/vpnd.pid echo $$> ${LOCK_DIR}/vpnd.pid echo "checking tunnel state." eval checktunnel fi else echo $$> ${LOCK_DIR}/vpnd.pid eval starttunnel fi } case $1 in check) if [ -d /proc/`cat ${LOCK_DIR}/vpnd.pid` ]; then kill -USR1 `cat ${LOCK_DIR}/vpnd.pid` exit 0 else echo "vpnd is not running." exit 1 fi ;; reset) if [ -d /proc/`cat ${LOCK_DIR}/vpnd.pid` ]; then kill -HUP `cat ${LOCK_DIR}/vpnd.pid` exit 0 else echo "vpnd is not running." exit 1 fi ;; --help | -h) echo "Usage: vpnd [ check | reset ]" echo "Options:" echo " check Sends running vpnd a USR1 signal, telling it to check" echo " the tunnel state, and restart if neccesary." echo " reset Sends running vpnd a HUP signal, telling it to reset" echo " it's tunnel connection." ;; esac ln -sf $ORIG_SSH $SSH settraps runchecks while true; do i=0 while [ $i -lt 600 ]; do i=((i+1)) sleep 1 done eval checktunnel done
4.4 LRP - Projet de Routeur Linux (Linux Router Project)
J'ai lancé cette installation sur un Pentium 90 exécutant la distribution LRP de Linux. LRP est une distribution de Linux qui tient et se charge sur une seule disquette. Vous en apprendrez plus sur http://www.linuxrouter.org/. Vous pouvez télécharger ici mon package LRP pour le client VPN. Vous aurez aussi besoin des packages ppp et ssh du sîte LRP.
Page suivante - Page précédente - Table des matières