Julien De Bona
Free Software, Cooking, and Everything


OpenVPN entre réseaux

Publié le 2011-06-17.

Mon PC servant en partie de terrain d'expérimentation, j'ai tendance à déplacer certaines fonctions vers mon serveur, plus stable par nature. Dans ce cas-ci, mon client VPN est installé sur mon serveur, rendant le VPN utilisable par tous les ordinateurs de mon réseau sans que rien ne soit installé sur ceux-ci. L'objectif présente quelques challenges:

  • routage
  • résolution de noms
  • NAT

La technique est finalement assez simple quand les prérequis sont déjà fonctionnels. Je ne les expliquerai pas ici, l'intérêt est d'expliquer le genre de résultat qu'on peut obtenir facilement. Ces services sont:

  • le client OpenVPN
  • un serveur DNS (BIND)
  • iptables

Comme d'habitude, je travaille sous Debian (Squeeze).

La résolution de noms

Les ordinateurs de mon réseau doivent être capables de résoudre les noms dans les réseaux situés de l'autre côté du VPN. Je possède mon serveur DNS qui résoud les noms dans mon réseau interne et sur Internet. Le fichier named.conf contient une ligne:

include "/etc/bind/named.conf.local";

Ce fichier inclus contient les définitions des zones de mon réseau. Pour les besoins du VPN, j'en fais une copie vers /etc/bind/named.conf.local.normal . J'en fais également une copie vers /etc/bind/named.conf.local.vpn , dans laquelle j'ajoute les définitions des zones accessibles par le VPN. Cez zones sont de type "forward", par exemple:

zone "domaine.com" {
type forward;
forward only;
//adresse du serveur DNS capable de résoudre les noms en domaine.com
forwarders {1.2.3.4;};
}

Une fois ces fichiers créés, il suffit de copier le bon fichier vers named.conf.local et de recharger bind lors de l'établissement et la coupure d'OpenVPN. On peut mettre les commandes dans 2 scripts vpn-up.sh et vpn-down.sh dans /etc/openvpn et ajouter les lignes suivantes dans le fichier de configuration d'OpenVPN:

script-security 2
up /etc/openvpn/vpn-up.sh
down /etc/openvpn/vpn-down.sh

La première ligne permet d'exécuter les scripts, les deux suivantes définissent les scripts à lancer. Ceux-ci doivent bien sûr être exécutables.

Routage et NAT

Le serveur d'OpenVPN fournit au client les entrées nécessaires pour sa table de routage. Il reste à ajouter au firewall (ça peut se faire de manière statique via les scripts d'init) une règle de masquerading pour le trafic sortant par le VPN (interface tun0 dans mon cas):

iptables -A POSTROUTING -o tun0 -j MASQUERADE

Evidemment, les règles de filtrage doivent être adaptées si nécessaire.

(Optionnel) domaines de recherche

La technique décrite ci-dessus requiert d'utiliser les FQDN des ordinateurs accédés via la VPN. Pour pouvoir utiliser les noms simples, il faut sur chaque ordinateur (pas de miracle ici) ajouter le nom de domaine (domaine.com) à la ligne "search ..." de /etc/resolv.conf si sa configuration est statique. Dans le cas d'une configuration par DHCP, cela peut être fait en l'ajoutant à la valeur de l'option "domain-name" dans dhcpd.conf (séparé de la valeur précédente par un espace).

Notes

Tout cela n'est que suggestion. Non pas que ça ne marche pas, mais plutôt que ça peut être modifié pour l'utilisation d'un autre VPN (ex: PPTP) ou une autre topographie de réseau.


tags: linux, reseau

Quelques tags ...