Utilisation de vtun pour accéder à un réseau distant
Par Sébastien Le Ray le mercredi 17 mars 2010, 19:06 - Réseau - Lien permanent
Après avoir expliqué comment créer un tunnel avec vtun, nous allons voir comment utiliser ce tunnel pour accéder au LAN se situant derrière la machine distante.
Principe de fonctionnement
On va avoir une machine pivot avec laquelle on va établir le tunnel. Cette machine doit disposer d'une IP publique, ou en tout cas vous devez être en mesure de vous y connecter via un tunnel vtun.
On supposera que le réseau distant est en 192.168.1.0/24 et qu'on établit le VPN en 10.0.0.0/24. Le schéma suivant présente tout ça (les adresses en bleu sont les adresses des extrémités du tunnel) :

La machine accessible via internet va nous servir de passerelle pour accéder au réseau distant. Elle va faire du NAT pour nous fournir une adresse en 192.168.1.x. De notre côté, on ajoutera une route pour envoyer tout le trafic à destination de 192.168.1.0/24 dans le tunnel.
La configuration va se faire en trois étapes :
- Configuration de vtun ;
- Configuration du "routage" sur la machine distante ;
- Configuration du "routage" sur la machie locale.
Dans un second temps, nous verrons comment automatiser ces différentes étapes à la création du tunnel...
Configuration de VTUN
Pour des explications détaillées sur la configuration du tunnel, [l'article qui y est consacré]. La seule différence avec cet article est que l'on utilisera 10.0.0.1 pour le serveur et 10.0.0.2 sur le client, pour le reste, aucune différence notable. Vous pouvez compresser, chiffrer, faire ce que vous voulez, cela n'influera pas sur le reste de la configuration.
Dans le cadre de l'article d'aujoud'hui, on a fait le choix d'utiliser la machine pivot comme serveur mais l'inverse est tout à fait possible.
Configuration manuelle
Sur la machine distante (présente sur le LAN)
Selon ce que l'on veut faire une fois connecté au LAN, il y a deux possibilités. Soit on configure les choses de façon à ce que la machine client obtienne une IP sur le LAN par laquelle elle sera directement joignable après configuration du firewall, soit on utilise l'IP LAN du serveur VTUN pour communiquer avec les machines du LAN en mettant en place une traduction d'adresse.
La première configuration est conseillée principalement si vous souhaitez pouvoir mettre à disposition sur le LAN un serveur hébergé par le client VTUN, nen particulier s'il existe déjà sur la machine à travers laquelle vous vous connectez. Un exemple sera certainement plus parlant que cette phrase tordue... Supposons que la machine présente sur le LAN (appelons la B) mette également à disposition des clients du LAN un serveur Web pour un intranet quelconque et que dans le même temps, je fasse tourner sur ma propre machine (la machine A, avec laquelle je me connecte au LAN distant) un serveur Web auquel les clients du LAN doivent pouvoir se connecter. Si je n'ai pas ma propre IP sur le LAN et que j'utilise celle du serveur VTUN, il me faudra changer le port de mon serveur Web pour le forwarder (puisque le port 80 sera déjà utilisé par le serveur présent sur le LAN). Dans ce cas, il est souhaitable que je dispose de ma propre IP sur le LAN pour simplifier les choses.
Voici donc la procédure dans le cas où l'on souhaite disposer d'une IP sur le LAN.
On commence par ajouter un alias à la carte réseau de B :
sudo ifconfig eth0:tun0 192.168.1.50
Ensuite on indique au noyau de réécrire les adresses provenant du tunnel vers cette IP :
sudo iptables -t nat -I POSTROUTING -o eth0 -j SNAT --source 10.0.0.2 --to-source 192.168.1.50
Dans le cas où vous n'avez pas besoin de disposer de votre propre IP sur le LAN, vous utiliserez du masquerading classique :
sudo iptables -t nat -I POSTROUTING -o eth0 --source 10.0.0.2 -j MASQUERADE
Les étapes suivantes sont communes, quelle que soit la configuration choisie.
On active le forwarding pour tun0. Cela se fait en 2 parties, d'une part on indique au système que l'on souhaite autoriser le forwarding et d'autre part, on configure le firewall pour qu'il accepte de forwarder les paquets :
# Autorise le forwarding sudo sysctl -w net.ipv4.ip_forward=1 # On autorise le forwarding sur l'interface tun0 sudo sysctl -w net.ipv4.conf.tun0.forwarding=1 # On accepte de forwarder du tunnel vers l'extérieur... sudo iptables -I FORWARD --source 10.0.0.2 -j ACCEPT # ... et de l'extérieur vers le tunnel sudo iptables -I FORWARD --destination 10.0.0.2 -j ACCEPT
Sur la machine locale
La machine locale, tout ce qu'il y a à faire est de router ce qui est à destination du réseau distant dans le tunnel :
sudo route add -net 192.168.1.0/24 gw 10.0.0.1
Si vous avez tout fait correctement, vous devriez pouvoir pinguer une IP du réseau distant, vous logger en SSH. Si vous rencontrez un problème, vérifiez point par point que tout est OK. Vous pouvez vous aider de iptables -t nat -L POSTROUTING -n -v et iptables -L FORWARD -v -n, sur la machine B, qui affichent les compteurs (en paquets et en volume) pour les différentes chaines. Ces compteurs doivent s'incrémenter lorsque vous tentez d'accéder au LAN.
Automatisation de la configuration au lancement du VPN
Vtun permet de lancer des commandes quelconques à l'établissement ou à la fermeture d'un tunnel. Nous pouvons nous en servir pour automatiser toute cette configuration plutôt que d'avoir à refaire toutes les étapes à chaque fois.
Sur la machine distante
Nous devons donc, à l'établissement :
- Créer l'interface réseau virtuelle ;
- Modifier la configuration du firewall ;
- Modifier la configuration système (autorisation du forwarding).
À la fermeture de la connexion, nous allons :
- Modifier la configuration système ;
- Modifier la configuration du firewall :
- Supprimer l'interface virtuelle.
Cela se fait dans les clauses up et down de la session dans lesquelles vous devez déjà avoir une instruction ifconfig :
up {
ifconfig "%% 10.0.0.1 pointopoint 10.0.0.2 mtu 1450";
# On crée eth0:tunX...
ifconfig "eth0:%% 192.168.1.50";
firewall "-t nat -I POSTROUTING -o eth0 -j SNAT --source 10.0.0.2 --to-source 192.168.1.50";
# .. ou, si vous ne voulez pas avoir une IP propre sur le LAN
firewall "-t nat -I POSTROUTING -o eth0 --source 10.0.0.2 -j MASQUERADE"
firewall "-I FORWARD --source 10.0.0.2 -j ACCEPT";
firewall "-I FORWARD --destination 10.0.0.2 -j ACCEPT";
program /sbin/sysctl "-w net.ipv4.ip_forward=1";
program /sbin/sysctl "-w net.ipv4.conf.%%.forwarding=1";
};
down {
firewall "-D FORWARD --source 10.0.0.2 -j ACCEPT";
firewall "-D FORWARD --destination 10.0.0.2 -j ACCEPT";
# Si interface dédiée
ifconfig "eth0:%% down";
firewall "-t nat -I POSTROUTING -o eth0 -j SNAT --source 10.0.0.2 --to-source 192.168.1.50";
# Sinon
firewall "-t nat -D POSTROUTING -o eth0 --source 10.0.0.2 -j MASQUERADE";
program /sbin/sysctl "-w net.ipv4.conf.%%.forwarding=0";
};
Sur la machine locale
Là c'est beaucoup plus simple, il suffit d'ajouter la route sur le up et de la supprimer sur le down :
up {
ifconfig "%% 10.0.0.2 pointopoint 10.0.0.1 mtu 1450";
route "add -net 192.168.1.0/24 gw 10.0.0.1";
};
down {
route "del -net 192.168.1.0/24 gw 10.0.0.1";
};
Et voila, vous avez un beau VPN tout propre.
Notez que dans la configuration présentée, rien n'empêche la machine locale de router tout le trafic, excepté le trafic à destination de sa passerelle, dans le tunnel pour s'affranchir de toutes les restrictions posée sur son réseau locale. Toutefois attention, dans ce cas, vous "sortez" sur internet en utilisant l'IP publique du LAN distant.