I) Introduction /:
Cet article a pour but de vous expliquer comment monter un lien VPN avec l’outil pppd et ssh.
II) Ce qu’est un VPN :
Un VPN permet de relier deux sites qui sont loins physiquement afin de donner l’illusion que les sites se retrouvent dans le même réseau local. Donc pour communiquer entre les deux sites on peut très bien utiliser des classes IP non routables sur internet : ça permet de sécuriser les émissions et réceptions. VPN veut dire Virtual Private Network.
On utilise pppd pour donner une IP à chaque machine qu’on tente de relier, et on utilise ssh pour chiffrer les communications entre les machines et on peut même compresser les données !
III) Principe général :
Je prendrais un exemple assez simple pour nous pauvres particuliers. Imaginons que vous possédez un ordinateur relié au net chez vos parents et que vous habitez dans une autre ville. Le problème qui va se poser : comment prendre possession de votre ordinateur tout en sécurisant l’accès au maximum ?
Eh bien une grande partie de la question sera résolue par l’utilisation du VPN avec les outils pppd et ssh.
IV) Mise en place des outils sur le serveur :
Il faut s’assurer que le support ppp est bien compilé dans votre kernel ou bien que celui est disponible en module. Pour voir si ppp est dans votre kernel il suffit d’utiliser la commande suivante : dmesg |grep -i ppp.
Si vous voulez chargez le module ppp il vous faut lancer la commande modprobe ppp.
Assurez-vous aussi que l’outil sudo est installé sur votre distribution. Si vous tournez sous debian un simple apt-get install sudo résoudra ce petit manque.
sudo nous permet de lancer des applications sous un utilisateur qui n’est pas root, et sans connaître le mot de passe de l’utilisateur root. C’est une commande très puissante, mais aussi dangereuse. A manipuler avec une extrême rigueur !
Configurons donc sudo sur la machine qui jouera le rôle de serveur. En tant que root lancez la commande visudo. Ça édite automatique le fichier /etc/sudoers, voici ce que vous devez rajouter.
Cmnd_Alias PPPD=/usr/sbin/pppd
Ensuite il faut autoriser un utilisateur particulier à pouvoir l’utiliser, dans mon cas c’est l’utilisateur hindy qui pourra lancer cette commande ce qui nous donne :
hindy ALL=NOPASSWD:PPPD
On utilise le paramètre NOPASSWD pour qu’on puisse utiliser cette commande sans saisir notre propre password (quand on est fainéant on l’est toujours). Pendant qu’on y est on va générer une clef publique et privée sur la machine cliente. Nous allons générer une clef ssh avec l’algorithme rsa via la commande ssh-keygen -t rsa. Quand on vous demandra d’entrer une Passphrase il suffit simplement que vous appuyez sur la touche (car on ne veut pas en mettre une).
Maintenant déplacez-vous dans ~/.ssh vous devriez avoir un fichier qui se nomme : id_rsa.pub (le pub étant pour public).
Envoyez ce fichier id_rsa.pub sur le machine qui jouera le rôle de serveur. Ensuite lancez la commande : cat id_rsa.pub >> ~/.ssh/authorized_keys2 && chmod 600 ~/.ssh/authorized_keys2.
Tentez de vous logger sur la machine serveur via ssh, si vous vous loggez sans qu’il vous demande de mot de passe alors félicitations vous avez réussi !
Note : le fait que ssh ne demande pas de passwd ne signifie pas que votre utilisateur n’en possède pas. Ssh se sert d’un algorithme pour vérifier si la clef publique qu’il possède est la bonne avec celle qui est privée (que vous ne devez jamais jamais donner à quelqu’un).
V) Mise en place du script qui réalise la connexion VPN :
#!/bin/sh SERVER_HOSTNAME=routeur.lovetux.net SERVER_USERNAME=hindy SERVER_IFIPADDR=192.168.1.1 CLIENT_IFIPADDR=192.168.1.2 LOCAL_SSH_OPTS="" PATH=/usr/local/sbin:/sbin:/bin:/usr/bin:/usr/local/bin:/usr/bin/X11 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: " ${PPPD} updetach noauth passive pty "${SSH} ${LOCAL_SSH_OPTS} ${SERVER_HOSTNAME} -l${SERVER_USERNAME} -o Batchmode=yes sudo ${PPPD} nodetach notty noauth" ipparam VPN ${CLIENT_IFIPADDR}:${SERVER_IFIPADDR} # echo "connected." ;; stop) # echo -n "Stopping VPN to $SERVER_HOSTNAME: " PID=`ps ax | grep "${SSH} ${LOCAL_SSH_OPTS} ${SERVER_HOSTNAME} -l${SERVER_USERNAME} -o" | grep -v ' passive ' | grep -v 'grep ' | awk '{print $1}'` if [ "${PID}" != "" ]; then kill $PID echo "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
Les paramètres les plus importants sont :
SERVER_HOSTNAME=routeur.lovetux.net
SERVER_USERNAME=hindy
SERVER_IFIPADDR=192.168.1.1
CLIENT_IFIPADDR=192.168.1.2
SERVER_HOSTNAME est l’ip de votre serveur auquel vous voulez vous connectez.
SERVER_USERNAME est le nom d’utilisateur qui aura le droit sur le serveur de lancer la commande sudo avec pppd.
SERVER_IFIPADDR sera l’ip VPN attribuée au serveur qui est une classe C non routable sur internet (cf ce que je vous disais dans l’intro en fait).
CLIENT_IFIPADDR sera l’ip VPN attribuée à la machine cliente.
Une fois que les deux machines sont connectées à l’internet sur la machine cliente lancez le script par vpn-pppssh start et si tout se passe bien la connexion VPN s’effectuera. Pour vous en assurer il suffit de lancer la commande : ping 192.168.1.1 si ça répond alors vous avez réussi. Dans le cas contraire regardez vos logs ils pourraient contenir une information importante qui vous est passée sous le nez.