OpenVPN : Mise en place d'OpenVPN sur différentes plateformes

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
Flattr-badge-large.png

OpenVPN

Software version OpenVPN 2.x
Operating System Debian 6
OpenBSD 5.9
FreeBSD 9
Website OpenVPN Website
Last Update 30/05/2013
Others

1 Introduction

OpenVPN est de nos jours, ce qui se fait de mieux en matière de VPN software.

OpenVPN permet à des pairs de s'authentifier entre eux à l'aide d'une clé privée partagée à l'avance, de certificats ou de couples de noms d'utilisateur/mot de passe. Il utilise de manière intensive la bibliothèque d'authentification OpenSSL ainsi que le protocole SSLv3/TLSv1. Disponible sous Solaris, OpenBSD, FreeBSD, NetBSD, Linux (Debian, Redhat, Ubuntu, etc...), Mac OS X, Windows 2000, XP, Vista et 7, il offre aussi de nombreuses fonctions de sécurité et de contrôle.

OpenVPN n'est pas compatible avec IPsec ou d'autres logiciels VPN. Le logiciel contient un exécutable pour les connexions du client et du serveur, un fichier de configuration optionnel et une ou plusieurs clés suivant la méthode d'authentification choisie.

2 Installation

2.1 Debian

Pour Debian ou Debian like (Ubuntu par exemple) c'est très simple :

Command aptitude
aptitude install openvpn

Vous pouvez en plus de cette doc, jetter un coup d'oeil dans "/etc/default/openvpn". Il y a des options très intéressantes.

2.2 FreeBSD

Sous FreeBSD, c'est simple également :

Command
pkg_add
pkg_add -vr openvpn

2.3 OpenBSD

Sous OpenBSD :

Command pkg_add
pkg_add -iv openvpn

3 Configuration

3.1 Authentification via identifiants

La double authentification utilisant PAM permet d'ajouter un niveau de sécurité à l'authentification par certificat. Cette solution pourra par exemple être utilisé pour un déploiement utilisant un unique certificat partagé entre tous les utilisateurs et permettra d'avoir tout de même une méthode d'authentification.
Enfin, l'authentification par PAM peut permettre de gérer les utilisateurs dans une base LDAP.

Toute ma configuration a été faite sous OpenBSD. Je vais quand même essayer de faire la doc pour Linux également par rapport à ce que j'aurais trouvé.

3.1.1 Serveur

Installons le package adequat (car c'est un plugin non intégré à OpenVPN aujourd'hui) :

Command pkgadd
pkgadd -iv openvpn_bsdauth

  • Ajoutons ces lignes dans la configuration du serveur pour l'authentification par identifiants sous Linux :
Configuration File /etc/openvpn/server.conf
# OpenVPN PAM Auth
plugin /usr/lib/openvpn/openvpn-auth-pam.so common-auth

ou

plugin openvpn-auth-passwd.so _openvpnusers

_openvpnusers : correspond au nom du groupe ayant le droit de se connecter

  • Si vous êtes sous BSD :
Configuration File /etc/openvpn/server.conf
# OpenVPN BSD Auth
auth-user-pass-verify /usr/local/libexec/openvpn_bsdauth via-file

Ajoutez ensuite les personnes que vous souhaitez pouvoir se connecter dans groupe '_openvpnusers'.

Redémarrez le serveur OpenVPN.

3.1.2 Client

  • Login avec prompt

Au niveau client, voici ce qu'il faut rajouter :

Configuration File client.conf
# OpenVPN PAM/BSD authentification
auth-user-pass

Maintenant, quand vous essayerez de lancer votre connexion, il vous demandera un login et un mot de passe.

  • Login automatique

Si vous souhaitez avoir un login et password automatique, il va falloir mettre dans un fichier le login et mot de passe comme ceci :

Configuration File auth.conf
login
password

Assurez vous que vous soyez le seul a avoir les droits sur ce fichier :

Command chmod
chmod 600 auth.conf

Et rajoutez ceci dans client.conf :

Configuration File client.conf
# OpenVPN PAM/BSD authentification
auth-user-pass auth.conf

Maintenant, lancez la connexion, il ne vous sera rien demander.

3.2 Authentification par clefs

3.2.1 Serveur

Nous allons créer ici les certificats pour l'authentification. Il va falloir créer un certificat root, puis des certificats pour les clients. Editez le fichier suivant et adaptez suivant votre configuration :

Configuration File /usr/share/doc/openvpn/examples/easy-rsa/2.0/vars
 ...
 export KEY_SIZE=1024
 export CA_EXPIRE=36500
 export KEY_EXPIRE=36500
 export KEY_COUNTRY="FR"
 export KEY_PROVINCE="PA"
 export KEY_CITY="Paris"
 export KEY_ORG="Deimos-Corp"
 export KEY_EMAIL="deimos@deimos.fr"
 ...

Ici, j'ai mis l'expiration des clefs à 10 ans pour ne pas avoir à regénérer des clefs tous les 4 matins. Ensuite déplacez vous dans le dossier de documentation d'OpenVPN pour trouver tous les scripts qui vous permettrons de générer les certificats :

Command
# FreeBSD : /usr/local/share/easy-rsa
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/
. ./vars
./clean-all
./build-ca
./build-key-server server
./build-dh
cd keys
openvpn --genkey --secret ta.key
cp *.key *.c* *.pem /etc/openvpn

Remplacez server par le nom de votre serveur ou se trouve openvpn.

3.2.2 Générer des certificats clients

Toujours côté serveur, pour les clients, procéder comme ceci pour chacun d'eux :

Command
./build-key deimos
mv keys/deimos* /etc/openvpn

3.3 Réservations d'IP des clients

Ajoutez ceci dans la conf d'openvpn si vous voulez faire des réservations d'IP :

Configuration File /etc/openvpn/openvpn.conf
#Répertoire contenant la configuration pour chaque client (par exemple adresse IP fixe)
client-config-dir /etc/openvpn/clients

N'oubliez pas de créer le dossier /etc/openvpn/clients.
Ensuite, il faut un fichier de configuration par client (/etc/openvpn/clients/<CN indiqué sur le certificat du client>)
Prenon exemple sur la machine srv1 (fichier /etc/openvpn/clients/srv1) :

Configuration File /etc/openvpn/clients/srv1
ifconfig-push 10.8.0.50 10.8.0.51

(l'adresse 10.8.0.51 est utilisé comme "Peer Point" pour le serveur OpenVPN)

4 Configuration clients

Voici les différents types de configurations possible.

4.1 Windows

Il faut tout d'abord télécharger OpenVPN GUI. Ensuite, placer les clefs dans C:\Program Files\OpenVPN\Config et le fichier de configuration aussi. Mais il faut le renomer en config.ovpn (ou xxxx.ovpn)

Configuration File C:\Program Files\OpenVPN\Config
client
dev tun
proto udp

remote @IP 5000

resolv-retry infinite
nobind

tls-client

persist-key
persist-tun

ca ca.crt
cert deimos.crt
key deimos.key

comp-lzo

verb 1

Il faut maintenant vérifier le service OpenVPN, si l'on veut une connection permanante, ou bien

4.2 Mac OS X

Sur Mac, le GUI est Tunnel Blick. Il faut lui apliquer ce type de configuration et placer les clefs au bon endroit :

Configuration File ~/.openvpn/client.conf
client
dev tun
proto udp

remote @IP 5000

resolv-retry infinite
nobind

tls-client

persist-key
persist-tun

ca /Users/deimos/Library/openvpn/ca.crt
cert /Users/deimos/Library/openvpn/deimos.crt
key /Users/deimos/Library/openvpn/deimos.key

status /Users/deimos/Library/openvpn/openvpn-status.log

comp-lzo

verb 3

Il ne reste plus qu'a faire "Connecter openvpn" sur le tunnel placé en haut à droite.

4.3 Linux

Sur Linux, il suffit d'installer openvpn et appliquer la configuration client identique à celle de Windows.

Ensuite, pour lancer le client :

Command openvpn
openvpn --config /home/deimos/.openvpn/client.conf

Pour que la connection VPN s'auto-établisse, il faut nommer le fichier de conf avec le même nom que les certificats.

Si vous voulez un client graphique sous Linux, Ubuntu a son propre Network Manager et avec un petit plugin d'installé, il le gère très bien :

Command apt-get
apt-get install network-manager-openvpn

5 Ma configuration

Parcequ'il n'est pas toujours facile de voir à quoi ressemble une configuration qui fonctionne, voici les miennes.
Attention pour les gens qui veulent tenter à l'arrache sans avoir lu la doc, j'utilise la double authentification. Supprimez les lignes qui ne vous intéresse pas après avoir lu la doc.

5.1 Serveur

Je lance mon serveur avec ces lignes :

Configuration File /etc/hostname.tun0
up
!/usr/local/sbin/openvpn --config /etc/openvpn/server.conf --tmp-dir /tmp --daemon --script-security 2 > /dev/null 2>&1

Configuration File /etc/openvpn/server.conf
local 192.168.10.254
port 1194
proto udp
dev tun0
ca /etc/openvpn/ca/ca.crt
cert /etc/openvpn/srv/mufasa.crt
key /etc/openvpn/srv/mufasa.key
dh /etc/openvpn/dh1024.pem
server 192.168.20.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "route 192.168.0.0 255.255.255.0"
push "route 192.168.100.0 255.255.255.0"
push "route 192.168.200.0 255.255.255.0"
push dhcp-option "DNS 192.168.100.3"
push dhcp-option "DOMAIN deimos.fr"
client-to-client
keepalive 10 120
tls-auth /etc/openvpn/srv/ta.key 0
auth-user-pass-verify /usr/local/libexec/openvpn_bsdauth via-file
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

5.2 Client

Cette configuration me sert à avoir une connexion complètement automatique :

Configuration File /home/deimos/.openvpn/client.conf
client
dev tun
proto tcp
remote mufasa.deimos.fr 1194
resolv-retry infinite
nobind
tls-client
persist-key
persist-tun
keepalive 10 120
ca /etc/openvpn/ca.crt
cert /etc/openvpn/shenzi.crt
key /etc/openvpn/shenzi.key
tls-auth /etc/openvpn/ta.key 1
status /etc/openvpn/openvpn-status.log
comp-lzo
verb 3
auth-user-pass /etc/openvpn/auth.cfg
auth-retry nointeract

Pour info, voici les options qu'il faut paramétrer :

  • keepalive : permet la reconnection automatique en cas de perte
  • auth-user-pass : permet de stocker dans un fichier mes identifiants
  • auth-retry : permet de ne pas avoir d'interraction
  • auth-nocache : cette directive n'est pas mise volontairement. Si vous la mettez, les identifiants seront droppés de la mémoire à la première connexion et à la première déconnexion, aucune reconnexion automatique ne fonctionnera. Celà se traduit généralement par un message du type : "ERROR: could not read Auth username from stdin".

6 FAQ

6.1 WARNING: No server certificate verification method has been enabled

Il manque tout simplement cette ligne dans la configuration de votre client :

Configuration File ~/.openvpn/client.conf
tls-client

6.2 Révoquer un certificat

En cas de compromission d'un des clients, il est important de savoir comment révoquer son certificat afin de lui bloquer l'accès au serveur OpenVPN.
Il est possible de bloquer l'accès à un client grâce à easy-rsa (toujours en se plaçant dans le répertoire d'easy-rsa):

Command
./revoke-full client2

Il suffit ensuite de copier la liste de révocation (keys/crl.pem) dans le répertoire /etc/openvpn/server/ et de spécifier au serveur OpenVPN de vérifier la liste de révocation en ajoutant la ligne :

Command crl-verify
crl-verify /etc/openvpn/server1/crl.pem

dans le fichier de configuration du serveur (/etc/openvpn/server.conf).

Il suffit ensuite redémarrer le serveur OpenVPN.

6.3 Bypasser les proxy

Vous êtes peut être au taf ou à l'école et seul le port 80 et 443 y sont ouvert (bad). De plus des sites sont bloqués. Pour contourner la solution, il faut côté serveur utiliser le port 443 pour établir le tunnel. Le port 80 risque de ne pas fonctionner dû à certaines restrictions (le port 443 utilise la méthode CONNECT dû au SSL, alors que le port 80 fonctionne en mode GET et POST). Je précise que c'est comme ça si le proxy est correctement configuré (et pas en mode gruyère, sinon ça passe sur le port 80 si le mode CONNECT est activé).

6.3.1 Serveur

Il faut simplement modifier le type de connexion (remplacer UDP par TCP) et changer sa passerelle par défaut automatiquement avec ces 2 options :

Configuration File /etc/openvpn/server.conf
...
proto tcp
port 443
push "redirect-gateway"
...

On redémarre ensuite le serveur :-)

6.3.2 Client

Là nous allons définir des règles de proxy et passer par le port 443 :

Configuration File /home/deimos/.openvpn/client.conf
...
remote fire.deimos.fr 443
# On rentre ici le nom du proxy ou l'IP avec son port
http-proxy srv-proxy 3128
# On réinitialise les connections via le proxy en cas de perte ou d'échec
http-proxy-retry
# On se fait passer pour un client web
http-proxy-option AGENT Mozilla/5.0+(Windows;+U;+Windows+NT+5.0;+en-GB;+rv:1.7.6)+Gecko/20050226+Firefox/1.0.1
...

Avec tout ça on est bon, yapuka :-)

7 FAQ

7.1 Routage avancé impossible

Si comme moi vous souhaitez faire du routage un peu compliqué sur OpenVPN, vous devez impérativement changer vos interfaces TUN en TAP. Pour quoi ? Tout simplement parce que vous êtes sur une couche de niveau 3 ne TUN et Niveau 2 en TAP.

  • Sur OpenBSD il faut faire comme ceci :
Configuration File server.conf
...
dev tun0
dev-type tap
...

  • Sur Linux :
Configuration File server.conf
...
dev tap0
...

7.2 Faire fonctionner OpenVPN dans un VE OpenVZ

Si vous souhaitez faire fonctionner un serveur OpenVPN dans un VE, ajoutez ce type de droits et créez les devices nécessaires :

Command
vzctl set $my_veid --devices c:10:200:rw --save
vzctl set $my_veid --capability net_admin:on --save
vzctl exec $my_veid mkdir -p /dev/net
vzctl exec $my_veid mknod /dev/net/tun c 10 200
vzctl exec $my_veid chmod 600 /dev/net/tun
vzctl set $my_veid --devnodes net/tun:rw --save

8 Ressources

Installation d'OpenVPN
Documentation sur une mise en place complexe d'OpenVPN
Authentification matérielle pour OpenVPN
http://blog.innerewut.de/2005/7/4/openvpn-2-0-on-openbsd
http://www.openbsd-france.org/documentations/OpenBSD-openvpn.html
http://www.procyonlabs.com/guides/openbsd/openvpn/index.php
http://purple.monk.free.fr/phiva/?p=90
http://www.imped.net/oss/misc/openvpn-2.0-howto-edit.html
http://auth-passwd.sourceforge.net/