27fév.2009
Configuration avancée d'OpenVPN.

Article rédigé par Kevin H.
Dans l'article suivant je ferais un complément d'information sur la mise en place de la solution OpenVPN décrite par GanGan ( ici et la ). Pour rappel OpenVPN permet de créer un ou plusieurs tunnels sécurisés entre des machines éloignées. Du coup elles peuvent aussi se comporter comme si elles étaient situés sur le même réseau local.
On pourrait s'arrêter aux deux articles précédent qui permettent donc de communiquer entre les machines connectés mais OpenVPN peut aller plus loin : il aussi possible d'utiliser le serveur comme routeur par défaut pour aller sur internet et alors de chiffrer tous les flux sortants de chez vous ! ( du moins jusqu'à votre serveur :p ) mais pour cela il faut modifier un peu les routes de votre machines une fois le VPN connecté. L'utilité de la chose ? Par exemple, passer outre les politiques commerciales des fournisseurs d'accès 3G par exemple mais je ne donnerais pas plus d'infos la dessus 
La configuration du serveur de GanGan conseillait d'activer le forward IPv4 et donnait les règles du masquage d'adresse et j'ajouterais qu'il faut ajouter une règle iptables pour permettre le forward entre tun0 et eth0 :
iptables -P FORWARD ACCEPT
Une fois ceci fait, le serveur acceptera tout requête émanant de l'intérieur du VPN vers internet et normalement ses réponses aussi. Modifions les routes des clients maintenant :
1 / Sous Windows (testé sous XP et Vista )
Pour mieux comprendre, je donnerais étape par étape les changements dans la table de routage.
En premier lieu, l'état normal quand le VPN n'est pas connecté. Ci dessous on remarqueras la complexité des routes Windows qui me choquent au plus haut point mais là n'est pas le sujet :p L'adresse de mon PC est ici 192.168.1.14 et l'adresse de ma passerelle 192.168.1.1 . (Il va sans dire que toutes les adresses ici sont faussées bien évidement).
C:\route print
===========================================================================
Itinéraires actifs :
Destination réseau Masque réseau Adr. passerelle Adr. interface Métri
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.14 20
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
192.168.1.0 255.255.255.0 On-link 192.168.1.14 276
192.168.1.14 255.255.255.255 On-link 192.168.1.14 276
192.168.1.255 255.255.255.255 On-link 192.168.1.14 276
224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
224.0.0.0 240.0.0.0 On-link 192.168.1.14 276
255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
255.255.255.255 255.255.255.255 On-link 192.168.1.14 276
===========================================================================
Après connexion du VPN, apparaissent plusieurs nouvelles lignes qui n'ont pour but que d'avoir accès au serveur VPN. Ici j'ai mis le serveur VPN à l'adresse 192.168.200.1 avec une plage d'adresse correspondant à un adressage locale ( conf openvpn : 'server 192.168.200.0 255.255.255.0' et 'push "route 192.168.200.0 255.255.255.0"' ). L'adresse attribué par le serveur à mon client est 192.168.200.22 .
C:\route print
===========================================================================
Itinéraires actifs :
Destination réseau Masque réseau Adr. passerelle Adr. interface Métri
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.14 20
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
192.168.1.0 255.255.255.0 On-link 192.168.1.14 276
192.168.1.14 255.255.255.255 On-link 192.168.1.14 276
192.168.1.255 255.255.255.255 On-link 192.168.1.14 276
192.168.200.0 255.255.255.0 192.168.200.21 192.168.200.22 30
192.168.200.20 255.255.255.252 On-link 192.168.200.22 286
192.168.200.22 255.255.255.255 On-link 192.168.200.22 286
192.168.200.23 255.255.255.255 On-link 192.168.200.22 286
224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
224.0.0.0 240.0.0.0 On-link 192.168.1.14 276
224.0.0.0 240.0.0.0 On-link 192.168.200.22 286
255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
255.255.255.255 255.255.255.255 On-link 192.168.1.14 276
255.255.255.255 255.255.255.255 On-link 192.168.200.22 286
===========================================================================
Ensuite nous allons supprimer la route par défaut actuelle et allons donc perdre notre connexion internet temporairement :
C:\route delete 0.0.0.0 OK!
C:\route print
===========================================================================
Itinéraires actifs :
Destination réseau Masque réseau Adr. passerelle Adr. interface Métri
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
192.168.1.0 255.255.255.0 On-link 192.168.1.14 276
192.168.1.14 255.255.255.255 On-link 192.168.1.14 276
192.168.1.255 255.255.255.255 On-link 192.168.1.14 276
192.168.200.0 255.255.255.0 192.168.200.21 192.168.200.22 30
192.168.200.20 255.255.255.252 On-link 192.168.200.22 286
192.168.200.22 255.255.255.255 On-link 192.168.200.22 286
192.168.200.23 255.255.255.255 On-link 192.168.200.22 286
224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
224.0.0.0 240.0.0.0 On-link 192.168.1.14 276
224.0.0.0 240.0.0.0 On-link 192.168.200.22 286
255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
255.255.255.255 255.255.255.255 On-link 192.168.1.14 276
255.255.255.255 255.255.255.255 On-link 192.168.200.22 286
===========================================================================
Voici la ligne qui a disparu :
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.14 20
Ajout d'une route vers le serveur pour forcer la connexion du VPN à passer par votre routeur. Pourquoi faire ? C'est simple : si on ajoute juste une nouvelle route par defaut vers le serveur OpenVPN alors la connexion VPN va aussi vouloir passer par la et spiderman sera pris dans son propre fil ! J'ai bien sur encore masqué l'adresse mon serveur VPN, faites en autant en remplaçant 10.20.30.40 par celle qui va bien.
C:\route add 10.20.30.40 192.168.1.1
C:\route print
===========================================================================
Itinéraires actifs :
Destination réseau Masque réseau Adr. passerelle Adr. interface Métri
10.20.30.40 255.255.255.255 192.168.1.1 192.168.1.14 21
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
192.168.1.0 255.255.255.0 On-link 192.168.1.14 276
192.168.1.14 255.255.255.255 On-link 192.168.1.14 276
192.168.1.255 255.255.255.255 On-link 192.168.1.14 276
192.168.200.0 255.255.255.0 192.168.200.21 192.168.200.22 30
192.168.200.20 255.255.255.252 On-link 192.168.200.22 286
192.168.200.22 255.255.255.255 On-link 192.168.200.22 286
192.168.200.23 255.255.255.255 On-link 192.168.200.22 286
224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
224.0.0.0 240.0.0.0 On-link 192.168.1.14 276
224.0.0.0 240.0.0.0 On-link 192.168.200.22 286
255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
255.255.255.255 255.255.255.255 On-link 192.168.1.14 276
255.255.255.255 255.255.255.255 On-link 192.168.200.22 286
===========================================================================
Dernière étape ! La route par defaut vers le VPN. Attention ! Petite explication : ici l'adresse 192.168.200.21 représente l'autre bout de votre tuyau. Si l'adresse attribuée par le serveur est 192.168.200.x alors l'adresse à l'autre bout sera forcément 192.168.200.(x-1) . C'est un effet de bord de l'utilisation des interfaces Tun/Tap qui mange 4 adresses locales par client :'(
C:\route add 0.0.0.0 mask 0.0.0.0 192.168.200.21
C:\route print
===========================================================================
Itinéraires actifs :
Destination réseau Masque réseau Adr. passerelle Adr. interface Métri
0.0.0.0 0.0.0.0 192.168.200.21 192.168.200.22 31
10.20.30.40 255.255.255.255 192.168.1.1 192.168.1.14 21
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
192.168.1.0 255.255.255.0 On-link 192.168.1.14 276
192.168.1.14 255.255.255.255 On-link 192.168.1.14 276
192.168.1.255 255.255.255.255 On-link 192.168.1.14 276
192.168.200.0 255.255.255.0 192.168.200.21 192.168.200.22 30
192.168.200.20 255.255.255.252 On-link 192.168.200.22 286
192.168.200.22 255.255.255.255 On-link 192.168.200.22 286
192.168.200.23 255.255.255.255 On-link 192.168.200.22 286
224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
224.0.0.0 240.0.0.0 On-link 192.168.1.14 276
224.0.0.0 240.0.0.0 On-link 192.168.200.22 286
255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
255.255.255.255 255.255.255.255 On-link 192.168.1.14 276
255.255.255.255 255.255.255.255 On-link 192.168.200.22 286
===========================================================================
Et donc voila vous pouvez vérifier par exemple en allant faire un tour sur ipchicken qui vous donnera l'adresse IP de votre serveur VPN et votre adresse personnelle.
2 / Sous Linux.
Ici les explications sont les mêmes donc je ne recommenterais pas mais il suffit de suivre pour comprendre. (Admirez tout de même la clarté des routes sous Linux ^^)
Ici le VPN est déjà connecté comme le montre les routes présente vers le VPN .
# route -n Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 192.168.200.25 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 192.168.1.0 0.0.0.0 255.255.255.0 U 10 0 0 eth0 192.168.200.0 192.168.200.25 255.255.255.0 UG 0 0 0 tun0 169.254.0.0 0.0.0.0 255.255.0.0 U 10 0 0 eth0 0.0.0.0 192.168.1.1 0.0.0.0 UG 10 0 0 eth0
Ajout de la route vers le VPN :
# route add -host 10.20.30.40 gw 192.168.1.1 dev eth0 # route -n Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 192.168.200.25 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 10.20.30.40 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 10 0 0 eth0 192.168.200.0 192.168.200.25 255.255.255.0 UG 0 0 0 tun0 169.254.0.0 0.0.0.0 255.255.0.0 U 10 0 0 eth0 0.0.0.0 192.168.1.1 0.0.0.0 UG 10 0 0 eth0
Ajout de la route par defaut vers le VPN :
# route add default gw 192.168.200.25 dev tun0 # route -n Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 192.168.200.25 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 10.20.30.40 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 10 0 0 eth0 192.168.200.0 192.168.200.25 255.255.255.0 UG 0 0 0 tun0 169.254.0.0 0.0.0.0 255.255.0.0 U 10 0 0 eth0 0.0.0.0 192.168.200.25 0.0.0.0 UG 0 0 0 tun0 0.0.0.0 192.168.1.1 0.0.0.0 UG 10 0 0 eth0
Suppression de la route par defaut vers mon routeur local :
# route del default gw 192.168.1.1 dev eth0 # route -n Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 192.168.200.25 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 10.20.30.40 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 10 0 0 eth0 192.168.200.0 192.168.200.25 255.255.255.0 UG 0 0 0 tun0 169.254.0.0 0.0.0.0 255.255.0.0 U 10 0 0 eth0 0.0.0.0 192.168.200.25 0.0.0.0 UG 0 0 0 tun0
route supprimée :
0.0.0.0 192.168.1.1 0.0.0.0 UG 10 0 0 eth0
3 / Automatisation
Désolé je n'ai pas le courage de chercher ça aujourd'hui ! Mais j'ai deux pistes : soit utiliser un script local (fastoche) soit peut être en utilisant les ccd du côté du serveur. A vous de cherchez 

Commentaires
vendredi, février 5 2010 | 03:27
je ne refute pas la simplicité d'openvpn, mais avec l'arrivé de l'ip v6 il serait pas mal de discuter et surtout de comprendre IPSEC qui est la norme retenu pour l'ipv6, car sans étude approfondi on est loin d'IPSEC via openvpn au vu de la simplicité
vendredi, février 5 2010 | 09:33
Hum oui IPSec ça pourrait faire l'objet d'un autre article plus tard mais si je connais le principe, je n'en ai jamais mis en place moi même.
IPSec pour les curieux est une manière de chiffrer les paquet IP directement plutôt qu'en créant une souscouche dans le modèle OSI comme le fais OpenVPN.
lundi, mai 17 2010 | 16:04
Bonjour,
Après installation d'un serveur openVpn j'ai essayé de mettre en place les routes décrites dans votre article afin de donner accès au net aux clients du VPN.Cependant, cela ne fonctionne toujours pas
La route par défaut 0.0.0.0 a bien été redirigé vers le tunnel(10.8.0.5, 10.8.0.6 étant l'ip attribué au client openVPN)
La route vers l'ip publique du serveur vpn a elle aussi été redirigée comme décrit mais cela ne fonctionne toujours pas.
Auriez-vous des méthodes qui pourraient me permettre d'identifier d'où vient le problème?
Merci d'avance pour votre aide.