                               VPN HOWTO

Matthew D. Wilson, [1]matthew@shinythings.com Traduction franaise de
Nicolas Prigent [2]prigentn@thmulti.com

   v 1.0, Dec 1999

   ------------------------------------------------------------------

   Ce HOWTO dcrit la manire de mettre en place un Rseau Priv
   Virtuel (Virtual Private Network) avec Linux.

   ------------------------------------------------------------------

1. Introduction

1.1 Pourquoi ai-je crit ce HOWTO

   Je travaille chez Real Network, et nous avions besoin d'un VPN.
   C'tait mon premier vritable projet, et j'en ai rellement appris
   plus au sujet de Linux grce  cela qu'avec n'importe quelle autre
   tche. Je me suis servi de l'exprience ainsi acquise pour rdiger
   ce document, pour partager avec d'autres ce que j'avais appris,
   pour qu'ils puissent eux aussi raliser de super trucs avec Linux.

1.2 Remerciements

   Je voudrais tout d'abord et surtout remercier mon pouse Julie,
   sans qui je ne serais pas o j'en suis actuellement. Je voudrais
   aussi remercier Arpad Magosanyi, l'auteur du premier VPN
   mini-howto et de pty-redir, l'utilitaire qui a rendu tout cela
   possible. Jerry, Rod, Glen, Mark V., Mark W., et David, vous tes
   trop fort les mecs. Merci pour votre aide.

1.3 Format de ce document

   Ce document est divis en 5 sections.

   Section 1: Introduction

           Cette section

   Section 2: Thorie

           La thorie  la base des VPNs. Qu'est-ce qu'un VPN, et
           comment fonctionne-t-il. Lisez cette partie si vous tes
           nophyte en matire de VPN.

   Section 3: Serveur

           Cette section dcrit la mise en place d'un serveur de VPN.

   Section 4: Client

           Cette section dcrit la mise en place d'un client de VPN.

   Section 5: Implmentation

           Une implmentation de VPN dcrite pas  pas.

   Section 6: Addenda

           D'autres lments d'information qui pourraient vous tre
           utiles.

1.4 Copyright et Avertissements

   Copyright (c) Matthew Wilson. Ce document ne peut tre distribu
   qu'en accord avec les termes et les conditions de la licence LDP
   que vous trouverez a l'adresse
   [3]http://www.linuxdoc.org/COPYRIGHT.html, except le fait que ce
   document ne doit pas tre distribu sous une forme altre sans le
   consentement de son auteur.

   Ni l'auteur, ni le traducteur n'assument une quelconque
   responsabilit pour quoi que ce soit pouvant advenir suite a
   l'utilisation de ce document, ni ne fournissent une quelconque
   garantie, implicite ou explicite. Si vous cassez quelque chose,
   nous ne sommes en rien responsable. Souvenez vous que ce que vous
   allez faire ici pourrait crer d'normes trous de scurit sur
   votre rseau. Vous aurez t prvenus.

1.5 Histoire de ce document

   Le VPN mini-HOWTO original a t crit par [4]Arpad Magosanyi en
   1997. Il m'a depuis autoris  reprendre le document, et 
   l'tendre jusqu' en faire un HOWTO complet. Rien de ceci n'aurait
   t possible sans le document original. Merci encore Arpad. :)

   La version 1.0 de ce HOWTO a t termine le 10 dcembre 1999.

1.6 Documents associs

     * [5]Networking Overview HOWTO
     * [6]Networking HOWTO
     * [7]VPN-Masquerade HOWTO

2. Thorie

2.1 Qu'est-ce qu'un VPN?

   VPN est l'acronyme de Virtual Private Network, ou rseau priv
   virtuel. Un VPN utilise l'Internet comme mcanisme de transport,
   en maintenant la scurit des donnes sur le VPN.

  Mais c'est quoi, en vrai, un VPN?

   Et bien il y a plusieurs rponses  cette question. Cela dpends
   vraiment de l'apparence du rseau. En gnral, on dispose d'un
   rseau principal unique, avec des noeuds distants qui utilisent le
   VPN pour gagner un accs complet au rseau central. Les noeuds
   distants sont gnralement des bureaux loigns, ou des employs
   travaillant  partir de chez eux. Il est aussi possible de relier
   deux rseaux plus petits (ou mme plus grands!) pour former un
   seul rseau encore plus grand.

  Alors, a marche comment?

   Pour simplifier, pour raliser un VPN, vous crez un tunnel
   scuris entre deux rseaux et l'utilisez pour router les
   datagrammes IP. Au cas ou vous seriez dj perdu, vous devriez
   lire [8]Le Linux Networking Overview HOWTO pour vous informer au
   sujet des rseaux sous Linux.

   Prire de ne pas m'en vouloir, mes schmas ASCII mriterait un peu
   plus de travail.

                                  \          \
                  ---------       /          /      ---------
    Rseau ______| Routeur |______\ Internet \_____| Routeur |______ Rseau
    Distant      | Client  |      /          /     | Serveur |       Priv
                  ---------       \          \      ---------
                                  /          /


                          Routeur Client
                ----------------------------------------------------
               |   /->    10.0.0.0/255.0.0.0   \                    |
   Rseau      |  |-->  172.16.0.0/255.240.0.0  |--> Tunnel >---\   |
   Distant >---|--|--> 192.168.0.0/255.255.0.0 /                 |--|----> Internet
  192.168.12.0 |  |                                              |  |
               |   \-----> 0.0.0.0/0.0.0.0 --> Masquarade IP >--/   |
                ----------------------------------------------------


                         Routeur Serveur
              ----------------------------------------------------
             |                   /->    10.0.0.0/255.0.0.0    \   |
             |   /--> Tunnel >--|-->  172.16.0.0/255.240.0.0   |--|----> Rseau
 Internet >--|--|                \--> 192.168.0.0/255.255.0.0 /   |      Priv
             |  |                                                 |     172.16.0.0/12
             |   \-----> 0.0.0.0/0.0.0.0 -----> /dev/null         |    192.168.0.0/16
              ----------------------------------------------------

   Le diagramme ci-dessus montre comment le rseau peut tre mis en
   place. Si vous ne savez pas ce qu'est la masquarade IP, vous ne
   devriez probablement pas tre ici. Allez lire [9]Le Linux
   Networking Overview HOWTO et revenez une fois inform.

   Le routeur client est une machine Linux tenant le rle de
   passerelle/firewall pour le rseau distant. Comme vous pouvez le
   voir, le rseau distant utilise le rseau local 192.168.12.0. Pour
   plus de simplicit dans le diagramme, j'ai laiss les informations
   de routage sur les routeurs. L'ide de base est de router le
   trafic destin aux rseaux privs (10.0.0.0, 172.16.0.0, et
   192.168.0.0) via le tunnel. L'installation montre ici est une
   manire de le faire. C'est  dire qu'alors que le rseau distant
   peut voir le rseau priv, le rseau priv ne peut pas
   ncessairement voir le rseau distant. Pour que ceci arrive, il
   faut spcifier que les routes sont bidirectionnelles.

   Vous devriez aussi remarquer sur le schma que tout le trafic
   sortant du routeur client apparat comme en provenant, c'est 
   dire qu'il porte toujours la mme adresse IP. Vous pouvez router
   les valeurs vritables de l'intrieur de votre rseau, mais cela
   induit une grande diversit de problmes de scurit.

2.2 SSH et PPP

   Le systme que je dcris pour implmenter un VPN utilise SSH et
   PPP. Schmatiquement, je me sers de ssh pour crer une connexion
   protge par tunnel, puis utilise pppd pour y dmarrer le trafic
   TCP/IP. C'est ainsi que le tunnel est mis en place.

   Le vritable truc pour faire fonctionner ssh et pppd ensemble
   correctement est l'utilitaire crit par Arpad Magosanyi qui permet
   la redirection de l'entre et de la sortie standard vers un pseudo
   tty. Ceci permets  pppd de parler au travers de ssh comme s'il
   s'agissait d'une liaison srie. Du ct du serveur, pppd est lanc
   comme interpreteur de commande utilisateur dans la session ssh,
   compltant le lien. Aprs cela, tout ce qu'il reste a faire est de
   raliser le routage.

2.3 Systmes VPN alternatifs

   Il y a bien sur d'autres moyens de mettre en place un VPN, dont
   voici quelques exemples.

  PPTP

   PPTP est un protocole Microsoft pour les VPN. Il est support sous
   Linux, mais est connu pour avoir de nombreux problmes de
   scurit. Je ne dcris pas ici la manire de l'utiliser, tant
   donn que ce thme est couvert par [10]Linux VPN Masquerade HOWTO.

  IPSec

   IPSec est un ensemble de protocoles diffrents de SSH.
   Franchement, je n'en connais pas normment  son sujet. De fait,
   si quelqu'un veut m'aider d'une description, je lui en serais trs
   reconnaissant. Encore une fois, je ne dcris pas comment
   l'utiliser tant donn que le [11]Linux VPN Masquerade HOWTO
   couvre le sujet.

  CIPE

   CIPE est un systme de chiffrement au niveau noyau probablement
   mieux adapt aux dispositifs d'entreprise. Vous pourrez en savoir
   plus sur [12]la page de CIPE. J'envisage de m'y intresser plus
   srieusement, et aurais donc peut tre plus d'informations  son
   sujet bientt.

3. Le serveur

   Cette section explique comment mettre en place l'aspect serveur
   des choses. J'ai plac cette section en premier, tant donn que
   sans serveur, un client est assez inutile.

3.1 La scurit - garder les gens dehors

   La scurit est un aspect trs important des VPNs. C'est pour a
   que vous tes en train d'en monter un, non? Vous devez garder ces
   quelques choses  l'esprit en mettant en place votre serveur.

  Prparez vos dmons

   Etant donn que ce serveur va tre des deux cts du firewall et
   qu'il va tre mis en place pour transmettre le trafic sur votre
   rseau, c'est une bonne ide de scuriser la machine autant que
   possible. Vous pourrez en apprendre plus sur la scurit Linux
   dans [13]Linux Security HOWTO. Pour ma part, j'ai tu tous les
   services, except sshd et un serveur web Roxen. J'utilise ce
   dernier pour tlcharger quelques fichiers (mes scripts, etc.)
   pour permettre  d'autres machines d'accder au VPN. Je n'utilise
   pas de serveur FTP tant donn qu'il est plus dur d'en scuriser
   un que de rendre quelques fichiers disponibles sur un serveur web.
   De plus, j'ai seulement besoin de pouvoir rcuprer des fichiers.
   Si vous souhaitez rellement excuter des serveurs diffrents sur
   votre passerelle, vous pourriez vouloir envisager de restreindre
   leur accs aux machines situes sur votre rseau priv.

  Ne pas autoriser de mots de passe

   Effectivement, cela semble assez stupide, mais a a retenu votre
   attention non? Non, vous n'utilisez pas de mots de passe, vous les
   dsactivez compltement. Toute l'authentification ncessaire sur
   cette machine devrait tre faite via le systme d'authentification
    cl publique de ssh. Ainsi, seul les entits dotes de cls
   peuvent entrer, et il est pratiquement impossible de se rappeler
   d'une cl binaire de 530 caractres.

   Alors, comment faites-vous a? Il faut diter le fichier
   /etc/passwd. Le second champ contient soit le rsum
   cryptographique (hash) du mot de passe, ou un 'x' prvenant le
   systme d'authentification qu'il faut regarder dans le fichier
   /etc/shadow. Vous devez changer ce champ en '*'. Ainsi le systme
   d'authentification est inform qu'il n'y a pas de mot de passe, et
   qu'aucun ne devrait tre autoris.

   Voila  quoi ressemble un fichier /etc/passwd classique:

 ...
 nobody:x:65534:100:nobody:/dev/null:
 mwilson:x:1000:100:Matthew Wilson,,,:/home/mwilson:/bin/bash
 joe:*:504:101:Joe Mode (home),,,:/home/vpn-users:/usr/sbin/pppd
 bill:*:504:101:Bill Smith (home),,,:/home/vpn-users:/usr/sbin/pppd
 frank:*:504:101:Frank Jones (home),,,:/home/vpn-users:/usr/sbin/pppd
 ...

   Remarquez que j'ai fait plus qu'diter simplement le second champ.
   J'en dirais plus sur les autres champs par la suite.

3.2 Accs des utilisateur - les laisser rentrer

   L'accs des utilisateurs est ralis via le schma
   d'authentification de ssh. Comme je l'ai indiqu prcdemment,
   c'est ainsi que les utilisateurs peuvent accder au systme, tout
   en maintenant un haut niveau de scurit. Si vous n'tes pas
   familier de ssh, jetez un oeuil  [14]http://www.ssh.org/
   Remarquez que j'utilise la version 1 de ssh, pas la version 2. Il
   y a une grande diffrence, particulirement sur le fait que la
   version 1 est libre, contrairement  la version 2.

  Configurer sshd

   Vous aurez besoin de configurer sshd. Les options suivantes
   devraient tre prsentes. L'ide est de dsactiver
   l'authentification par mot de passe, et les authentifications par
   rhosts. Les options suivantes devraient tre prsentes dans votre
   fichier /etc/sshd_config.

 PermitRootLogin yes
 IgnoreRhosts yes
 StrictModes yes
 QuietMode no
 CheckMail no
 IdleTimeout 3d
 X11Forwarding no
 PrintMotd no
 KeepAlive yes
 RhostsAuthentication no
 RhostsRSAAuthentication no
 RSAAuthentication yes
 PasswordAuthentication no
 PermitEmptyPasswords no
 UseLogin no

3.3 Restreindre les possibilits des utilisateurs

   Maintenant que vous maintenez les mchants  l'extrieur et ne
   laissez entrer que les gentils, vous pourriez avoir besoin de vous
   assurer que ces derniers se comportent correctement. La manire la
   plus simple de le faire est de ne rien les laisser faire d'autre
   que de lancer pppd. Ceci peut tre, ou non, ncessaire. J'ai
   restreins les possibilits des utilisateurs parce que le systme
   que je maintiens est ddi au VPN, et que les utilisateurs n'ont
   aucune raison de faire quoique ce soir d'autre dessus.

  sudo ou pas sudo

   Il existe un petit programme propret appel sudo qui permet 
   l'administrateur d'un systme Unix d'autoriser  certains
   utilisateurs la possibilit de lancer certains programmes en tant
   que root. C'est ici certainement le cas, tant donn que pppd doit
   tre lanc ainsi. Vous devrez utiliser cette mthode si vous
   souhaitez autoriser les accs ligne de commande aux utilisateurs.
   Rfrez-vous  la page man de sudo pour savoir comment mettre sudo
   en place. Utiliser sudo est prfrable sur les systmes
   multi-usage qui hbergent gnralement un faible nombre
   d'utilisateurs de confiance.

   Si vous dsirez ne pas autoriser les utilisateurs  disposer d'un
   accs par ligne de commande, le meilleur moyen de le faire est de
   faire que leur shell soit pppd. Ceci se fait dans le fichier
   /etc/passwd. Vous pouvez voir [15]ci-dessous que c'est ce que j'ai
   fait pour les trois derniers utilisateurs. Le dernier champ du
   fichier /etc/passwd est le shell de l'utilisateur. Vous n'avez pas
   besoin de faire quoique ce soit de spcial  pppd pour le faire
   fonctionner. Il est excut en tant que root lorsque l'utilisateur
   se connecte. C'est certainement la mise en place la plus simple
   possible, ainsi que la plus sre. Elle est idale pour les
   systmes industriels et  grande chelle. J'ai dcris exactement
   tout ce qu'il faut faire plus loin dans ce document. Vous pouvez
   [16]y aller directement si vous le souhaitez.

3.4 Le rseau

   Maintenant que vos utilisateurs ont accs au systme, nous devons
   nous assurer qu'ils ont accs au rseau. Pour ce faire, nous
   utilisons les rgles du noyau Linux relatives au firewall et les
   tables de routage. En nous servant des commandes route et ipfwadm,
   nous pouvons configurer le noyau pour grer le trafic rseau de
   manire correcte. Pour plus d'information sur ipfwadm, ipchains et
   route, rfrez vous au [17]Linux Networking HOWTO.

  Le noyau

   Pour que cela fonctionne, votre noyau doit tre configur
   correctement. Si vous ne savez pas comment crer votre propre
   noyau, vous devriez lire le [18]Kernel HOWTO. Vous devez vous
   assurer que les options suivantes sont actives, en plus des
   options rseaux de base. J'utilise un noyau 2.0.38 sur mon
   systme.

   Pour les noyaux 2.0:

     * CONFIG_FIREWALL
     * CONFIG_IP_FORWARD
     * CONFIG_IP_FIREWALL
     * CONFIG_IP_ROUTER
     * CONFIG_IP_MASQUERADE (optionnel)
     * CONFIG_IP_MASQUERADE_ICMP (optionnel)
     * CONFIG_PPP

   Pour les noyaux 2.2:

     * CONFIG_FIREWALL
     * CONFIG_IP_ADVANCED_ROUTER
     * CONFIG_IP_FIREWALL
     * CONFIG_IP_ROUTER
     * CONFIG_IP_MASQUERADE (optionnel)
     * CONFIG_IP_MASQUERADE_ICMP (optionnel)
     * CONFIG_PPP

  Rgles de filtrage

   Tout d'abord, nous devons crire des rgles de filtrage de
   firewall qui permettent aux utilisateurs d'accder  nos rseaux
   internes, tout en leur interdisant d'accder au rseau externe.
   Cela peut sembler trange, mais envisagez le sous cet angle: Ils
   ont dj accs  l'Internet, alors pourquoi les laisser utiliser
   le tunnel pour y accder? Cela gche  la fois la bande passante
   et le processeur.

   Les rgles de filtrage utilises dpendent du rseau interne
   utilis. En gros, elle disent: "Autoriser le trafic venant de nos
   VPNs et destin  nos rseaux internes". Comment allons nous
   faire? Comme toujours, a dpends. Si vous utilisez un noyau 2.0,
   vous devez vous servir d'un outil appel ipfwadm, alors que si
   vous utilisez un noyau 2.0, vous utiliserez ipchains.

   Pour mettre en place les rgles avec ipfwadm, lancez le avec les
   options suivantes:

 # /sbin/ipchains -F forward
 # /sbin/ipchains -P forward DENY
 # /sbin/ipchains -A forward -j ACCEPT -s 192.168.13.0/24 -d 172.16.0.0/12

   Pour les utilisateurs de noyau 2.2, se rfrer  [19]ceci.

  Routage

   Dsormais, nos utilisateurs sont autoriss  accder  nos
   rseaux, et nous devons dire au noyau o envoyer les paquets. Sur
   mon systme, je dispose de deux ethernets : L'un d'entre eux est
   reli au rseau externe, l'autre au rseau interne. Ceci aide  la
   scurisation, car le trafic extrieur est masqu par notre
   passerelle, et n'importe quel trafic entrant est filtr et rout
   par notre Cisco. Pour la plupart des dispositifs, le routage
   devrait tre une chose simple.

   Nous routons l'intgralit du trafic destin au rseaux privs
   vers l'interface connecte au rseau interne, et le reste du
   trafic vers l'interface externe. Les commandes de routage
   spcifiques dpendent des rseaux internes que vous utilisez.
   Voici un exemple de ce  quoi elles pourraient ressembler. Ces
   lignes sont bien sr ajoutes  vos rgles de routages habituelles
   pour vos rseaux locaux. Je doute que vous utilisiez les trois
   groupes d'adresses prives.

 En supposant que 172.16.254.254 est notre passerelle interne:

 # /sbin/route add -net 10.0.0.0 netmask 255.0.0.0 gw 172.16.254.254 dev eth1
 # /sbin/route add -net 172.16.0.0 netmask 255.240.0.0 gw 172.16.254.254 dev eth1
 # /sbin/route add -net 192.168.0.0 netmask 255.255.0.0 gw 172.16.254.254 dev eth1

   Encore une chose sur le routage. Si vous utilisez du routage
   bidirectionnel, vous aurez alors besoin de raliser une chose en
   plus. Il vous faudra mettre en place les routes revenant vers le
   client. La manire la plus simple de le faire est de lancer un
   cron chaque minute qui va assigner les valeurs des routes. Ce
   n'est pas trs grave si le client n'est pas connect, route va
   simplement cracher une erreur (que vous aurez judicieusement
   redirig vers /dev/null).

4. Le client

   Nous nous consacrons maintenant au client. En pratique,
   lorsqu'elle est utilis pour permettre l'accs  un rseau
   distant, cette machine peut facilement servir de serveur Samba
   (rseau Windows), DHCP, ou mme web interne. L'aspect important
   dont il faut se souvenir est que cette machine doit tre aussi
   scurise que possible, tant donne qu'elle fait fonctionner tout
   votre rseau distant.

4.1 Le noyau

   Commenons 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 Raliser la liaison

   La liaison est cre en lanant pppd  travers un pseudo terminal
   lui-mme cr par pty-redir et connect  ssh. C'est ce que
   ralise la squence 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 entres et sorties
   vers pppd. Les options passes  ssh le configurent pour
   s'excuter sans caractre 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
   utilises pour espacer les excutions des commandes pour que
   chacune puisse complter son initialisation avant que la suivante
   ne soit lance.

4.3 Faire des scripts

   Bien sr, 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 tlcharger le package  partir
   [20]d'ici. Il suffit de les tlcharger et de les dcompresser
   dans /usr/local/vpn. Vous trouverez trois fichiers  l'intrieur:

     * vpnd: le script qui contrle la connexion du tunnel.
     * check-vpnd: un script qui sera lanc par le cron pour vrifier
       que le VPN fonctionne toujours.
     * pty-redir: un petit excutable 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 spcifier le rseau utilis. Vous
   trouverez ci-dessous une copie du script pour le plaisir des yeux.
   Remarquez que vous pouvez mettre le script dans un rpertoire
   diffrent, 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 excutant 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 [21]http://www.linuxrouter.org/. Vous pouvez tlcharger
   [22]ici mon package LRP pour le client VPN. Vous aurez aussi
   besoin des packages ppp et ssh du ste LRP.

5. Implmentation

   Dans cette section, j'explique pas  pas comment mettre en place
   votre systme VPN. Je commencerais par le serveur, et poursuivrais
   avec le client. Pour les besoins de l'exemple, j'inventerais une
   situation qui ncessitera diffrentes mise en place de VPN.

5.1 Organisation

   Imaginons que nous ayons une entreprise, appele
   monentreprise.com. Au sige, nous utilisons l'adresse rseau
   rserve 192.168.0.0, et sparons le rseau de classe B en 256
   rseaux de classe C pour permettre le routage. Nous venons de
   mettre en place deux petits bureaux distants, et souhaitons les
   ajouter  notre rseau. Nous souhaitons aussi permettre aux
   employs travaillant chez eux d'utiliser leurs connexions cble ou
   DSL plutt que de leur faire utiliser une communication directe
   par modem. Pour commencer, nous devons organiser quelques peu les
   choses.

   J'ai dcid que je voulais donner  chaque bureau distant une
   plage d'adresse de classe C pour leur permettre de s'tendre si
   cela devait tre ncessaire. J'ai donc rserv les rseaux
   192.168.10.0 et 192.168.11.0. J'ai aussi dcid que pour les
   utilisateur se connectant depuis leur domicile, je disposais de
   suffisamment d'adresses et que je n'avais donc pas besoin de leur
   appliquer de masquarade du ct du serveur VPN. Chaque client
   dispose de sa propre adresse IP interne. J'ai donc eu besoin de
   rserver une autre adresse rseau de classe C pour cela, disons
   192.168.40.0. La seule chose que j'ai alors du faire fut d'ajouter
   ces espaces d'adresse  mon routeur. Imaginons que notre
   entreprise possde un petit Cisco (192.168.254.254) qui gre tout
   le trafic via notre OC1. Nous n'avons alors qu' ajouter les
   routes sur le Cisco de telle manire que le trafic dirig vers ces
   rseaux rservs soit dirig vers notre serveur VPN
   (192.168.40.254). J'ai considr que le serveur VPN appartenait au
   rseau de l'utilisateur se connectant depuis son domicile pour une
   raison qui sera plus claire tout  l'heure. Nous appellerons
   l'interface externe du serveur vpn.monentreprise.com, et
   l'interface interne vpn-interne.monentreprise.com.

   Nous n'avons pas besoin de connatre explicitement les adresses
   externes. Vous devriez avoir les vtres, fournies par votre FAI.

5.2 Rassembler les outils

   Nous allons avoir besoin de quelques logiciels. Rcuprez les
   packages suivants, et installez les  l'endroit indiqu.

  Pour le serveur :

     * pppd (version 2.3 ou suprieure)
     * ssh (version 1.2.26 ou suprieure)

  Pour le client :

     * pppd (la mme version que le serveur)
     * ssh
     * [23]pty-redir

5.3 Serveur: Compiler le noyau

   Pour commencer, vous aurez probablement besoin de recompiler le
   noyau pour le serveur. Il faut vous assurer que les options
   suivantes du noyau sont actives, en plus des option rseaux de
   base, et de toutes celles dont vous avez besoin. Si vous n'avez
   jamais compil de noyau, rfrez vous au [24]Kernel HOWTO.

   Pour les noyaux 2.0 :

     * CONFIG_FIREWALL
     * CONFIG_IP_FORWARD
     * CONFIG_IP_FIREWALL
     * CONFIG_IP_ROUTER
     * CONFIG_PPP

   Pour les noyaux 2.2 :

     * CONFIG_FIREWALL
     * CONFIG_IP_ADVANCED_ROUTER
     * CONFIG_IP_FIREWALL
     * CONFIG_IP_ROUTER
     * CONFIG_PPP

5.4 Serveur: Configurer les paramtres rseaux

   Si vous prparez un serveur ne disposant que d'une carte rseau,
   je vous suggre d'envisager d'en acheter une autre, et de refaire
   la connectique de votre rseau. La meilleure mthode pour garder
   votre rseau priv est encore de le doter de ses propres cbles.
   Si vous avez deux cartes rseaux, vous aurez besoin de savoir les
   configurer. Nous nous servirons de eth0 comme interface externe,
   et de eth1 comme interface interne.

  Configurer les interfaces

   Nous devons tout d'abord configurer l'interface externe du
   serveur. Vous tes cens savoir le faire, et l'avez probablement
   dj fait. Si ce n'est pas le cas, faites le. Si vous ne savez pas
   le faire, rfrez vous au [25]Networking HOWTO

   Occupons nous maintenant de l'interface interne. Selon la
   numrotation que nous avons choisi, elle dispose de l'adresse
   192.168.40.254.

   Pour les noyaux 2.0, utilisez les commandes suivantes :

 # /sbin/ifconfig eth1 192.168.40.254 netmask 255.255.255.0 broadcast 192.168.40.255
 # /sbin/route add -net 192.168.40.0 netmask 255.255.255.0 dev eth1

   Pour les noyaux 2.2, utilisez la commande suivante :

 # /sbin/ifconfig eth1 192.168.40.254 netmask 255.255.255.0 broadcast 192.168.40.255

   Cela active nos interfaces. Vous pouvez maintenant communiquer
   avec les machines situes sur les deux rseaux connects
   localement au serveur.

  Mettre les routes en place

   Nous pouvons parler aux machines situes sur nos rseaux locaux,
   mais ne pouvons accder au reste de notre rseau interne. Ceci
   ncessite quelques lignes de code supplmentaires. Pour pouvoir
   atteindre les machines situes sur les autres sous-rseaux, nous
   devons avoir une route envoyant le trafic vers le routeur Cisco.
   C'est ce que fait la commande suivante :

 # /sbin/route add -net 192.168.0.0 gw 192.168.254.254 netmask 255.255.0.0 dev eth1

   Cette ligne indique au noyau que le trafic destin au rseau
   192.168.0.0 devrait tre envoy par eth1, et transmis au Cisco. Le
   trafic pour notre rseau local va toujours o il est suppos aller
   puisque les tables de routage sont ordonnes par taille de masque
   de sous-rseau. Si nous devions avoir d'autres rseaux internes
   dans notre rseau, nous devrions avoir une ligne comme celle-ci
   pour chacun d'entre eux.

  Mettre en place les rgles de filtrage

   Trs bien, nous pouvons donc atteindre toutes les machines que
   nous voulons. Nous devons maintenant crire les rgles de filtrage
   du firewall qui autorise ou refuse l'accs au via le serveur VPN.

   Pour mettre en place les rgles avec ipfwadm, lancez le ainsi :

 # /sbin/ipfwadm -F -f
 # /sbin/ipfwadm -F -p deny
 # /sbin/ipfwadm -F -a accept -S 192.168.40.0/24 -D 192.168.0.0/16
 # /sbin/ipfwadm -F -a accept -b -S 192.168.10.0/24 -D 192.168.0.0/16
 # /sbin/ipfwadm -F -a accept -b -S 192.168.11.0/24 -D 192.168.0.0/16

   Pour mettre en place les rgles avec ipchains, lancez le ainsi :

 # /sbin/ipchains -F forward
 # /sbin/ipchains -P forward DENY
 # /sbin/ipchains -A forward -j ACCEPT -s 192.168.40.0/24 -d 192.168.0.0/16
 # /sbin/ipchains -A forward -j ACCEPT -b -s 192.168.10.0/24 -d 192.168.0.0/16
 # /sbin/ipchains -A forward -j ACCEPT -b -s 192.168.11.0/24 -d 192.168.0.0/16

   Cela dit au noyau de refuser tout trafic, except celui provenant
   du rseau 192.168.40.0/24 et destin au rseau 192.168.0.0/16. Le
   trafic est autoris entre les rseaux 192.168.10.0/24 et
   192.168.0.0/16, de mme que pour le rseau 192.168.11.0. Ces deux
   dernires rgles sont bi-directionnelles, ce qui est important
   pour obtenir un routage fonctionnant dans les deux sens.

  Le routage

   Pour les utilisateurs souhaitant se connecter depuis leur
   domicile, tout fonctionnera parfaitement  partir de maintenant.
   Toutefois, pour les bureaux distants, nous devons raliser un peu
   de routage. Nous devons tout d'abord dire au routeur principal que
   les bureaux distants sont derrire le serveur VPN, et donc lui
   spcifier des routes indiquant d'envoyer le trafic destin aux
   bureaux distants au VPN. Ceci fait, il faut indiquer au serveur
   VPN ce qu'il doit faire de ce trafic. Pour ce faire, il faut
   lancer la commande route sur le serveur. Le seul problme est que
   pour que celle-ci fonctionne, la liaison doit fonctionner. Si
   celle-ci tombe, la route sera perdue. La solution consiste 
   ajouter les routes quand les clients se connectent, ou, plus
   simplement,  lancer la commande route frquemment, tant donn
   qu'il n'est pas grave de l'utiliser plus que ncessaire. De fait,
   crez un script contenant les lignes suivantes, et ajoutez le 
   votre crontab pour qu'il soit lanc toutes les quelques minutes.

 /sbin/route add -net 192.168.11.0 gw 192.168.10.253 netmask 255.255.255.0
 /sbin/route add -net 192.168.10.0 gw 192.168.11.253 netmask 255.255.255.0

5.5 Serveur: Configurer pppd

   Nous allons maintenant configurer pppd sur le serveur pour grer
   les connections au VPN. Si vous utilisez dj ce serveur pour
   grer des utilisateurs accdant au rseau par modem, ou que vous
   mme vous servez d'un modem pour sortir du rseau, sachez que ces
   modifications peuvent affecter ces services. J'expliquerais
   comment viter les conflits  la fin de cette section.

  /etc/ppp/

   Ce rpertoire peut contenir de nombreux fichiers. Vous disposez
   dj probablement d'un fichier appel options. Ce fichier contient
   toutes les options globales pour pppd. Elles ne peuvent tre
   surcharges par l'utilisation de pppd en ligne de commande.

  /etc/ppp/options

   Votre fichier options devrait au moins contenir les paramtres
   suivants :

 ipcp-accept-local
 ipcp-accept-remote
 proxyarp
 noauth

   Les deux premires lignes indiquent  pppd d'accepter que l'autre
   ct spcifie les adresses IP. Ces options sont ncessaires
   lorsque l'on se connecte avec des bureaux distants, mais peut tre
   dsactive si l'on ne la fait qu'avec des travailleurs  domicile.
   Les laisser actives ne pose pas de problmes, tant donn
   qu'elles n'empchent pas le serveur d'assigner une adresse, mais
   informe simplement celui-ci que le client a le droit d'en proposer
   une.

   La troisime ligne est trs importante. Selon la page man de pppd
   :

 proxyarp
         Ajoute une entre  la table ARP [Address Resolution
         Protocol] de ce systme avec l'adresse IP du pair
         et l'adresse Ethernet de ce systme. Cela aura pour
         effet de faire croire aux autres systmes que
         le pair est situ sur l'ethernet local.

   C'est une option importante, car si elle n'est pas utilise, le
   trafic local ne pourra pas revenir par le tunnel.

   La dernire ligne est toute aussi importante. Elle informe pppd
   qu'il faut autoriser les connections sans nom d'utilisateur ni mot
   de passe. Cette mthode ne nuit pas  la scurit, puisque
   l'authentification est dj ralise par sshd.

  Eviter les conflits

   Si vous grez d'autres services avec pppd, vous devez considrer
   que les configurations respectives de ces autres services peuvent
   tre diffrentes de celle requise par le VPN. pppd est conu pour
   que les options du fichier d'options principal /etc/ppp/options ne
   puissent pas tre surcharges par les options spcifies au moment
   de l'excution, et ceci pour des raisons de scurit. Afin
   d'viter les conflits, dterminez les options qui en sont 
   l'origine, et dplacez les du fichier principal vers un fichier
   d'option distinct, charg lorsque l'application approprie de pppd
   est lance.

5.6 Serveur: Configurer sshd

   Voici a quoi ressemble mon fichier /etc/sshd_config, et  quoi
   devrait approximativement ressembler le votre :

 # Fichier de configuration ssh du serveur

 Port 22
 ListenAddress 0.0.0.0
 HostKey /etc/ssh_host_key
 RandomSeed /etc/ssh_random_seed
 ServerKeyBits 768
 LoginGraceTime 600
 KeyRegenerationInterval 3600
 PermitRootLogin yes
 IgnoreRhosts yes
 StrictModes yes
 QuietMode no
 FascistLogging yes
 CheckMail no
 IdleTimeout 3d
 X11Forwarding no
 PrintMotd no
 KeepAlive yes
 SyslogFacility DAEMON
 RhostsAuthentication no
 RhostsRSAAuthentication no
 RSAAuthentication yes
 PasswordAuthentication no
 PermitEmptyPasswords no
 UseLogin no

   Il est important de remarquer que l'authentification par mot de
   passe a t dsactive, tout comme tous les autres services "r".
   J'ai aussi dsactiv la notification de mail, et le message du
   jour, tant donn qu'il peuvent dsorienter pppd du ct client.
   J'autorise toujours la connexion en tant que root, qui reste sre
   tant donn qu'elle requiert l'utilisation d'une cl.

5.7 Serveur: Mettre en place les comptes utilisateurs

   Nous allons maintenant mettre en place les comptes utilisateurs.

  Ajouter un groupe vpn-users

   lancez simplement:

 # /usr/sbin/groupadd vpn-users

   Faites maintenant un cat du fichier /etc/group et regardez la
   dernire ligne. Il doit s'agir de l'entre pour le groupe
   vpn-users. Remarquez le troisime champ. Il s'agit de
   l'identifiant du groupe (Group ID ou GID). Notez le, tant donn
   que nous allons en avoir besoin sous peu. Dans notre exemple, GID
   vaut 101.

  Crer le rpertoire domicile des vpn-users

   Nous utiliserons un seul rpertoire domicile pour tous les
   utilisateurs. Lancez simplement :

 # mkdir /home/vpn-users

  Le rpertoire .ssh

   Crez maintenant le rpertoire .ssh dans le rpertoire domicile
   des vpn-users.

 # mkdir /home/vpn-users/.ssh

  Ajouter des utilisateurs

   Ca devient amusant. Nous allons diter le fichier /etc/passwd  la
   main :) . Normalement, vous laissez le systme grer ce fichier,
   mais pour une installation aussi trange que celle-ci, il est plus
   simple de le faire vous mme. Pour commencer, ouvrons le fichier
   /etc/passwd et regardons ce qu'il contient. Voici un exemple de ce
   que vous pourriez trouver:

 ...
 nobody:x:65534:100:nobody:/dev/null:
 mwilson:x:1000:100:Matthew Wilson,,,:/home/mwilson:/bin/bash
 joe:*:1020:101:Joe Mode (home),,,:/home/vpn-users:/usr/sbin/pppd
 bill:*:1020:101:Bill Smith (home),,,:/home/vpn-users:/usr/sbin/pppd
 frank:*:1020:101:Frank Jones (home),,,:/home/vpn-users:/usr/sbin/pppd
 ...

   Vous trouverez le premier utilisateur sur la plupart des systmes.
   Le suivant, c'est moi :). Aprs viennent quelques vpn-users que
   j'ai cr. Le premier champ est le nom d'utilisateur, le second le
   mot de passe. Le troisime est l'identifiant d'utilisateur (User
   ID ou UID), et le quatrime l'identifiant de groupe. Aprs
   viennent certaines infos sur l'identit de l'utilisateur (dans le
   cinquime champ). Le sixime est le rpertoire domicile de
   l'utilisateur, et le dernier son shell. Comme vous pouvez le voir,
   chaque champ est spar par une deux points. Regardez les trois
   dernires lignes. La seule diffrence existant entre eux est le
   nom d'utilisateur du premier champ et l'information sur
   l'utilisateur dans le cinquime. Nous souhaitons crer une ligne
   comme celles-ci pour chaque utilisateur. Evitez d'utiliser un seul
   utilisateur pour toutes les connections, faute de quoi il vous
   sera impossible de les diffrencier par la suite. Donc, copiez la
   dernire ligne du fichier, et ditez la afin de qu'elle ressemble
    notre exemple. Assurez vous que le second champ contient une
   astrisque. Le troisime champ devrait tre unique par rapport 
   tous les autres identifiants dans le fichier. J'ai utilis 1020.
   Vous devriez utiliser un nombre suprieur  1000, tant donn que
   les nombres infrieurs  1000 sont gnralement rservs pour le
   systme. Le quatrime champ devrait tre l'identifiant du groupe
   vpn-users. Je vous ai dit tout  l'heure de l'crire, c'est
   maintenant qu'il faut s'en servir. Donc, mettez ici l'identifiant
   du groupe. Enfin, changez le rpertoire domicile en
   /home/vpn-users, et le shell en /usr/sbin/pppd. C'est fait.
   Maintenant, copiez celle ligne pour crer plus d'utilisateurs.
   Editez simplement le premier et le dernier champ, et c'est fait.

5.8 Serveur: Administration

   Un des avantages de l'utilisation de ce systmes pour les comptes
   utilisateurs est que l'on peut bnficier des commandes
   d'administrations d'utilisateur UNIX. Comme chaque client est
   connect en tant qu'utilisateur, on peut utiliser les mthodes
   standards pour obtenir les statistiques des utilisateurs. Voici
   quelques commandes que j'aime utiliser pour voir ce qui se passe:

   who

           Affiche les utilisateurs connects actuellement, ainsi que
           le moment o ils se sont connects, de quelle machines
           (par le nom de celle-ci ou son adresse IP), et sur quel
           port.

   w

           Cette commande affiche une description plus exhaustive des
           entits actuellement connectes. Il fournit aussi le temps
           coul depuis la mise en fonctionnement du systme, ainsi
           que sa charge. De mme, il liste les processus des
           utilisateurs (qui devraient tre -pppd pout les client
           VPN) qui tournent, le temps processeur non utilis (idle
           time), et l'utilisation faite du processeur, pour chacun
           des processus et pour le processus courant. Rfrez vous 
           la page man w pour plus d'information.

   last [nom_utilisateur]

           Cette commande fournit l'historique pour l'utilisateur
           spcifi, et pour tout les utilisateurs si aucun
           nom_utilisateur n'est fourni. Elle est particulirement
           utile pour s'assurer que les tunnels fonctionnent bien,
           car elle affiche le temps coul depuis la connexion de
           l'utilisateur, et donne la liste des utilisateur
           connects. Je dois vous prvenir que sur un systme qui
           n'a pas t redmarr depuis longtemps, cette liste peut
           devenir extrmement longue. Je vous conseille donc de
           l'utiliser conjointement avec grep ou head, grce  un
           pipe, pour dcouvrir exactement ce que vous souhaitez.

   Vous pouvez aussi contrler quels utilisateurs sont autoriss  se
   connecter en modifiant le fichier
   /home/vpn-users/.ssh/authorized_keys. Si vous en retirez la ligne
   contenant la cl publique d'un utilisateur, il ne sera plus
   capable de se reconnecter.

5.9 Client: Compiler le noyau

   Nous nous intressons maintenant au client. Nous devons tout
   d'abord recompiler le noyau pour qu'il contienne toutes les
   fonctionnalits ncessaires. Il faut au minimum disposer de ppp
   dans le noyau. Aprs cela, il nous faudra les fonctions de
   forwarding, de firewall, et de passerelle, mais seulement si vous
   comptez autoriser d'autres machines  accder au tunnel. Dans cet
   exemple, je configurerais une des machines du bureau distant.
   Ajoutez les options ci-dessous  votre noyau. Une fois encore, si
   vous n'avez jamais recompil de noyau, rfrez vous au [26]Kernel
   HOWTO.

   Pour les noyaux 2.0:

     * CONFIG_PPP
     * CONFIG_FIREWALL
     * CONFIG_IP_FORWARD
     * CONFIG_IP_FIREWALL
     * CONFIG_IP_ROUTER
     * CONFIG_IP_MASQUERADE
     * CONFIG_IP_MASQUERADE_ICMP

   Pour les noyaux 2.2:

     * CONFIG_PPP
     * CONFIG_FIREWALL
     * CONFIG_IP_ADVANCED_ROUTER
     * CONFIG_IP_FIREWALL
     * CONFIG_IP_ROUTER
     * CONFIG_IP_MASQUERADE
     * CONFIG_IP_MASQUERADE_ICMP

5.10 Client: Configurer les paramtres rseaux

   Nous devons maintenant configurer les paramtres rseaux sur notre
   client. Considrons que tout fonctionne correctement avec le
   rseau externe. Nous allons maintenant mettre en place l'interface
   interne du client notre intranet.

  Interface

   Nous devons tout d'abord configurer l'interface rseau interne.
   Pour ce faire, ajoutez les lignes suivantes  votre fichier
   /etc/rc.d/rc.inet1 (ou quivalent):

   Pour les noyaux 2.0 :

 /sbin/ifconfig eth1 192.168.10.253 broadcast 192.168.10.255 netmask 255.255.255.0
 /sbin/route add -net 192.168.10.0 netmask 255.255.255.0 dev eth1

   Pour les noyaux 2.2 :

 /sbin/ifconfig eth1 192.168.10.253 broadcast 192.168.10.255 netmask 255.255.255.0

  Rgles de filtrage

   Pour configurer le bureau distant, nous voulons mettre en place
   des rgles de filtrage qui permettent au trafic d'emprunter le
   tunnel dans les deux directions. Ajoutez pour cela les lignes
   suivantes  votre fichier /etc/rc.d/rc.inet1 ou quivalent:

   Pour les noyaux 2.0 :

 /sbin/ipfwadm -F -f
 /sbin/ipfwadm -F -p deny
 /sbin/ipfwadm -F -a accept -b -S 192.168.10.0/24 -D 192.168.0.0/16

   Pour les noyaux 2.2 :

 /sbin/ipchains -F forward
 /sbin/ipchains -P forward DENY
 /sbin/ipchains -A forward -j ACCEPT -b -s 192.168.10.0/24 -d 192.168.0.0/16

   Vous avez peut-tre remarqu que ces lignes ressemblent  celles
   que nous avons sur le serveur. C'est parce qu'elles sont
   identiques. Elles dcrivent simplement o le trafic est autoris 
   aller, c'est  dire entre les deux rseaux.

  Routage

   Les seules deux routes supplmentaires ncessaires sont cres par
   le script qui met en place le tunnel.

5.11 Client: Configurer pppd

   Vous n'aurez peut-tre pas besoin d'diter le fichier
   /etc/ppp/options du client. Ce ne sera ncessaire que si l'option
   "auth" ou certaines autres options sont prsentes. Essayez, et si
   a ne marche pas, un fichier /etc/ppp/options vide fonctionnera.
   Continuez simplement  ajouter les options de l'ancien fichier
   pour savoir laquelle pose problme (si ce n'est pas vident), et
   regardez si vous pouvez vous en passer. Peut-tre est-ce le cas,
   notamment si vous ne vous servez de pppd pour rien d'autre.

5.12 Client: Configurer ssh

   En tant que root, excutez les lignes suivantes sur le client:

 # mkdir /root/.ssh
 # ssh-keygen -f /root/.ssh/identity.vpn -P ""

   Ces commandes vont crer deux fichiers, identity.vpn et
   identity.vpn.pub dans le rpertoire .ssh. Le premier est votre cl
   prive, et devrait le rester. NE L'ENVOYEZ JAMAIS SUR LE RESEAU, 
   moins que ce ne soit au travers d'un transfert chiffre. Le second
   fichier est votre cl publique, et vous pouvez l'envoyer o vous
   voulez, il ne sert qu' vous autoriser l'accs aux autres
   systmes, et ne peut tre utilis pour pntrer le votre. Il
   s'agit d'un fichier texte d'une ligne, codant votre cl. A la fin
   de la ligne se trouve le champ commentaire, que vous pouvez
   modifier sans craindre de briser la cl. Voici un exemple de cl :

 1024 35 1430723736674162619588314275167.......250872101150654839 root@vpn-client.mycompany.com

   C'est en fait beaucoup plus long que cela, mais a ne tiendrait
   pas sur une page si je montrais la totalit de la chose. Copiez
   votre cl dans le fichier /home/vpn-users/.ssh/authorized_keys sur
   le serveur. Assurez vous qu'il s'agit de la seule cl de la ligne,
   et que chaque cl n'est pas spare sur de multiples lignes. Vous
   pouvez modifier le champ de commentaire comme vous voulez pour
   vous rappeler quelle cl corresponds  quel utilisateur. Je vous
   le recommande fortement.

5.13 Client: mettre en place la connexion

   Nous allons maintenant essayer de raliser la connexion au serveur
   VPN. Tout d'abord, nous avons besoin d'diter le fichier
   known_hosts de ssh pour raliser la moindre connexion. Excutez
   ceci:

 # ssh vpn.mycompany.com

   Rpondez par l'affirmative lorsqu'il vous est demand si vous
   souhaitez continuer  vous connecter. Le serveur va rpondre
   ''permission denied'', mais c'est normal. Il est important que
   vous utilisiez le mme nom pour le serveur que celui que vous
   utilisez pour vos scripts de connexion. Excutez maintenant les
   lignes suivantes. Vous aurez videment besoin de changer la
   plupart des options pour correspondre  votre installation.

 # /usr/sbin/pty-redir /usr/bin/ssh -t -e none -o 'Batchmode yes' -c blowfish -i /root/.ssh/identity.vpn -l vpn-user vpn.mycompany.com > /tmp/vpn-device

         (Maintenant, attendez  peu prs 10 secondes)

 # /usr/sbin/pppd `cat /tmp/vpn-device` 192.168.10.254:192.168.40.254

   Remarquez les adresses IP spcifies dans la ligne pppd. La
   premire est l'adresse du client  l'autre bout du tunnel. La
   seconde est l'adresse de l'issue du tunnel cot serveur, mise  la
   valeur de l'adresse interne du serveur. Si tout semble
   fonctionner, continuez. Si non, vrifiez que vous avez bien toutes
   les options, et qu'elles sont correctement entre. Si les
   problmes persistent, vrifiez la [27]section Problmes.

5.14 Client: Dfinir les routes

   Dfinissez maintenant la route pour envoyer le trafic au travers
   du tunnel. Lancez simplement cette commande :

 # /sbin/route add -net 192.168.0.0 gw vpn-internal.mycompany.com netmask 255.255.0.0

   Vous devriez maintenant tre capable de communiquer avec les
   machines de l'autre ct du tunnel. Faites un essais... Nickel,
   hein? Si a ne fonctionne pas, essayez d'utiliser ping et
   traceroute pour dcouvrir o se situe le problme. Si en fait a
   fonctionne rellement, continuez en mettant en place des scripts
   qui feront le travail pour vous.

5.15 Client: Faire des scripts

   Utilisez le script vpnd que je montre <@@ref>vpn-scriptici. Vous
   n'avez qu' le modifier un petit peu. Faites les changements
   suivants:

     * Changez les variables du dbut pour correspondre  votre
       configuration. La plupart sont probablement corrects, mais
       vous pouvez les changer si vous en avez besoin...
     * Ligne 27: ajoutez les adresses IP locales et distantes avant
       $PPP_OPTIONS
     * Ligne 31: changez cette ligne, et les deux suivantes pour
       configurer les routes pour votre rseau interne.

  Le maintenir en tat de fonctionnement

   Mme si les scripts bash sont gnralement stables, il sont connus
   pour planter parfois. Pour s'assurer que le script vpnd continue 
   tourner, ajoutez une entre dans la contab du client qui excute
   le script check-vpnd. Je lance le mien toute les cinq minutes 
   peu prs. Si vpnd tourne rellement, check-vpnd n'utilise pas
   beaucoup de puissance de calcul.

6. Annexes

6.1 Problmes

   Voici quelques-uns des problmes que j'ai rencontr alors que
   j'utilisais ce systme. Je les ai indiqus ici dans l'espoir que
   vous puissiez les viter. Si vous rencontrez un problme que je ne
   dcris pas ici, envoyez moi un [28]courrier lectronique pour que
   je puisse le rfrencer et permettre aux autres de l'viter.

  Lecture : erreur d'entre/sortie

   Cette erreur vient apparemment de pppd. C'est du  l'utilisation
   d'une mauvaise version de pppd. Si cela vous arrive, essayez de
   mettre  jour les deux cts de la connexion avec la dernire
   version de pppd. J'ai dcouvert que la version 2.2 pose problme,
   et utilise les versions 2.3.7 ou 2.3.8  la place.

  SIOCADDRT: Le rseau est non-atteignable

   Cette erreur est gnre par route. Je l'ai vu se produire quand
   le temps d'attente entre ssh et pppd n'est pas assez grand. Si
   vous rencontrez cette erreur, lancez ifconfig, il se peut que vous
   vous aperceviez qu'il n'y a pas d'interface pppX. Cela signifie
   que ssh n'avait pas fini l'authentification avant que pppd ne soit
   lanc, et que pppd n'ait donc pu raliser la connexion. Augmentez
   simplement le dlai d'attente, et vos problmes seront rsolus.

   Je me demande toutefois s'il n'existe pas une option pppd qui
   rglerait ce problme.

  Transmission IPv4 et les noyaux 2.2

   Dans les nouveaux noyaux 2.2, vous devez spcifier que vous
   installez le forwarding IPv4 dans le noyau au dmarrage. Ce qui se
   fait avec la commande suivante:

 # echo 1 > /proc/sys/net/ipv4/ip_forward

   Sans cela, le noyau ne transmettra aucun datagramme, et le serveur
   ne fonctionnera donc pas, pas plus qu'aucun des clients
   passerelles.

  Routage

   Cela va sans dire, mais faites attention quand vous routez des
   adresses relles que vous ne routez pas le trafic destin aux
   adresses externes du serveur VPN au travers du tunnel. Ca ne le
   fera pas (Oui, il s'agit vraiment d'une exprience personnelle).

6.2 Configuration minimale matrielle et logicielle

  Configuration matrielle minimale

   Croyez le ou pas, ce systme a t excut sur un 486SX33 avec 8
   Mo de RAM. Ca ne marchait toutefois pas trs bien, car il avait
   des problmes  grer le gros trafic.

   Ca n'a cependant pas t trop dur de le faire fonctionner. Ce
   systme marche trs bien sur un Pentium 75 avec 16 Mo de RAM,
   utilisant une distribution LRP sur disquette, avec 6 Mo de
   ramdisk, et 10 Mo de mmoire principale. J'ai test cette
   configuration en faisant passer un flux RealVideo  700Kbits au
   travers pendant plus d'une heure.

   Je le fait maintenant fonctionner en gnral sur des Pentium 90,
   tant donn que leur frquence d'horloge fonctionne mieux avec les
   cartes Ethernet  100Mbits/sec.

  Configuration logicielle minimale

   Ce systme fonctionne tant avec les noyaux 2.0 qu'avec les 2.2. Le
   script permettant de garder le tunnel en fonctionnement demande un
   bash raisonnablement moderne. J'ai toutefois remarqu que les
   versions de bash que l'on trouve sur certaines distributions ne
   fonctionnent pas trs bien avec le script.

   De fait, si quelqu'un pouvait m'aider  amliorer mes scripts (ou
   mme  crire un excutable?), a m'aiderait beaucoup. Je ne suis
   pas certains de savoir pourquoi, mais mme mon propre bash ne suit
   pas les rgles et ne semble pas interprter les signaux
   correctement. Si vous faites des amliorations, envoyez moi un
   courrier lectronique  [29]matthew@shinythings.com s'il vous
   plait.

References

   Visible links
   1. mailto:matthew@shinythings.com
   2. mailto:prigentn@thmulti.com
   3. http://www.linuxdoc.org/COPYRIGHT.html
   4. file:///home/fevrier/traduc.org/mag@bunuel.tii.matav.hu
   5. file:///HOWTO/Networking-Overview-HOWTO.html
   6. file:///HOWTO/NET3-4-HOWTO.html
   7. file:///HOWTO/VPN-Masquerade-HOWTO.html
   8. http://www.linuxdoc.org/HOWTO/Networking-Overview-HOWTO.html
   9. file:///HOWTO/Networking-Overview-HOWTO.html
  10. http://www.linuxdoc.org/HOWTO/VPN-Masquerade-HOWTO.html
  11. http://www.linuxdoc.org/HOWTO/VPN-Masquerade-HOWTO.html
  12. http://sites.inka.de/sites/bigred/devel/cipe.html
  13. file:///HOWTO/Security-HOWTO.html
  14. http://www.ssh.org/
  15. file:///home/fevrier/traduc.org/VPN-HOWTO.html#passwd
  16. file:///home/fevrier/traduc.org/VPN-HOWTO.html#user-accounts
  17. http://www.linuxdoc.org/HOWTO/Linux-Networking-HOWTO.html
  18. http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html
  19. file:///home/fevrier/traduc.org/VPN-HOWTO.html#ipv4forwarding
  20. http://www.shinythings.com/vpnd/vpnd.tar.gz
  21. http://www.linuxrouter.org/
  22. http://www.shinythings.com/vpnd/vpnd.lrp
  23. ftp://ftp.vein.hu/ssa/contrib/mag/pty-redir-0.1.tar.gz
  24. file:///HOWTO/Kernel-HOWTO.html
  25. file:///HOWTO/NET3-4-HOWTO.html
  26. file:///HOWTO/Kernel-HOWTO.html
  27. file:///home/fevrier/traduc.org/VPN-HOWTO.html#pitfalls
  28. mailto:matthew@shinythings.com
  29. mailto:matthew@shinythings.com
