OpenVPN

Introduction

J'ai souhaité mettre en place un VPN SSL chez moi pour permettre à des amis d'accéder à mon réseau local dans le but de partager des données mais surtout pour jouer en réseau.

De plus, la solution présentée ci-dessous me permet de me connecter à mon réseau local depuis un réseau d'entreprise. En effet un simple accès à Internet sur le port TCP 443 (HTTPS) suffit, ce qui est souvent le cas en entreprise qui laisse au moins passer HTTP et HTTPS.

Réseau OpenVPN

Le schéma représente mon architecture réseau :

  • mon réseau local en jaune (192.168.1.0/24):
    • un modem routeur (Livebox) (192.168.1.1)
    • un serveur Linux pour installer le serveur OpenVPN (192.168.1.2)
    • un ou plusieurs postes (192.168.1.3, ...)
  • Internet.
  • un réseau d'entreprise ou le réseau d'un ami en bleu.

Le but est donc de créer un tunnel entre le client et le serveur pour que le client situé dans le réseau bleu accède à mon réseau local.

Pour une communiquer avec un poste de mon LAN (192.168.1.3), le client (10.8.0.6) passera donc par le tunnel jusqu'au serveur OpenVPN (10.8.0.1) et sera ensuite routé sur mon LAN.

Installation

Avec OpenVPN, la notion de client et de serveur n’existe pas étant donné que c’est le même logiciel qui peut faire office de client ou de serveur. Dans mon cas, le serveur est installé sur une Debian et les clients sont sous Windows XP.

Installation du serveur sous Debian

OpenVPN

Paquet à installer :

# apt-get install openvpn

Questions posées après l’installation du paquet :

  • Faut-il créer un périphérique TUN/TAP ? Oui
  • Faut-il arrêter openvpn avant de le mettre à jour ? Non

OpenVPN permet à l'aide de l'outil « liblzo1 » de compresser les données passant dans le tunnel VPN pour limiter l’utilisation de la bande passante.

# apt-get install liblzo1
OpenSSL

Pour sécuriser le tunnel VPN, OpenVPN utilise le programme OpenSSL :

# apt-get install openssl

Installation des client sous Windows XP

Une version de OpenVPN avec interface graphique est disponible sur le site openvpn.se :

La version stable actuelle est basée sur OpenVPN 2.0.9 et gui 1.0.3:

Lancez l’installation en gardant les options par défaut. Lorsque l’on va vous demander d’installation un nouveau composant sur le système, faites « continuer ». Il s’agit de la carte réseau virtuelle « TAP-Win32 Adapter V8 ».

Il est possible de télécharger l'interface graphique en français:

Remplacer le fichier "C:\Program Files\OpenVPN\bin\openvpn-gui.exe" par celui que vous venez de télécharger.

Création des certificats et des clés

La partie la plus compliquée et la plus fastidieuse dans la mise en place d’un serveur OpenVPN concerne la génération des clés et des certificats. OpenVPN est livré avec plusieurs scripts permettant de générer plus facilement les clés et les certificats pour OpenSSL. Sous Linux ces scripts sont enregistrés dans le dossier « easy-rsa » :

# cd /usr/share/doc/openvpn/examples/easy-rsa/

Sous Windows:

# cd C:\Program Files\OpenVPN\easy-rsa

La manipulation suivante est réalisée sur le serveur, donc sous Linux pour moi.

Initialisation

Avant d’utiliser les scripts, il faut éditer le fichier « vars » pour initialiser les variables par défaut indiquées à la fin de ce fichier. Par exemple : - export KEY_COUNTRY=FR - export KEY_PROVINCE=France - export KEY_CITY=Rennes - export KEY_ORG=Nemako - export KEY_EMAIL="fred@email.fr"

Une fois le fichier modifié, il faut initialiser les variables pour les scripts :

# . ./vars

Le script suivant, permet de créer ou de réinitialiser le sous-dossier « keys » :

# ./clean-all

Création du certificat de l’autorité de certification (CA)

Le script suivant permet de créer dans « keys » le certificat principal du serveur « ca.crt » et la clé correspondante « ca.key » :

# ./build-ca

Pour les questions, la plupart des champs sont renseignés par défaut sauf le « Common Name » qu’il faut renseigner manuellement.

Création du certificat et de la clé pour le serveur OpenVPN

Le script suivant permet de créer dans « keys » le certificat « NemakoVPNSSL.crt » et la clé « NemakoVPNSSL.key » pour le serveur VPN nommé par exemple « NemakoVPNSSL » :

# ./build-key-server NemakoVPNSSL

Pour les questions, tous les champs sont renseignés par défaut sauf le « Common Name » qu’il faut renseigner manuellement. De plus il n'est pas nécessaire de renseigné le champ « password ».

Création du certificat et de la clé pour un client OpenVPN

Le script suivant permet de créer dans « keys » le certificat « user_fred.crt » et la clé « user_fred.key » pour le client VPN nommé par exemple « user_fred » :

# ./build-key user_fred

ATTENTION : il faut renouveler cette opération pour chaque client. Pour les questions, tous les champs sont renseignés par défaut sauf le « Common Name » qu’il faut renseigner manuellement. Exemple « fred ». Chaque « Common Name » de chaque client doit être différent. Il n'est pas obligatoire de renseigné le champ « password ».

Création du paramètre Diffie Hellman

Le script suivant permet de créer dans « keys » le fichier « dh1024.pem » :

# ./build-dh

Création de la clé spéciale pour éviter les attaques dites "Man in the middle"

# openvpn --genkey --secret keys/ta.key

Résumé des certificats et des clés

Serveur

Le serveur a besoin de 5 fichiers:

  • Certificat du serveur de certification (CA) OpenSSL: ca.crt (non secret)
  • Clé du serveur de certification (CA) OpenSSL: ca.key (secret)
  • Certificat du serveur OpenVPN: NemakoVPNSSL.crt (non secret)
  • Clé du serveur OpenVPN: NemakoVPNSSL.key (secret)
  • Paramètre Diffie Hellman: dh1024.pem (non secret)
  • Clé d'autorisation pour accès au démon: ta.key (secret)

Ces 6 fichiers sont à copier sur le serveur OpenVPN dans /etc/openvpn/ :

# cp ./keys/ca.crt /etc/openvpn/
# cp ./keys/ca.key /etc/openvpn/
# cp ./keys/NemakoVPNSSL.crt /etc/openvpn/
# cp ./keys/NemakoVPNSSL.key /etc/openvpn/
# cp ./keys/dh1024.pem /etc/openvpn/
# cp ./keys/ta.key /etc/openvpn
Client

Le client a besoin de 3 fichiers, à copier dans « C :\Program Files\OpenVPN\config », ces fichiers servant à l’authentification du client via OpenSSL :

  • Certificat du serveur de certification (CA) OpenSSL: ca.crt (non secret)
  • Certificat du client OpenVPN: user_fred.crt (non secret)
  • Clé du client OpenVPN: user_fred.key (secret)
  • Clé spéciale contre attaque MITM: ta.key (secret)

Configuration

Serveur

Création d’un utilisateur avec des droits limités pour OpenVPN

Pour limiter les risques d’attaques sur OpenVPN, il est important que le processus d’OpenVPN fonctionne sur un utilisateur n’ayant aucun droit sur le système. Souvent, l’utilisateur « nobody » est utilisé par défaut, mais il est encore plus sécurisant de faire tourner chaque processus avec un utilisateur différent. Donc, pour le processus OpenVPN, nous allons créer l’utilisateur « openvpn » :

# groupadd openvpn
# useradd -d /dev/null -g openvpn -s /bin/false openvpn
Fichier de configuration du serveur

Par défaut OpenVPN est fourni avec plusieurs fichiers d’exemples enregistrés dans le dossier :

  • /usr/share/doc/openvpn/examples/sample-config-files/

Pour configurer le serveur, je suis parti du fichier d’exemple « server.conf.gz », qu’il faut donc décompresser et mettre en place dans « /etc/openvpn » :

# cd /usr/share/doc/openvpn/examples/sample-config-files/
# gunzip server.conf.gz
# cp server.conf /etc/openvpn/

Il suffit ensuite d’adapter ce fichier en fonction des besoins. La seule contrainte que je dispose est de vouloir faire passer le tunnel par un firewall d'entreprise. Ainsi j'ai choisi de passer en https (tcp et port 443). Voici donc la configuration de mon serveur:

# Ports en écoute
port 443

# TCP or UDP server?
proto tcp

# ==> port 443 + tcp = HTTPS

# Type d'interface réseau virtuelle créée
dev tun

# Nom des fichiers servant à l'authentification des clients via OpenSSL
ca ca.crt
cert NemakoVPNSSL.crt
key NemakoVPNSSL.key  # This file should be kept secret

dh dh1024.pem

tls-auth ta.key 0

# Adresse du réseau virtuel (Le serveur aura l'adresse 10.8.0.1)
server 10.8.0.0 255.255.255.0

# Maintain a record of client <-> virtual IP address
# associations in this file.  If OpenVPN goes down or
# is restarted, reconnecting clients can be assigned
# the same virtual IP address from the pool that was
# previously assigned.
ifconfig-pool-persist ipp.txt

# Push routes to the client to allow it
# to reach other private subnets behind
# the server.  Remember that these
# private subnets will also need
# to know to route the OpenVPN client
# address pool (10.8.0.0/255.255.255.0)
# back to the OpenVPN server.
push "route 192.168.1.0 255.255.255.0"

# Les clients peuvent se voir
client-to-client

keepalive 10 120

# Activation de la compression
comp-lzo

# uset et group pour le processus
user openvpn
group openvpn

# Ces lignes permettent de rendre persistante la connexion
persist-key
persist-tun

# Output a short status file showing
# current connections, truncated
# and rewritten every minute.
status openvpn-status.log

# Niveau de log
verb 1
Démarrage du serveur OpenVPN

La commande suivante permet de démarrer ou redémarrer le serveur :

# /etc/init.d/openvpn restart

Ne pas hésiter à regarder dans les logs que tout c’est bien passé :

# tail -100 /var/log/syslog

En cas de problème, et pour trouver l’origine de celui-ci il faut augmenter le niveau des logs en changeant le paramètre « verb » du fichier de configuration :

  • verb 3 : Suffisamment de logs dans la plupart des cas.
  • verb 9 : Énormément de logs.

Bien vérifier également que le processus tourne sous l’utilisateur « openvpn »

# ps aux | grep openvpn

Pour finir, si tout c’est bien passé l’interface « tun0 » doit apparaître dans la configuration du réseau :

# ifconfig
...
tun0      Lien encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
         inet adr:10.8.0.1  P-t-P:10.8.0.2  Masque:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:100
         RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Client Windows

Installation

L'installation ne pose aucun problème. Un simple avertissement lors de la création de l'interface.

Fichier de configuration du client

Pour éditer le fichier, il est possible de faire un clic droit sur l’icône « OpenVPN » situé à gauche de l’heure et de choisir l’option « Éditer la configuration ». Le fichier se trouve sous « C:\Program Files\OpenVPN\config\client.ovpn ». Voici l'exemple d'un fichier de configuration d'un client

client
dev tun
proto tcp

remote monip.ath.cx 443

resolv-retry infinite
nobind

persist-key
persist-tun

ca ca.crt
cert user_fred.crt
key user_fred.key
tls-auth ta.key 1

comp-lzo

verb 3
Lancement du client graphique Windows

OpenVPN Gui Pour lancer la connexion, il suffit de faire un clic droit sur l’icône « OpenVPN » situé dans le systray et de choisir l’option « Connecter ».

Si tout se passe bien, une fenêtre affichant les logs doit s’afficher. Selon la couleur de l'icône le statu de la connexion est différent:

  • vert: la connexion est fonctionnelle,
  • jaune: il y a un problème (regarder les logs),
  • rouge: connexion désactivée.

Une fois la connexion établie, il doit être possible de pinguer le serveur soit sur son adresse virtuelle (ex : 10.8.0.1 dans notre cas) soit sur son adresse réelle (ex : 192.168.1.2).

Démarrer OpenVPN en tant que service

Il est possible de démarrer OpenVPN en tant que service au démarrage de la machine. Il suffit simplement d'aller sur le service OpenVPN Service et de le passer en Automatique. Le fichier de configuration situé dans le dossier config est automatiquement utilisé. OpenVPN en tant que service Windows

Client Mac OS X

Tunnelblick - OpenVPN for Mac OS X Le client disponible pour Mac OS X est Tunnelblick. La dernière version est Tunnelblick_3.0_rc3. www.tunnelblick.net. Le fichier de configuration se terminant en .conf ainsi que les certificats et clés sont à placer dans ~/Library/openvpn. Une fois l'interface graphique lancée, il est possible de se connecter ou de regarder en détails les logs.

Routage

A cet instant le tunnel VPN SSL est operationnel. Cependant le client OpenVPN ne peut pas encore se connecter aux machines situés dans le réseau local.

Activation du routage sur le serveur OpenVPN

Pour cela, il faut activer le forwarding avec la commande suivante :

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

La commande suivante, permet de vérifier que le forwarding est bien activé :

# cat /proc/sys/net/ipv4/ip_forward

Pour que la modification soit prise en compte au redémarrage, modifier le fichier /etc/sysctl.conf pour avoir:

net.ipv4.conf.default.forwarding=1

Pour info, sous Debian Etch le fichier /etc/network/options avec ip_forward=yes n'est plus d'actualité. Cette option fonctionne toujours mais vous obtiendrez un jolie message : /etc/network/options is deprecated (see README.Debian of netbase)..

Configuration des postes du réseau local

Actuellement, les clients OpenVPN connaissent l'existence du réseau 192.168.1.0/24 en passant par le serveur 10.8.0.1. Cependant les postes du réseau local ne connaissent pas le réseau 10.8.0.0/24.

Mon serveur VPN est à l’adresse 192.168.1.2, il faut ajouter une route manuellement sur chaque poste du réseau avec la commande suivante sous Windows :

C:\>route add 10.8.0.0 mask 255.255.255.0 192.168.1.2 -p

Pour ajouter une route sous Linux, il faut utiliser la commande suivante :

# route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.1.2

Configuration de la gateway

Pour éviter de devoir ajouter manuellement sur chaque poste du réseau une route, il faut ajouter une route statique au niveau de la passerelle. Ainsi lorsqu'un utilisateur du LAN souhaite communiquer avec un noeud situé dans le réseau 10.8.0.0/24, il contacte sa gateway qui redirige le paquet sur le serveur OpenVPN.

Enfin dans le cas où le serveur se situe dans un réseau privé, et est donc derrière un NAT, il faut penser à faire la correspondance entre le port et le serveur sur la gateway. Dans mon cas il faut faire correspondre le port 443 au serveur 192.168.1.2.

Partage de fichiers sous Windows XP SP2

Par défaut, seuls les utilisateurs de son propre réseau peuvent accéder aux dossiers partagés. Il faut donc configurer le firewall pour permettre aux utilisateurs du réseau 10.8.0.0/24 d'accéder à ces partages.

Démarrer > Panneau de Configuration > Pare-feu Windows

La suite en images: Configuration du firewall de Windows XP SP2 pour OpenVPN Configuration du firewall de Windows XP SP2 pour OpenVPN

Sources et Liens

  • Mise en place d’un réseau privé virtuel (VPN) sous Windows avec OpenVPN sur forum.hardware.fr
    • Article intéressant pour comprendre la génération du certificat et de la clé pour les clients. J'ai utilisé la génération locale des clés, mais l'article présente aussi la génération de la clé par le client suivi d’une demande de certificat signé au serveur.
  • Installation OpenVPN 2.01 sur une Debian Sarge
  • OpenVPN 2 HOWTO français