Un petit article vite fait pour expliquer comment connecter deux machines en utilisant VTUN. Elles communiqueront via un tunnel chiffré et compressé.

Principe de fonctionnement

On va donc monter un tunnel entre deux machines, c'est-à-dire qu'on va créer une interface virtuelle qui va manipuler nos paquets avant de les envoyer sur l'interface physique. Quand la machine A voudra parler à la machine B, elle enverra ses données vers l'interface tunX qui fera ce qu'elle a à faire (compression, chiffrement) et les enverra à B via l'interface physique. De l'autre côté c'est le même principe, on reçoit les données sur l'interface physique, elles sont remontées à l'interface virtuelle qui fait ce qu'elle a faire (décompression, déchiffrement) et renvoie ça à l'application.

L'avantage c'est qu'au niveau applicatif, il n'y a rien à changer. On joint la machine distante en utilisant l'IP affectée au tunnel.

Topologie

On travaillera donc avec deux machines pour rester simple. Il n'est pas question de routage, c'est-à-dire que le tunnel va permettre à A de communiquer avec B, point barre. Je ferai peut-être un autre article sur « Comment utiliser une machine distante comme passerelle pour passer au travers de restrictions débiles  » un de ces quatre, mais là, non.

Donc on a la machine A qui a l'IP 192.168.2.150 et la machine B qui a l'IP 192.168.2.151. Ici on est en LAN donc ça pose pas de problème mais dans le cas général, il faut que A puisse joindre B et vice versa (donc si vous n'êtes pas en LAN il faut qu'elles aient des IP publiques ou qu'il y ait du NAT pour leur permettre de se joindre). Notre VPN utilisera 172.16.0.0/24 pour ses adresses.

Élements nécessaires

Vous aurez besoin du driver tun dans votre noyau (modprobe tun ou Device Drivers/Network device support/Universal TUN/TAP device driver support) et du paquet vtun... C'est tout !

Configuration

Note : lorsqu'il est fait référence à /etc/default/vtun il s'agit du fichier de configuration de l'initscript sous Debian. Si vous ne disposez pas de ce fichier (ou si vous voulez tester avant de configurer l'initscript), le serveur se lance avec sudo vtund -s et le client avec sudo vtund nomsession ipserveur.

Serveur

Vu qu'on n'a que deux machines, on en prend une (au hasard A) et on dit que c'est le serveur. Sa configuration se fait comme suit via le fichier /etc/vtund.conf :

# Options par défaut
default {
        type tun;
        proto udp;
# Compression maxi
# *note* Vous pouvez utiliser lzo ou zlib
# toutefois, seul zlib sera pris en charge sous x86_64,
# lzo provoquant des segfaults (http://bugs.debian.org/477707)
        compress lzo:9;
# Chiffrement (blowfish)
        encrypt yes;
# Maintient de la connexion
        keepalive yes;
}

# Tunnel avec B
montunnel {
# Secret partagé
        passwd mY2wN&G0kmJiNjKYY3x&3mpe61oN^7hLe;
        up {
# Affecte les adresses IP. Attention c'est pointopoint et pas pointtopoint...
# On joindra B via le tunnel en utilisant l'adresse 172.16.0.2 et on a l'adresse 172.16.0.1
# %% sera remplacé par l'interface créée par vtun
                ifconfig "%% 172.16.0.1 pointopoint 172.16.0.2 mtu 1450";
        };
}

On n'a plus qu'à activer le serveur dans /etc/default/vtun :

RUN_SERVER=yes

Client

La configuration du client est légèrement plus simple dans la mesure ou la plupart des options sont déterminées par le serveur. Toujours pareil, dans /etc/vtund.conf :

# Tunnel avec A. Attention la session (montunnel) doit avoir le même nom
# tout comme le mot de passe (logique)
montunnel {
        passwd mY2wN&G0kmJiNjKYY3x&3mpe61oN^7hLe;
# On se reconnecte automatiquement en cas de rupture du lien
        persist yes;
        up {
# Inverse de la conf serveur, on joint A avec l'adresse 172.16.0.1 et on a l'adresse 172.16.0.2
                ifconfig "%% 172.16.0.2 pointopoint 172.16.0.1 mtu 1450";
        };
}

Et voila, tout est prêt, il n'y a plus qu'à configurer le démarrage du client. Comme vous vous en doutez, c'est là qu'on donne l'IP publique du serveur. Toujours dans /etc/default/vtun :

# Nom de la session
CLIENT0_NAME=montunnel
# Adresse distante correspondante
CLIENT0_HOST=192.168.2.150
# Apparemment, si vous faites du partage NFS via le VPN le -m est conseillé
CLIENT0_ARGS="-m"

Et si j'ai plus de deux machines ?

Si vous avez plus de 2 machines, vous avez deux choix.

Soit vous adoptez une topologie en étoile avec une machine qui fera serveur vtund et tout le reste en client. Mais :

  • Ça complexifie légèrement la configuration puisque le serveur va devoir faire du routage (si toutes la machines doivent se "voir"). C'est pas sorcier mais c'est toujours ça de plus ;
  • Vous allez bouffer deux fois plus de bande passante pour tout ce qui est communication client à client. Si A est serveur, B et C sont deux clients qui veulent communiquer entre eux, pour envoyer un paquet de B à C il faut l'envoyer dans le tunnel entre B et A puis entre A et C, c'est assez sous-optimal ;
  • Si le serveur tombe, vous dites au revoir à votre VPN.

Soit vous faites du maillage, chaque machine a alors une connexion directe à toutes les autres. Si y a suffisamment peu de machines, c'est impeccable. Par contre l'ajout d'une machine nécessite de modifier la conf de toutes les autres pour établir les liaisons. Avec 4 machines (A B C D), ça donne ça :

  • A est un serveur
  • B est un serveur et est client de A (A<->B) ;
  • C est un serveur et est client de A et de B (A<->C et B<->C) ;
  • D est un client de A, B et C (A<->D, B<->D et C<->D).

Comme on le voit, ajouter une machine nécessite de modifier la configuration de toutes les autres (si on ajoute E, D devient également serveur et E est client de A B C D, soit 5 configurations à modifier).

Voila voila pour cet aperçu rapide de vtun (qui montre que ce blog n'est pas encore tout à fait mort).

Merci à Sylvain et Samuel pour leur coup de main sur le pointtopoint :).