next_inactive up previous


INSTALLATION ET CONFIGURATION DE OpenVPN


Guillaume LEHMANN (lehmann@free.fr)



Contents

Introduction :

Ce document explique comment installer et configurer un VPN, avec OpenVPN, sur des plateformes GUN/Linux Debian. Nous sommes ici en version stable. Au moment de la rédaction de ce document, seules la Sarge et la SID incluent OpenVPN en paquettage.

Pour toute suggestion, ou demande d'aide : lehmann@free.fr


Document en version 0.3 du 14/02/2004.

Installation :

Configuration du noyau :

OpenVPN utilise le périphérique TUN/TAP. Il faut donc que le noyau le prenne en charge. Pour cela nous utiliserons un noyau ayant la fonctionnalité Network device support -> Universal TUN/TAP device driver support activée. Ici, nous demandons que la fonctionnalité soit en dur dans le noyau.


Ensuite, si le périphérique /dev/net/tun n'existe pas, le créer :

mkdir /dev/net/ && mknod /dev/net/tun c 10 200

Installation des paquettages nécessaires :

Il est indispensable d'installer les paquettages suivants :

La commande suivante installe tout cela sans douleur :

apt-get install liblzo-dev liblzo1 libssl-dev libssl0.9.6 openssl autoconf autoconf2.13 automake autotools-dev

Installation de OpenVPN :

Télécharger les sources sur sourceforge.net/projects/openvpn/.

Nous utiliserons ici openvpn-1.3.2.

Copier les sources compressées dans le répertoire /usr/local/src/ et les décompresser. Nous obtiennons alors le répertoire /usr/local/src/openvpn-1.3.2. Se positionner dans le répertoire et taper les commandes suivantes : ./autogen.sh

./configure

make

make install

Configuration EXEMPLE 1:

Cet premier exemple est fortement inspiré de la documentation officielle de OpenVPN. Pour plus de détails, se reporter à cette dernière.

Présentation du réseau :

Nous considérons que nous avons 4 machines comme suit :
|             |  |    192.168.1.1|  |192.168.1.2    |  |             |
| client|--| FW1 |--| FW2 |--|serveur |
|192.168.0.100| |192.168.0.1 | | 192.168.2.1| |192.168.2.100|

Nous avons un client (réseau 192.168.0.0/24) qui tente de se connecter sur un serveur (réseau 192.168.2.0/24) en passant par un réseau non-sûr (réseau 192.168.1.0/24). À chaque sortie/entrée d'un réseau, se trouvent des firewall-routeurs (FW1 et FW2). C'est entre ces 2 machines que nous allons créer un réseau privé virtuel. Ce réseau virtuel reposera sur le réseau 192.168.1.0/24, mais n'utilisera pas ces adresses. Ce nouveau réseau sera 10.4.0.0/24, avec FW1 ayant pour adresse 10.4.0.1 et FW2 ayant pour adresse 10.4.0.2.

Nous allons voir 3 cas :

  1. Tunnel sans crytpage : On établit un réseau privé virtuel, mais les données qui transistent par ce tunnel ne sont pas cryptées.
  2. Tunnel avec cryptage par clef symétrique : On établit une réseau privé virtuel. Les données qui transitent par ce tunnel sont cryptées. Le cryptage et le décryptage se fait par une même clef, présente sur les 2 extrémités du tunnel.
  3. Tunnel avec cryptage par clefs privées et certificat d'authentification : On établit un réseau privé virtuel. Les données qui transitent par ce tunnel sont cryptées. Les clefs privées de cryptages de chaque extrémité ne se trouvent pas aussi sur l'autre extrémité. Nous utilisons aussi des certificats d'authentification.

Tunnel sans cryptage :

Il suffit de lancer à chaque extrémité le tunnel comme suit :

Sur FW1 :

openvpn --remote 192.168.1.2 --port 8000 --dev tun1 --ifconfig 10.4.0.1 10.4.0.2 --comp-lzo --verb 5


Sur FW2 :

openvpn --remote 192.168.1.1 --port 8000 --dev tun1 --ifconfig 10.4.0.2 10.4.0.1 --comp-lzo --verb 5


Quelques explications s'imposent :

On crée un réseau point à point entre les adresses 10.4.0.1 et 10.4.0.2, sur les ports 8000 à chaque extrémité. On compresse les données (option --comp-lzo) afin d'utiliser moins de bande-passante.

Le mode 5 de verbose peut être omis. Pour information, voici les différents niveaux :

  1. [0 :] Aucune message n'est affiché mis à part les erreurs fatales.
  2. [1 :] Affichage des entêtes de départ et des erreurs non-fatales.
  3. [2 :] Affichage de tous les paramètres de configuration.
  4. [3 :] Affichage des messages concernant la négociation des clefs.
  5. [4 :] Affichage des informations sur TLS.
  6. [5 :] Affichage des informations concernant la compression.
  7. [6 :] Affichage sous forme hexadécimale des clefs utilisées.
  8. [7 :] Affichage plus complet sur la négociation des clefs.
  9. [8 :] Affichage de toutes les informations concernant la transaction.

Tunnel avec cryptage par clef symétrique :

Dans un premier temps, il faut créer une clef de cryptage avec openvpn. Ensuite, on crée le tunnel comme précédemment, si ce n'est qu'ici nous précisons que les données doivent être cryptées.


openvpn --genkey --secret LaClef

Copier cette clef sur chaque machine établissant le VPN. Le fichier doit se trouver dans le répertoire courant où nous exécuterons la commande pour lancer le vpn.


Sur FW1 :

openvpn --remote 192.168.1.2 --port 8000 --dev tun1 --ifconfig 10.4.0.1 10.4.0.2 --verb 5 --secret LaClef


Sur FW2 :

openvpn --remote 192.168.1.1 --port 8000 --dev tun1 --ifconfig 10.4.0.2 10.4.0.1 --verb 5 --secret LaClef

Tunnel avec cryptage par clefs privées et certificat d'authentification :

L'autorité de certification sera FW1. Lorsque nous lancerons la création du vpn, il faudra se trouver dans le répertoire où seront copiée les clefs. Par exemple, si le fichier LeFW1.key est sous /root/vpn, alors il faudra lancer la commande openvpn ... en étant dans le répertoire /root/vpn/. Les certificats et autres fichiers que nous allons générer par la suite devront être dans ce même répertoire. Doivent aussi se trouver certains fichiers sur FW1 que nous allons maintant créer (pour savoir quels fichiers et quel chemin utiliser, voir le fichier /etc/ssl/openssl.cnf)


mkdir demoCA

cd demoCA

touch index.txt

echo ``01'' > serial

mkdir newcerts


Toutes les autres manipulations vont se faire sur FW1.


Nous allons maintenant créer les clefs de cryptage :

Voici la clef de FW1 (il faut au-moins renseigner le CommonName) :

openssl req -nodes -new -keyout LeFW1.key -out LeFW1.csr


Voici la clef de FW2 (il faut au-moins renseigner le CommonName en mettant un nom différent que précédemment) :

openssl req -nodes -new -keyout LeFW2.key -out LeFW2.csr


Maintenant, nous créons le certificat :

openssl req -nodes -new -x509 -keyout tmp-ca.key -out tmp-ca.crt


Ensuite nous signons les clefs privées avec le certificat (on obtient la clef publique) :

openssl ca -cert tmp-ca.crt -keyfile tmp-ca.key -out FW1.crt -in FW1.csr

openssl ca -cert tmp-ca.crt -keyfile tmp-ca.key -out FW2.crt -in FW2.csr


Mettre la clef de FW2, la clef publique de FW2, et le certificat (c'est-à-dire les fichiers FW2.key, FW2.crt, et tmp-ca.crt) sur la machine FW2.


Créer, toujours sur FW1, les paramètres Diffie Hellman :

openssl dhparam -out dh1024.pem 1024



Nous pouvons maintenant établir le VPN :

Sur FW1 :

openvpn --remote 192.168.1.2 --port 8000 --dev tun1 -ifconfig 10.4.0.1 10.4.0.2 --tls-server --dh dh1024.pem --ca tpm-ca.crt --cert FW1.crt --key FW1.key --reneg-sec 3000 --comp-lzo --verb 5


Sur FW2 :

openvpn --remote 192.168.1.1 --port 8000 --dev tun1 -ifconfig 10.4.0.2 10.4.0.1 --tls-client --ca tpm-ca.crt --cert FW2.crt --key FW2.key --reneg-sec 3000 --comp-lzo --verb 5


Ensuite, pour que le client puisse contacter le serveur :

Sur FW1 :

echo 1 > /proc/sys/net/ipv4/ip_forward

route add -net 192.168.2.0 netmask 255.255.255.0 gw 10.4.0.2


Sur FW2 :

echo 1 > /proc/sys/net/ipv4/ip_forward

route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.4.0.1


Il y a de forte chance que le firewall bloque le traffic passant par le tunnel. Pour résoudre le problème, taper la commande suivante pour FW1 et FW2 (attention, le filtrage est à affiner, car la commande suivante ouvre TOUT pour le VPN) :

iptables -A FORWARD -i tun1 -j ACCEPT

Configuration EXEMPLE 2:

Présentation du réseau :

Nous compliquons ici le réseau. Nous maquettons Internet. Nous avons nos 2 réseaux privés (192.168.1.0/24 et 192.168.2.0/24) et le VPN (10.4.0.2 et 10.4.0.1). Les 2 réseaux privés sont séparés par un routeur et 2 réseaux publics (195.221.137.0 et 194.200.150.2).
 ____________                                     ____________
| Maxime | | Guillaume |
|192.168.1.10| |192.168.2.10|
| |
| |
| |
| 192.168.1.1 | | 192.168.2.1 |
| FW1 | VPN | FW2 |
|195.221.137.1|10.4.0.2<---------------->10.4.0.1|194.200.150.1|
| |
| |
| |
| |
| |
| |
| |
| 195.221.137.2 |
| | | |
-------------------|INTERNET|-------------------
| |
194.200.150.2

Tunnel sans cryptage et avec cryptage:

Nous ne reprendrons pas tout. Nous indiquerons juste ce qui diffère avec le premier exemple :

Le VPN n'est plus entre 192.168.1.1 et 192.168.1.2, mais entre 195.221.137.1 et 194.200.150.1 .


Les tables de routages sont les suivantes:


Sur FW1 :

echo 1 > /proc/sys/net/ipv4/ip_forward

route add default gw 195.221.137.2

route add -net 192.168.2.0 netmask 255.255.255.0 gw 10.4.0.1


Sur FW2 :

echo 1 > /proc/sys/net/ipv4/ip_forward

route add default gw 194.200.150.2

route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.4.0.2


Sur INTERNET :

Aucune configuration particulière mis à part la reconnaissance des réseaux 192.221.137.0 et 194.200.150.0 (rentré automatiquement dans la table de routage lors de l'activation des interfaces réseaux).

Liens :

Dernière version de ce document :
http://lehmann.free.fr
Site officiel de OpenVPN :
http://openvpn.sourceforge.net
Article en français sur OpenVPN :
Montez un VPN avec OpenVPN dans Linux Magazine de juin 2002

Licence:

Copyright (c) 2003 Guillaume Lehmann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and one Back-Cover Text: "La version originale de ce document a été publiée par Guillaume Lehmann".

About this document ...

The translation was initiated by Lehmann on 2004-02-14
next_inactive up previous
Lehmann 2004-02-14