Habituellement j’utilise OpenVPN lorsque j’ai besoin d’un VPN. Cependant, sur un réseau où seul le Web et le SSH sont autorisés il peut être pratique de monter un VPN avec OpenSSH.

La méthode présentée ici se concentre sur le montage rapide d’un VPN ad-hoc. Le lecteur intéressé par le montage d’un VPN dans la durée pourra se référer à Setting up a Layer 3 tunneling VPN with using OpenSSH.

Cette méthode est très différente de la méthode consistant à faire suivre des ports (Port Forwarding) bien plus simple à mettre en place mais également limitée à un seul et unique port TCP statique par forward.

Configuration du serveur

Avant toute chose, le serveur doit accepter la mise en place de tunnels VPN. Dans le fichier sshd_config du serveur ajouter:

PermitTunnel yes
PermitRootlogin yes 

Les droits root sont nécéssaires pour l’accès aux devices TUN/TAP. Le serveur OpenSSH doit être redémarré avec la commande (sous Debian) :

/etc/init.d/sshd restart

Etablissement de la connexion

Depuis le client il suffit alors d’exécuter la commande :

sudo ssh -w 1:0 root`monserveur

L’option -w prend en paramètre les numéros des interfaces TUN du client et du serveur. Dans notre exemple, un tunnel est demandé entre l’interface tun1 du client et l’interface tun0 du serveur. L’utilisation de -w any:any laisse à OpenSSH le choix des interfaces à utiliser de chaque côté du tunnel.

Configuration du lien

Une fois la connexion SSH établie, le tunnel est actif. Pour pouvoir y router du trafic, il reste à lui affecter un addressage IP.

Sur le serveur (Debian Linux) :

ifconfig tun0 169.254.0.1 pointopoint 169.254.0.2

Sur le client (Mac OS X):

sudo ifconfig tun1 169.254.0.2 169.254.0.1

Routage

On peut vérifier, depuis le client, que le lien est actif avec la commande suivante :

ping 169.254.0.1

Mais tel quel il n’est pas très utile. Il reste à y router du trafic. La configuration du routage dépend en grande partie de l’utilisation que vous souhaitez faire du tunnel et de la topologie des réseaux concernés. A titre d’exemple, nous allons configurer le routage pour donner accès, depuis le client, au réseau 10.0.1.0/24 connecté directement à l’interface eth0 du serveur.

Sur le client

Sous Mac OS X :

sudo route add 10.0.1.0/24 169.254.0.1

Si le client était sous Linux:

sudo ip route add 10.0.1.0/24 via 169.254.0.1 

Sur le serveur

echo 1 > /proc/sys/net/ipv4/ip_forward 
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Si le serveur est déjà configuré pour le routage, la première ligne est inutile. S’il est déjà configuré comme pare-feux il peut être nécessaire de modifier la seconde ligne.

Remarques

L’utilisation de TCP comme couche de transport pour un VPN peut donner de très mauvaises performances dans le pire des cas. Cette solution n’est donc pas recommandée pour une utilisation normale de VPN. Mais elle peut être pratique lorsque la mise en place d’un VPN classique n’est pas possible.

Un second élément à prendre en compte concerne la sécurité. Même s’il est bati sur une simple connexion SSH, le VPN met en place un lien réseau virtuel direct entre le client et le serveur. Ce lien ignore complètement les pare-feux ou les protections mises en place par les administrateurs de ces réseaux. Il faut donc être très prudent avec cette solution.