Configuration OpenVPN

De ClissXXI.

Cette page présente les différentes étapes pour la configuration d'un serveur, puis d'un client OpenVPN. Les indications de configuration du serveur sont données pour une machine sous Debian GNU/Linux, et celles du client indiqueront également la configuration pour les machines Windows.

La configuration réseau, ainsi que l'authentification des clients peuvent prendre différentes formes. Nous ne présentons ici que la configuration d'un réseau routé (généralement conseillé, le réseau ponté -- bridged en anglais -- étant plus rarement nécessaire et plus complexe à configurer), et l'authentification par certificats avec ou sans mot de passe simple. Reportez-vous à documentation officielle d'OpenVPN pour les autres options de configuration possibles.

Sommaire

[modifier] Installation et configuration du serveur

Les instructions ci-dessous sont données pour une machine sous Debian GNU/Linux, mais elles pourront être assez facilement adaptées pour les autres distributions Linux, et le principe général et les fichiers de configuration restent le même pour un serveur sous Windows.

[modifier] Installation du paquet

Installer le paquet openvpn fournissant à la fois les outils client et serveur. Sous Debian, il s'agit simplement du paquet openvpn:

aptitude install openvpn

[modifier] Création de l'autorité de certification et génération du certificat serveur

OpenVPN fournit des scripts permettant de générer les certificats SSL nécessaires pour le serveur comme pour les clients. Par simplicité, nous le copions dans /etc/openvpn avant de le modifier. On initialise ensuite les fichiers qui constitueront l'autorité de certification, et le certificat serveur.

cp /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/pki
cd /etc/openvpn/pki
# éditer le fichier « vars » et y changer les variables désignant l'autorité, qui figureront dans les certificats
# (KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, et KEY_EMAIL)
source ./vars
./clean-all # supprimer et recrée le répertoire keys (Attention: à n'utiliser qu'une fois, il supprime le répertoire keys)
./build-dh # génère la clef keys/dh1024.pem
./pkitool --initca --pass # génération du cerficat et clef de l'AC keys/ca.{crt,key}
./pkitool --server server # génère le certificat et la clef du serveur (qu'on nomme ici « server », le nom importe assez peu)

Les certificats et clefs ainsi générés sont déposés dans le sous-répertoire keys/. On a utilisé ici l'option --pass avec --initca, ce qui entraînera la protection par mot de passe de la clef privée de l'autorité de certificat (AC en anglais). Vous devrez choisir ce mot de passe et bien le conserver puisqu'il sera nécessaire à chaque génération de certificat client (voir la configuration des client, plus bas dans ce document).

Note: si vous disposez déjà d'une autorité de certification, vous pouvez aussi l'utiliser puisqu'il s'agit simplement de certificats SSL, générés ici à l'aide d'openssl par les scripts fournis.

[modifier] Création du fichier de configuration du serveur

On crée ensuite le fichier de configuration du serveur. Sous Debian, tous les fichiers /etc/openvpn/*.conf représentent une connexion à un serveur distant ou bien le lancement du serveur local qui peuvent être lancées ou non au démarrage du daemon openvpn, selon la configuration effectuée dans le fichier /etc/default/openvpn (qui est auto-documenté correctement).

On crée ici le fichier server.conf qui représentera la connexion nommée server qu'on pourra donc choisir de lancer sous ce nom via /etc/default/openvpn (par défaut, toutes les connexions configurées sous lancées au démarrage).

#
# Fichier de configuration du serveur OpenVPN
#
 
# On peut forcer le serveur à se lier à l'IP a.b.c.d
;local a.b.c.d
# Le port 1194 est le port officiel utilisé par défaut
port 1194
proto udp
dev tun
ca pki/keys/ca.crt
cert pki/keys/server.crt
key pki/keys/server.key  # Ce fichier doit être gardé secret
dh pki/keys/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
 
# À l'ouverture du tunnel, on configure le client pour qu'il ajoute une route
# vers le tunnel pour accéder au réseau du serveur, ici 192.168.1.0/24
# Note: si le client est sur un réseau utilisant le même plan IP, vous avez un
# problème.
push "route 192.168.1.0 255.255.255.0"
#
# On souhaite personnaliser la configuration de chaque client via un fichier à
# son nom dans le répertoire /etc/openvpn/ccd (le nom est celui utilisé dans le
# Common Name du certificat utilisé par le client).
client-config-dir ccd
 
# On indique que le serveur OpenVPN est connectée aux réseaux distants
# 192.168.11.0/24 et 192.168.12.0/24. Le serveur redirige les paquets à
# destination de ces réseaux vers OpenVPN (via l'interface tunX), qui s'occupe
# de les router vers les clients concernés.
route 192.168.11.0 255.255.255.0
route 192.168.12.0 255.255.255.0
 
# Permet aux différentes clients de se contacter entre eux
;client-to-client
 
# Décommenter cette option si plusieurs clients utilisent un même certificat
# (sinon l'un des clients sera déconnecté)
;duplicate-cn
 
# Différentes options système et réseau
keepalive 10 120
comp-lzo
;max-clients 100
user nobody
group nogroup
persist-key
persist-tun
 
# OpenVPN créera un fichier texte ce nom contenant des informations sur son
# état (clients connectés, table de routage, stats)
status openvpn-status.log
# Par défaut, les logs sont dans syslog.
# Les lignes ci-dessous permettent d'utiliser un fichier dédié
;log         openvpn.log
;log-append  openvpn.log
 
# Niveau de verbosité
verb 3
;mute 20

Le lancement du serveur se fait en démarrant le service openvpn, ce qui est réalisé, sous debian, par la commande suivante:

/etc/init.d/openvpn start

Mais vous pourriez avoir à modifier légèrement la configuration du serveur pour l'adapter à certains clients, notamment s'ils jouent le rôle de passerelle. Cet aspect est abordé dans les paragraphes ci-dessous.

[modifier] Installation et configuration d'un client

Voici les différentes étapes de la configuration d'un client OpenVPN. Elles sont principalement au nombre de trois:

  • la génération d'une clef et d'un certificat qui authentifieront le client auprès du serveur,
  • la configuration éventuelle du serveur pour les besoins spécifiques du client,
  • l'installation du programme client OpenVPN sur la machine cliente et la création de son fichier de configuration.

Je distingue deux types de clients selon une légère différence: certains n'ont besoin que de connecter une seule machine au réseau auquel se connecte le tunnel (cas d'un ordinateur portable nomade, par exempl), et d'autres vont faire circuler les paquets de leur réseau local via le tunnel à destination du réseau distant (cas de la passerelle d'un réseau local distant se connectant à un autre réseau local). Ce qui distingue le second cas du premier est que le serveur OpenVPN a besoin de savoir quelle plage d'adresses IP utilise le réseau local du client pour pouvoir lui envoyer les paquets correspondants à travers le tunnel. Il sera donc nécessaire d'effectuer une petite configuration supplémentaire dans ce cas (décrite ci-dessous dans « Configuration serveur spécifique au client (cas particulier) »).

[modifier] Génération de la clef et du certificat SSL

Il est tout d'abord nécessaire de générer une clef et un certificat SSL qui authentifieront le client OpenVPN auprès du serveur. Il faut donc réutiliser l'autorité de certification dont l'installation est décrite ci-dessus pour y signer un certificat. Dans le cas de l'utilisation des scripts de génération SSL fournis avec le paquet openvpn telle que présentée plus haut dans ce document, voici les commandes permettant de générer le certificat SSL client:

cd /etc/openvpn/pki
source ./vars
./pkitool --pass client1

Deux points sont à noter:

  • l'option --pass entraîne la protection de la clef privée par un mot de passe que vous devrez fournir. Conservez bien ce mot de passe car il sera nécessaire sur la machine cliente à chaque connexion au VPN. Il est fortement conseillé d'utiliser cette option --pass, sinon n'importe quel utilisateur ayant accès à une machine cliente où est configuré le VPN pourra se connecter à votre réseau privé (c'est également valable en cas de vol de la clef et du certificat client). Le seul cas où il peut être intéressant de ne pas utiliser de mot de passe est le cas de la connexion d'un autre sous-réseau distant via un tunnel. Dans ce cas, le client OpenVPN sera une machine faisait office de passrelle, et on souhaitera donc pouvoir ouvrir le tunnel automatiquement sans avoir à saisir de mot de passe (dans ce cas, il conviendra de prendre soin de limiter au maximum les accès à la clef privée).
  • le nom client1 sera utilisé comme Common Name du certificat généré (c'est à dire le nom distinctif stocké dans ce certificat), et c'est également ce nom qui pourra être utilisé dans la configuration du serveur OpenVPN pour associer une certaine configuration à ce client. Le certificat sera écrit dans le fichier keys/client1.cert et la clef dans keys/client1.key.

[modifier] Configuration serveur spécifique au client (cas particulier)

Dans le cas particulier de la connexion de deux réseaux internes via un tunnel OpenVPN, il est nécessaire de créer une configuration particulière pour le client sur le serveur OpenVPN pour indiquer à quel réseau le serveur a accès lorsque ce client est connecté. Ceci se fait via la création d'un fichier texte au nom du client (plus précisément le CommonName du client utilisé dans son certificat) dans le répertoire désigné dans la configuration serveur par la directive client-config-dir, qui était dans notre exemple (et dans la configuration fournie par défaut), le répertoire ccd (pour Client Configuration Directory).

Dans notre exemple, en supposant sur client1 est situé sur un réseau 192.168.12.0/24, on ajoute la directive iroute 192.168.12.0 255.255.255.0 dans le fichier cdd/client1.

cat <<_EOD_ > ccd/client1
iroute 192.168.12.0 255.255.255.0
_EOD_

Lors de la connexion de client1, le serveur ajoutera une route vers OpenVPN (plus précisément l'interface tunX sous Linux) qui permettra aux paquets à destination à destination de la plage 192.168.12.0/24 d'être envoyés de l'autre côté du tunnel. Bien entendu, il est de la responsabilité de l'administrateur de s'assurer que, sur le réseau du serveur, les paquets à destination des ces IP parviennent au serveur. Ça signifie généralement qu'il est nécessaire que le serveur joue le rôle de passerelle par défaut du réseau local.

[modifier] Installation du client OpenVPN

[modifier] Installation du paquet

[modifier] Sous GNU/Linux

Sur la machine cliente qui ouvrira le tunnel OpenVPN, installez le client. Sous Debian GNU/Linux, cela se résume à l'installation du paquet openvpn:

aptitude install openvpn

Sous les autres distributions Linux, installez le ou les paquets qui fournissent le client openvpn.

[modifier] Sous Windows

Sous Windows, téléchargez et installez le client OpenVPN pour Windows disponible sur http://openvpn.net/index.php/open-source/downloads.html. Il fournit un client OpenVPN graphique fonctionnant sous Windows (XP comme 7). Il suffit de lancer l'installateur et d'accepter les options par défaut.

[modifier] Copie des certificats et clef

Copiez les fichiers ci-dessous dans le répertoire de configuration du client. Sous GNU/Linux, ça peut être n'importe quel répertoire qu'il suffira de préciser dans le fichier de configuration lorsqu'on désignera les fichiers qu'il contient. Dans notre exemple sous Debian, on utilisera, par symétrie avec le serveur OpenVPN, le répertoire /etc/openvpn/pki/keys. Sous Windows il s'agit du répertoire C:\Program files\OpenVPN\config.

Fichiers issus de l'autorité de certification à copier dans le répertoire de configuration du client OpenVPN:

  • ca.crt: le certificat de l'autorité de certification,
  • client1.crt: le certificat du client, généré comme décrit ci-dessus,
  • client1.key: la clef du client, générée en même temps que le certificat, et généralement protégée par un mot de passe.

[modifier] Création du fichier de configuration

Les fichiers de configuration sous GNU/Linux et Windows utilisent le même format, mais quelques particularités de Windows imposent une configuration légèrement différente.

[modifier] Sous GNU/Linux

Créer un fichier texte contenant les directives ci-dessous. Sous Debian, ça peut être le fichier /etc/openvpn/client.conf (ici, client représentera le nom de la connexion qu'on pourra activer au démarrage de la machine via /etc/default/openvpn):

client
dev tun
proto udp
 
remote serveuropenvpn.domaine.tld 1194
resolv-retry infinite
nobind
 
user nobody
group nogroup 
persist-key
persist-tun
 
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
 
comp-lzo
verb 3
;mute 20

[modifier] Sous Windows

Sous Windows, il s'agit d'un fichier texte d'extension .ovpn (par exemple, server.ovpn si vous voulez nommer la connexion server), qu'on placera dans le répertoire C:\Program files\OpenVPN\config, au contenu un peu différent de celui utilisé sous GNU/Linux (en particulier à cause des différence sous Windows 7) pour permettre la mise en place de la route réseau sur la machine :

client
dev tun
route-method exe
route-delay 2
remote serveuropenvpn.domaine.tld 1194
ns-cert-type server
ca <ca>.crt
cert <prenom.nom>.crt
key <prenom.nom>.key
comp-lzo
ping 15
ping-restart 45
ping-timer-rem
persist-tun
persist-key
verb 3

Vous devrez a priori exécuter OpenVPN en tant qu'administrateur pour permettre la modification des routes réseau du système. Pour lancer OpenVPN en tant qu'Administrateur:

  • accédez au répertoire « \Programmes\OpenVPN\bin »
  • clic droit sur « openvpn-gui » et choisissez « Propriétés »
  • dans l'onglet « Comptabilité », cochez la case « Exécuter ce programme en tant qu'administrateur »
  • validez en cliquant sur le bouton OK

Le lancement avec les droits administrateur provoque l'affichage d'une fenêtre popup demandant la confirmation de l'utilisateur pour lancer le programme avec les privilèges de l'Administrateur. La conséquence est aussi que OpenVPN-GUI n'est plus lancé automatiquement au démarrage de la machine.

Il faudra donc que l'utilisateur lance OpenVPN avant de se connecter, ce qui peut être simplifié en créant un racourci qui connecte automatiquement le VPN. Pour ça, créez un lien sur le bureau vers openvpn-gui.exe, puis clic droit / Propriétés, changez le champ « Cible » pour utiliser la valeur suivante:

"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect server.ovpn

Double-cliquez sur ce raccourci pour lancer OpenVPN. Une fenêtre affichera les logs de la connexion, et demandera le mot de passe de la clef privée dans une fenêtre popup. Si tout se passe bien, le tunnel s'ouvrira en quelques secondes, et vous pourrez accéder au réseau local de l'auter côté du tunnel comme si vous y étiez dirrectement branché. En cas d'erreur, analysez le fichier de configuration pour essayer de déterminer le problème. Aidez-vous si nécessaire de documentation officielle d'OpenVPN (vous devrez peut-être adapter la configuration du client donnée ici).

Nota Bene: une fois le VPN connecté, il faut attendre plusieurs secondes avant de pouvoir utiliser les disques réseaux se connectant au réseau de l'autre côté du tunnel, sous peine d'obtenir une fenêtre d'erreur annonçant une erreur de reconnexion.

cf: http://community.openvpn.net/openvpn/wiki/OpenVPN-GUI

[modifier] En cas de problème

[modifier] Consultez les logs

Si vous ne parvenez pas à vous connecter, consultez tout d'abord les journaux système. Par défaut, OpenVPN logge ses informations via syslog, on les retrouve donc dans /var/log/daemon.log. Vous pouvez augmenter la verbosité du serveur en modifiant la valeur de la directive verb. Passez-la par exemple à 6 pour avoir un maximum de détails.

[modifier] Vérifiez les règles de pare-feu

Si, lors d'une connexion, votre client ne parvient pas à se connecter au serveur et que vous n'avez aucun log sur le serveur, il s'agit sans doute d'un problème de pare-feu. Vérifiez que les pare-feu entre le client et le serveur laissent bien passer les connexions à OpenVPN. Il s'agit d'autoriser les connexions au serveur sur le port UDP 1194 (à moins que vous n'ayez choisi une autre configuration).

Si vous utilisez iptables, la commande suivante permet d'ouvrir le port:

iptables -A INPUT -p udp --dport 1194 -j ACCEPT

Vous aurez peut-être aussi besoin d'autoriser le routage des paquets sur les interfaces tun*. Vous pouvez aussi préviser une interface tun en particulier dans le fichier de configuration du serveur OpenVPN en remplaçant la ligne dev tun par dev tun1 par exemple, ce qui peut être intéressant si vous voulez autoriser le routage de façon spéciale pour OpenVPN. Ici, on accepte le routage vers et en provenance de toutes les interfaces tun:

iptables -A FORWARD -o tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

Ces règles ne sont bien sûr que des exemples à affiner selon vos besoins et la configuration de votre serveur.

[modifier] Pour plus d'information

Pour plus d'information sur OpenVPN, vous pouvez consulter les sites suivants: