Configuration et installation du VPN

Préparation du client et du serveur.

Première étape : configuration de SSH

La première chose à faire est de mettre en place un moyen de lancer le daemon pppd chaque fois que vous voudrez mettre en place un VPN entre votre client et le serveur. Il y deux solutions. Soit vous créez un compte spécifique sur le serveur (ce que nous allons faire), et qui aura en charge de lancer le daemon, soit vous utilisez votre propre compte. Dans un cas comme dans l'autre, la procédure est très similaire.

Sur le serveur, créez un compte VPN :

adduser --disabled-password vpn

On donne le droit à cet utilisateur de lancer pppd. Il faut rajouter une ligne dans le fichier.

serveur# visudo /etc/sudoers
# Ajoutez la ligne suivante
vpn     ALL=NOPASSWD:/usr/sbin/pppd

Comme la liaison sera chiffrée dans un tunnel SSH, il est nécessaire de mettre également un moyen qui permette cela le plus simplement possible. Cela est réalisé par un système de clé publique et privée. Si vous n'en avez pas vous pouvez vous en créer une. Ne mettez pas de mot de passphrase (vous faites entrée, ce n'est pas vraiment utile. Vous êtes sur le client :

[client]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/client/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /client/.ssh/id_dsa.
Your public key has been saved in /client/.ssh/id_dsa.pub.
The key fingerprint is:
c5:a5:90:b2:19:9d:bf:3a:0b:c9:64:f7:98:1e:e0:dc client@mr

Vous avez la clé publique et la clé privée sur le client, dans votre répertoire personnel et dans le sous-répertoire ".ssh". Il vous faut copier la clé publique sur le serveur.

scp .ssh/id_dsa.pub VotreCompteSurLeServeur@serveur:

Maintenant il ne reste plus qu'à déclarer cette clé publique comme valide et utilisable par le compte "VPN". Vous êtes sur le serveur.

serveur# mkdir -p /home/vpn/.ssh
serveur# cat /home/VotreCompteSurLeServeur/id_dsa.pub >> \
         /home/vpn/.ssh/authorized_keys2
serveur# chmod 700 /home/vpn/.ssh &&  chmod 600 /home/vpn/.ssh/authorized_keys2

Normalement vous devriez pouvoir vous connecter à partir du client sur le serveur en utilisant le compte VPN sans entrer de mot de passe.

[client]$ ssh -l vpn serveur

Si cela ne fonctionne pas, et que le serveur sshd est actif, vérifiez que vous n'avez pas commis d'erreur de manipulation. Reprenez bien la procédure.

Si le serveur vous demande un mot de passe et que l'accès fonctionne en mettant un mot de passe, c'est que vous avez saisi une "passphrase". Utilisez ssh-agent et ssh-add pour ne plus avoir à sasir de mot de passe.

Si tout fonctionne, c'est terminé.

Si d'autres personnes veulent mettre en place des VPN sur le serveur, il suffit de rajouter leurs clés publique dans le fichier authorized_keys2.

Si vous ne voulez pas utiliser de compte "VPN" ou autre mais le vôtre, il suffit de modifier le fichier sudoers en mettant votre compte à la place de "vpn".

Test de la connexion

Il faut maintenant pouvoir activer et/ou désactiver le VPN à la demande. Nous allons pour cela, utiliser un script que vous pourrez adapter.

#!/bin/sh
# /usr/local/bin/vpn-pppssh
#
# This script initiates a ppp-ssh vpn connection.
# see the VPN PPP-SSH HOWTO on http://www.linuxdoc.org for more information.
#
# revision history:
# 1.6 11-Nov-1996 miquels@cistron.nl
# 1.7 20-Dec-1999 bart@jukie.net
# 2.0 16-May-2001 bronson@trestle.com


#
# You will need to change these variables...
#


# The host name or IP address of the SSH server that we are
# sending the connection request to:
SERVER_HOSTNAME=serveur.votredomaine.org

# The username on the VPN server that will run the tunnel.
# For security reasons, this should NOT be root.  (Any user
# that can use PPP can intitiate the connection on the client)
SERVER_USERNAME=vpn

# The VPN network interface on the server should use this address:
SERVER_IFIPADDR=192.168.0.1

# ...and on the client, this address:
CLIENT_IFIPADDR=192.168.0.2


# This tells SSH to use unprivileged high ports, even though it's
# running as root.  This way, you don't have to punch custom holes
# through your firewall.
LOCAL_SSH_OPTS="-P"


#
# The rest of this file should not need to be changed.
#



PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11/:

#
# required commands...
#

PPPD=/usr/sbin/pppd
SSH=/usr/bin/ssh

if ! test -f $PPPD  ; then echo "can't find $PPPD";  exit 3; fi
if ! test -f $SSH   ; then echo "can't find $SSH";   exit 4; fi


case "$1" in
  start)
    echo -n "Starting vpn to $SERVER_HOSTNAME: "
# Modifier les 3 lignes ci-dessous afin d'ôter les \ et les CR/LF
    ${PPPD} updetach noauth passive pty "${SSH} ${LOCAL_SSH_OPTS}\
    ${SERVER_HOSTNAME} -l${SERVER_USERNAME} sudo ${PPPD} nodetach\
    notty noauth" ipparam vpn ${CLIENT_IFIPADDR}:${SERVER_IFIPADDR}
    echo "connected."
    ;;

  stop)
        # echo -n "Stopping vpn to $SERVER_HOSTNAME: "
# Modifier les 2 lignes ci-dessous afin d'ôter les \ et les CR/LF
        PID=`ps ax | grep "${SSH} ${LOCAL_SSH_OPTS}  ${SERVER_HOSTNAME}\
            -l${SERVER_USERNAME}"| grep -v ' passive ' | grep -v 'grep '\
            | awk '{print $1}'`
        if [ "${PID}" != "" ]; then
          kill $PID
          echo "Kill $PID, disconnected."
        else
          echo "Failed to find PID for the connection"
        fi
    ;;

  config)
    echo "SERVER_HOSTNAME=$SERVER_HOSTNAME"
    echo "SERVER_USERNAME=$SERVER_USERNAME"
    echo "SERVER_IFIPADDR=$SERVER_IFIPADDR"
    echo "CLIENT_IFIPADDR=$CLIENT_IFIPADDR"
  ;;

  *)
    echo "Usage: vpn {start|stop|config}"
    exit 1
    ;;
esac

exit 0

Pour l'utiliser, il suffit de faire un "./vpn start". Si vous obtenez quelque chose proche de cela, c'est que votre vpn est bien créé.

[root]# ./vpn-pppssh start
Starting vpn to serveur: Using interface ppp0
Connect: ppp0 <--> /dev/pts/1
Looking for secret in /etc/ppp/pap-secrets for client mr server (null)
Looking for secret in /etc/ppp/chap-secrets for client mr server (null)
Deflate (15) compression enabled
local  IP address 192.168.0.2
remote IP address 192.168.0.1
connected.

Sur le client et sur le serveur, les interfaces ppp0 doivent être actives :

# Sur le client, ifconfig
ppp0      Lien encap:Protocole Point-à-Point
          inet adr:192.168.0.2  P-t-P:192.168.0.1  Masque:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:102 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:3
          RX bytes:10139 (9.9 Kb)  TX bytes:9029 (8.8 Kb)

# Sur le serveur, ifconfig
ppp0      Lien encap:Protocole Point-à-Point
          inet adr:192.168.0.1  P-t-P:192.168.0.2  Masque:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:102 errors:0 dropped:0 overruns:0 frame:0
          TX packets:126 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:3
          RX bytes:9029 (8.8 KiB)  TX bytes:10139 (9.9 KiB)


Le protocole a installé les routes de ces interfaces et qui viennent compléter celles déjà existantes :

# Sur le client :
[Client]# route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.0.1     0.0.0.0         255.255.255.255 UH    0      0      0 ppp0



# Sur le serveur
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.0.2     0.0.0.0         255.255.255.255 UH    0      0       0 ppp0

Sur le client, les commandes :

ping 192.168.0.1
ping 192.168.0.2

fonctionnent. Le routage est donc bien actif entre ces interfaces, nous allons pouvoir faire fonctionner des applications clientes et serveur sur ce canal.