VPN : NAT avec plusieurs réseaux identiques

Il arrive parfois qu’il faille relier via VPN plusieurs site ayant des réseau avec la même plage d’adresse. C’est le cas lorsqu’une entreprise un peu étendue décide de mettre en place un VPN, chaque site avait son propre plan d’adressage et généralement c’est en 192.168.0.x donc tous les sites se retrouvent avec le même plan d’adressage.

La meilleure méthode est de modifier le plan d’adressage de chaque site, mais dès qu’il y a des équipements exotiques (c’est à dire presque toujours si l’entreprise est un peu grosse) cela devient compliqué.
Et parfois c’est un VPN entre des entités distinctes, pas exemple un hôpital divers cabinets/cliniques/laboratoires. Le tout avec des services informatiques différents… dont certains totalement incompétents. Il devient alors quasi-impossible de changer le plan d’adressage de certains sites.

Avec OpenVPN il est relativement facile de faire face à cette situation. Il faut utiliser la version 2.3 au moins (on en est à la 2.4 au moment de l’écriture de ce billet), et cela dispense de bricolages tels qu’utiliser netfilter, créer des NAT, etc.

Côté serveur il faut manuellement attribuer le plan d’adressage de chaque site, donc pas d’option server, il faut utiliser ifconfig ou ifconfig-push :

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

Les lignes route + push route + client-natsont nécessaires si on souhaite communiquer entre les routeurs de chaque site. Sinon on peut supprimer ces lignes.

Il faut ensuite choisir le plan d’adressage global du VPN. Par exemple 10.10.0.0/16 :

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

On indique maintenant aux clients d’utiliser un NAT 1:1. Par exemple pour le site numéro 11 :

# /etc/openvpn/ccd/client11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

La première ligne configure l’adresse du routeur du site
La seconde et la dernière lignes permettent au routeur du site de communiquer via son interface en 10.99.99.x
La troisième et quatrième lignes mettent en place la source et la destination du NAT 1:1
La cinquième ligne indique quoi faire avec les paquets NATés

Cette méthode permet de connecter des sites sans subir aucun hôte masqué, sans avoir à « ouvrir des ports », et fonctionne avec toutes les instances d’OpenVPN (Lunix, Windows, Mac).

Pour joindre un hôte d’un site distant, on utilise son adresse ip « virtuelle » : 10.10.11.x
10.10 = le plan d’adressage qui a été choisi
11 = numéro du site
x = le dernier octet de l’adresse de l’hôte. Par exemple un hôte en 192.168.0.37 devient 10.10.11.37

Seuls de rares équipements (dont la pile réseau est mal implémentée, ou le logiciel mal écrit) refusent de fonctionner avec ce système.
Les partages Windows, le bureau à distance, les systèmes de téléintervention, les imprimantes, etc, fonctionnent bien.