Blog

OpenVPN et l'option iroute

Écrit le 22 04 2013 par Kévin MET _

J'ai dernièrement été confronté à un problème de routage via OpenVPN qui ne fonctionnait pas sans que j'arrive à en comprendre la raison. Je vais essayer de faire un schéma pour clarifier la situation :

Réseau LAN 192.168.10.0/24 ----- Passerelle internet 192.168.10.1/3.3.3.3 ------ Internet ------ Serveur A 1.1.1.1 --- Internet --- Serveur B 2.2.2.2

Le serveur A fait office de serveur OpenVPN et Passerelle et Serveur B se connectent dessus via OpenVPN en tant que client. La passerelle fait office de routeur pour le réseau 192.168.10.0/24. Le but de cette connexion est de permettre au serveur B de pouvoir accéder au subnet 192.168.10.0/24. Je pensais donc qu'en ajoutant de simples routes cela serait possible...

Voici la configuration d'origine sans iroute :

Serveur A :


local 1.1.1.1 
mode server
proto tcp
port 1194
dev tun
server 10.10.0.0 255.255.255.0
route 192.168.10.0 255.255.255.0 10.10.0.2
#... le reste de la conf ne présente pas d’intérêt

La config des clients ne présente pas non plus d’intérêt pour le moment. Après avoir ajouté les routes sur les différents serveurs je me retrouve avec ces différentes tables de routage :

Serveur A:


10.10.0.0/24 via 10.10.0.2 dev tun0 
10.10.0.2 dev tun0  proto kernel  scope link  src 10.10.0.1 
192.168.10.0/24 via 10.10.0.2 dev tun0

Serveur B:


10.10.0.1 via 10.10.0.21 dev tun0 
10.10.0.21 dev tun0  proto kernel  scope link  src 10.10.0.20 
192.168.10.0/24 via 10.10.0.21 dev tun0

Passerelle :


10.10.0.1 via 10.10.0.11 dev tun0 
10.10.0.11 dev tun0  proto kernel  scope link  src 10.10.0.10 
10.10.0.0/24 via 10.10.0.11 dev tun0

A priori, je pensais qu'un ping depuis serveur B vers un des client sur le lan allait fonctionner... Ce fut un beau fail!


# ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
^C
--- 192.168.10.10 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2014ms

C'est là qu'intervient l'option iroute. Avant que l'on ajoute cette option, le ping va bien du serveur B au serveur A mais lorsque celui-ci est envoyé sur tun0 comme la table de routage lui indique de le faire, il ne sait pas sur quelle interface tun il doit ressortir. Résultat, votre ping est bloqué. Pour que cela fonctionne il faut qu'un des clients annonce au serveur qu'il est la gateway du réseau 192.168.10.0/24. Cela va créer une table de routage interne à OpenVPN qui va permettre de router le trafic au bon endroit. Voici donc la configuration finale qui permet de régler ce problème :

Serveur A :


local 1.1.1.1 
mode server
proto tcp
port 1194
dev tun
server 10.10.0.0 255.255.255.0
client-config-dir ccd
#... le reste de la conf ne présente pas d’intérêt

Coté serveur on va créer un dossier ccd qui va contenir les infos de chaque clients. On a donc simplement ajouté la directive client-config-dir ccd dans la config du serveur. Dans ce dossier nous allons placer les fichiers de conf spécifiques à chaque client qui vont nous permettre, entre autres, de leur attribuer des adresses spécifiques et d'ajouter la route vers 192.168.10.0/24. Pour cela le nom des fichiers doit correspondre au Common Name du certificat du client. Dans notre exemple on va imaginer que les Common name sont Passerelle, ServeurA et ServeurB.


# cat /etc/openvpn/ccd/Passerelle
ifconfig-push 10.10.0.10 10.10.0.11
iroute 192.168.2.0 255.255.255.0

On voit que sur la passerelle nous ajoutons la fameuse option iroute permettant de signaler que c'est ce client qui est connecté à ce réseau et nous fixons également l'ip de son interface tun0 à 10.10.0.10. Pour le serveur B, nous n'avons pas besoin de changer notre config.

Avec cette nouvelle config nous pouvons relancer OpenVPN et si tous se déroule correctement vous devriez voir ceci dans les logs d'OpenVPN :


Sat Apr 20 11:01:12 2013 us=361219 Passerelle/3.3.3.3:59472 MULTI: Learn: 192.168.10.0/24 -> Passerelle/3.3.3.3:59472

Pour vérifier que cela fonctionne, il ne reste plus qu'à effectuer un ping depuis le serveur B vers un client du réseau 192.168.10.0/24 :


ping 192.168.10.2 -c4
PING 192.168.10.2 (192.168.2.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_req=1 ttl=63 time=8.32 ms
64 bytes from 192.168.10.2: icmp_req=2 ttl=63 time=8.67 ms
64 bytes from 192.168.10.2: icmp_req=3 ttl=63 time=8.44 ms
64 bytes from 192.168.10.2: icmp_req=4 ttl=63 time=8.46 ms

--- 192.168.2.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 8.325/8.475/8.672/0.140 ms

Tout fonctionne correctement !

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.