OpenVPN

Si vous voulez plus que de simples clés pré-partagées OpenVPN rend la configuration facile et emploie une clé publique d'infrastructure (PKI) pour utiliser des certificats SSL/TLS à des fins d'authentification et un échange de clés entre le serveur VPN et les clients. OpenVPN peut être utilisé en mode VPN route ou passerelle et il peut être configuré pour utiliser UDP ou TCP. Le numéro de port peut être également configuré, mais le port 1194 est l'officiel. Et il utilise seulement ce port pour toutes les communications. Les implémentations du client VPN sont disponibles pour presque toutes les distributions Linux, OS X, Windows et les routeurs WLAN basés sur OpenWRT.

Installation du serveur

Pour installer openvpn, exécutez la commande suivante dans un terminal :

sudo apt-get install openvpn easy-rsa

Configuration d'une infrastructure à clés publiques

La première étape dans la construction d'une configuration OpenVPN est d'établir une infrastructure PKI (infrastructure à clé publique). L'ICP est composée de :

  • un certificat distinct (également connu sous le nom de clé publique) et la clé privée pour le serveur et chaque client et

  • le certificat de l’autorité de certification maître (AC) et la clé qui est utilisée pour identifier les certificats serveurs et clients.

OpenVPN supporte l'authentification bidirectionnelle basée sur les certificats, ce qui signifie que le client doit authentifier le certificat du serveur et le serveur doit authentifier le certificat client avant que la confiance mutuelle soit établie.

Tant le serveur que le client authentifieront l'autre en commençant par vérifier que le certificat présenté a été signé par l'autorité de certification maître (CA), et ensuite en testant les informations dans l'en-tête du certificat maintenant authentifié, comme le nom commun du certificat ou le type de certificat (client ou serveur).

Configuration de l'autorité de certification

Pour configurer votre propre autorité de certification (CA) et générer des certificats et des clés pour un serveur OpenVPN et clients multiples, copiez d'abord le répertoire easy-rsa dans /etc/openvpn. Cela vous permettra de vous assurer que toutes les modifications apportées aux scripts ne seront pas perdues lorsque le paquet sera mis à jour. Depuis une console mettez vous en superutilisateur et :

mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

Ensuite, modifiez /etc/openvpn/easy-rsa/vars en ajustant les valeurs pour votre environnement :

export KEY_COUNTRY="US"
export KEY_PROVINCE="NC"
export KEY_CITY="Winston-Salem"
export KEY_ORG="Example Company"
export KEY_EMAIL="steve@example.com"
export KEY_CN=MyVPN
export KEY_NAME=MyVPN
export KEY_OU=MyVPN

Saisissez ce qui suit pour générer le certificat maître Certificate Authority (CA) et une clé :

cd /etc/openvpn/easy-rsa/
source vars
./clean-all
./build-ca

Certificats du serveur

Ensuite, nous allons générer un certificat et une clé privée pour le serveur:

./build-key-server myservername

Comme dans l'étape précédente, la majorité des paramètres peuvent être définies par défaut. Deux autres requêtes nécessitent des réponses positives, "Sign the certificate? [y/n]" et "1 out of 1 certificate requests certified, commit? [y/n]".

Des paramètres Diffie Hellman doivent être générés pour le serveur OpenVPN :

./build-dh

Tous les certificats et les clés ont été générés dans le sous-répertoire keys/. La pratique courante est de les copier dans /etc/openvpn/ :

cd keys/
cp myservername.crt myservername.key ca.crt dh2048.pem /etc/openvpn/

Certificats du client

Le client VPN a également besoin d'un certificat pour s'authentifier auprès du serveur. Habituellement, vous créez un certificat différent pour chaque client. Pour créer le certificat, tapez ce qui suit dans un terminal avec les droits super-utilisateur :

cd /etc/openvpn/easy-rsa/
source vars
./build-key client1

Copiez les fichiers suivants sur le client à l'aide d'une méthode sécurisée:

  • /etc/openvpn/ca.crt

  • /etc/openvpn/easy-rsa/keys/client1.crt

  • /etc/openvpn/easy-rsa/keys/client1.key

Comme les certificats clients et les clés ne sont nécessaires que sur la machine client, vous devez les supprimer du serveur.

Configuration d'un serveur simple

Avec votre installation de OpenVPN, vous avez obtenu ces exemples de fichiers de configuration (et beaucoup plus si vous vérifiez) :

root@server:/# ls -l /usr/share/doc/openvpn/examples/sample-config-files/
total 68
-rw-r--r-- 1 root root 3427 2011-07-04 15:09 client.conf
-rw-r--r-- 1 root root 4141 2011-07-04 15:09 server.conf.gz

Commencez par copier et décompresser server.conf.gz vers /etc/openvpn/server.conf.

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz

Modifiez le fichier /etc/openvpn/server.conf pour vous assurer que les lignes suivantes pointent vers les certificats et les clés que vous avez créés dans la section ci-dessus.

ca ca.crt
cert myservername.crt
key myservername.key 
dh dh2048.pem

C'est le minimum que vous devez configurer pour un serveur OpenVPN fonctionnel. Vous pouvez utiliser tous les paramètres par défaut dans l'échantillon du fichier server.conf. Maintenant, lancez le serveur. Vous trouverez la journalisation et les messages d'erreur dans votre journal système (syslog).

root@server:/etc/openvpn# service openvpn start
 * Starting virtual private network daemon(s)...
   *   Autostarting VPN 'server'                     [ OK ]

Maintenant, vérifiez si OpenVPN a créé une interface tun0:

root@server:/etc/openvpn# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
[...]

Configuration du client simple

Il existe différentes variantes de clients OpenVPNavec ou sans interface graphique. Vous trouverez plus de détails dans une prochaine section. Pour le moment, nous utilisons le client OpenVPN pour Ubuntu, qui est le même exécutable que le serveur. Vous devez donc également installer le paquet openvpn sur la machine client :

sudo apt-get install openvpn

Cette fois, copiez le fichier de configuration d'exemple client.conf dans /etc/openvpn/.

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/

Copiez les clés du client et le certificat de l'autorité de certification (AC) que vous avez créés dans la section ci-dessus dans, par exemple, /etc/openvpn/ et modifiez /etc/openvpn/client.conf pour vous assurer que les lignes suivantes pointent bien vers ces fichiers. Si vos fichiers se trouvent dans /etc/openvpn/ vous pouvez omettre le chemin.

ca ca.crt
cert client1.crt
key client1.key

Et vous devez au moins préciser le nom ou l'adresse du serveur OpenVPN. Assurez-vous que le mot-clé client est dans la configuration. C'est ce qui permet le mode client.

client
remote vpnserver.example.com 1194

De plus, assurez-vous de bien spécifier les noms des fichiers des clés copiés depuis le serveur

ca ca.crt
cert client1.crt
key client1.key

Maintenant, lancez le client OpenVPN:

root@client:/etc/openvpn# service openvpn start
 * Starting virtual private network daemon(s)...   
   *   Autostarting VPN 'client'                          [ OK ] 

Vérifiez si cela a créé une interface tun0:

root@client:/etc/openvpn# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1

Vérifiez si vous pouvez faire un ping sur le serveur OpenVPN:

root@client:/etc/openvpn# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=0.920 ms

Le serveur OpenVPN utilise toujours la première adresse IP utilisable dans le réseau du client et seulement cette adresse est pingable. Par exemple, si vous avez configuré un /24 pour le masque réseau du client, l'adresse .1 sera utilisée. L'adresse P-t-P que vous voyez dans la sortie ifconfig ci-dessous ne répond généralement pas aux requêtes de ping.

Vérifiez vos itinéraires :

root@client:/etc/openvpn# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.8.0.5        0.0.0.0         255.255.255.255 UH        0 0          0 tun0
10.8.0.1        10.8.0.5        255.255.255.255 UGH       0 0          0 tun0
192.168.42.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
0.0.0.0         192.168.42.1    0.0.0.0         UG        0 0          0 eth0

Premier dépannage

Si ce qui précède ne fonctionne pas pour vous, vérifiez ceci:

  • Vérifiez votre journal système, par exemple grep -i vpn /var/log/syslog

  • Vérifiez si vous avez correctement spécifié les noms des fichiers des clés dans client.conf et server.conf.

  • Le client peut-il se connecter au serveur ? Peut-être un pare-feu bloque-t-il l'accès ? Vérifiez le journal système sur le serveur.

  • Client et serveur doivent utiliser le même protocole et port, par exemple, le port UDP 1194, voir l'option de configuration port et proto

  • Client et serveur doivent utiliser la même configuration en ce qui concerne la compression, voir l'option comp-lzo config

  • Le client et le serveur doivent utiliser la même configuration pour ce qui est du mode pontage ou routage, voir les options de configuration serveur ou pont de serveur

Configuration avancée

Configuration de routage VPN avancée sur le serveur

Ce qui précède est un réseau privé virtuel (VPN) fonctionnel très simple. Le client peut accéder à des services sur le serveur VPN via un tunnel crypté. Si vous voulez atteindre plus de serveurs ou quoi que ce soit dans d'autres réseaux, créez certains routages aux clients. Par exemple, si votre réseau d'entreprise peut se résumer au réseau 192.168.0.0/16, vous pouvez appuyer sur cette voie pour les clients. Mais vous devrez également modifier le routage pour le retour - vos serveurs ont besoin de savoir la routage vers le client VPN-réseau.

Ou bien vous pouvez donner une passerelle par défaut à tous les clients pour envoyer d'abord tout leur trafic Internet vers la passerelle VPN, et de là, via le pare-feu d'entreprise vers Internet. Cette section vous montre quelques options possibles.

Forcer les routes du client pour l'autoriser à accéder aux autres sous-réseaux privés derrière le serveur. Souvenez vous que ces sous-réseaux auront également besoin de router le pool d'adresses du client OpenVPN (10.8.0.0/24) jusqu'au serveur OpenVPN.

push "route 10.0.0.0 255.0.0.0"

Si activée, cette directive permettra de configurer tous les clients pour que leur passerelle par défaut emprunte le VPN, entraînant tout le trafic IP comme la navigation web ou la résolution DNS à passer par le VPN (le serveur OpenVPN ou votre pare-feu central peut avoir besoin d'ajouter une règle NAT pour l'interface TUN/TAP afin que cela fonctionne correctement).

push "redirect-gateway def1 bypass-dhcp"

Configure server mode and supply a VPN subnet for OpenVPN to draw client addresses from. The server will take 10.8.0.1 for itself, the rest will be made available to clients. Each client will be able to reach the server on 10.8.0.1. Comment this line out if you are ethernet bridging.

server 10.8.0.0 255.255.255.0

Maintenez un enregistrement d'association des clients aux d'adresses IP virtuelles dans ce fichier. Si OpenVPN tombe en panne ou est redémarré, la reconnexion des clients pourra se faire à la même adresse IP virtuelle du pool d'adresses qui a été précédemment attribué.

ifconfig-pool-persist ipp.txt

Poussez les serveurs DNS au client.

push "dhcp-option DNS 10.0.0.2"
push "dhcp-option DNS 10.1.0.2"

Permettez la communication client à client.

client-to-client

Activez la compression sur le lien VPN.

comp-lzo

The keepalive directive causes ping-like messages to be sent back and forth over the link so that each side knows when the other side has gone down. Ping every 1 second, assume that remote peer is down if no ping received during a 3 second time period.

keepalive 1 3

C'est une bonne idée de réduire les privilèges du démon OpenVPN après l'initialisation.

user nobody
group nogroup

OpenVPN 2.0 inclut une fonctionnalité qui permet au serveur OpenVPN d'obtenir de manière sécurisée un nom d'utilisateur et un mot de passe d'un client qui tente de se connecter,et d'utiliser ces informations comme base pour l'authentification du client. Pour utiliser cette méthode d'authentification, vous devez d'abord ajouter la directive auth-user-pass à la configuration du client. Cela donnera l'instruction au client OpenVPN de demander à l'utilisateur son identifiant et son mot de passe, pour les transmettre au serveur via le canal TLS sécurisé.

# client config!
auth-user-pass

Ceci indique au serveur OpenVPN de valider le nom d'utilisateur/mot de passe saisi par les clients qui utilisent le module de connexion PAM. Utile si vous avez une authentification centralisée avec, par exemple, Kerberos.

plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login

Veuillez lire le guide de durcissement de la sécurité OpenVPN pour obtenir des conseils de sécurité supplémentaires.

Configuration avancée de VPN ponté sur le serveur

OpenVPN can be setup for either a routed or a bridged VPN mode. Sometimes this is also referred to as OSI layer-2 versus layer-3 VPN. In a bridged VPN all layer-2 frames - e.g. all ethernet frames - are sent to the VPN partners and in a routed VPN only layer-3 packets are sent to VPN partners. In bridged mode all traffic including traffic which was traditionally LAN-local like local network broadcasts, DHCP requests, ARP requests etc. are sent to VPN partners whereas in routed mode this would be filtered.

Préparez la configuration de l'interface pour le pontage sur le serveur

Assurez-vous que vous avez installé le paquet bridge-utils:

sudo apt-get install bridge-utils

Avant de configurer OpenVPN en mode ponté, il faut changer la configuration de votre interface. Supposons que votre serveur dispose d'une interface eth0 connectée à internet et une interface eth1 connectée au réseau local que vous voulez ponter. Votre /etc/network/interfaces devrait ressembler à ceci :

auto eth0
iface eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.248
  default 1.2.3.1

auto eth1
iface eth1 inet static
  address 10.0.0.4
  netmask 255.255.255.0

This straight forward interface config needs to be changed into a bridged mode like where the config of interface eth1 moves to the new br0 interface. Plus we configure that br0 should bridge interface eth1. We also need to make sure that interface eth1 is always in promiscuous mode - this tells the interface to forward all ethernet frames to the IP stack.

auto eth0
iface eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.248
  default 1.2.3.1

auto eth1
iface eth1 inet manual
  up ip link set $IFACE up promisc on

auto br0
iface br0 inet static
  address 10.0.0.4
  netmask 255.255.255.0
  bridge_ports eth1

À ce stade, vous devez mettre en place la passerelle. Il se peut que cela ne fonctionne pas du premier coup et que vous perdiez la connexion distante. Assurez vous que vous pouvez régler les problèmes en ayant un accès local.

sudo ifdown eth1 && sudo ifup -a

Préparer la configuration du serveur pour le pontage

Modifiez /etc/openvpn/server.conf avec les options suivantes :

;dev tun
dev tap
up "/etc/openvpn/up.sh br0 eth1"
;server 10.8.0.0 255.255.255.0
server-bridge 10.0.0.4 255.255.255.0 10.0.0.128 10.0.0.254

Ensuite, créez un script d'aide pour ajouter l'interface tap à la passerelle et assurez vous que eth1 est en mode espion. Créez /etc/openvpn/up.sh :

#!/bin/sh

BR=$1
ETHDEV=$2
TAPDEV=$3

/sbin/ip link set "$TAPDEV" up
/sbin/ip link set "$ETHDEV" promisc on
/sbin/brctl addif $BR $TAPDEV

Puis rendez-le exécutable :

sudo chmod 755 /etc/openvpn/up.sh

Après avoir configuré le serveur, redémarrez openvpn en tapant :

sudo service openvpn restart

Configuration du client

Installez d'abord openvpn sur le client :

sudo apt-get install openvpn

Puis, une fois le serveur configuré et les certificats du client copiés dans le répertoire /etc/openvpn/, créez un fichier de configuration client en copiant l'exemple. Dans un terminal sur la machine client, saisissez :

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn

Maintenant, éditez /etc/openvpn/client.conf en modifiant les options suivantes :

dev tap
;dev tun
ca ca.crt
cert client1.crt
key client1.key

Enfin, redémarrez openvpn :

sudo service openvpn restart

Vous devriez maintenant être en mesure de vous connecter au réseau LAN distant via le VPN.

Implémentations logicielles des clients

Interface graphique Linux Network-Manager pour OpenVPN

De nombreuses distributions Linux notamment les variantes de bureau Ubuntu sont livrées avec Network Manager, une interface graphique agréable pour configurer vos paramètres réseau. Il peut également gérer vos connexions VPN. Assurez-vous que le paquet network-manager-openvpn est bien installé. Ici vous pouvez voir que le programme d'installation installe aussi tous les autres paquets nécessaires :

root@client:~# apt-get install network-manager-openvpn
Lecture de la liste de paquets… Terminé
Construction de l'arbre de dépendances       
Lecture des informations de l'état… Terminé
Les paquets supplémentaires suivants seront installés :
  liblzo2-2 libpkcs11-helper1 network-manager-openvpn-gnome openvpn
Paquets suggérés :
  resolvconf
Les nouveaux paquets suivants seront installés :
  liblzo2-2 libpkcs11-helper1 network-manager-openvpn
  network-manager-openvpn-gnome openvpn
0 mis à jour, 5 nouvellement installés, 0 à supprimer et 631 non mis à jour.
Nécessité de prendre 700 ko d'archives.
Après cette opération, 3,031 ko d'espace disque supplémentaire seront utilisés.
Voulez vous continuer [O/n][nbsp}? 

Pour informer network-manager sur les nouveaux paquets installés, vous devrez le redémarrer :

root@client:~# restart network-manager 
network-manager start/running, process 3078

Open the Network Manager GUI, select the VPN tab and then the 'Add' button. Select OpenVPN as the VPN type in the opening requester and press 'Create'. In the next window add the OpenVPN's server name as the 'Gateway', set 'Type' to 'Certificates (TLS)', point 'User Certificate' to your user certificate, 'CA Certificate' to your CA certificate and 'Private Key' to your private key file. Use the advanced button to enable compression (e.g. comp-lzo), dev tap, or other special settings you set on the server. Now try to establish your VPN.

OpenVPN avec interface graphique pour Mac OS X : Tunnelblick

Tunnelblick est une excellente implémentation, libre et open source d'une interface graphique pour OpenVPN sur OS X. La page d'accueil du projet est sur http://code.google.com/p/tunnelblick/. Téléchargez ici la dernière version pour OS X et installez-la. Ensuite, mettez votre fichier de configuration avec les certificats et clés de client.ovpn dans /Users/nom_d'utilisateur/Library/Application Support/Tunnelblick/Configurations/ et lancez Tunnelblick depuis votre dossier Applications.

# client.ovpn d'exemple pour Tunnelblick
client
remote blue.example.com
port 1194
proto udp
dev tun
dev-type tun
ns-cert-type server
reneg-sec 86400
auth-user-pass
auth-nocache
auth-retry interact
comp-lzo yes
verb 3
ca ca.crt
cert client.crt
key client.key

OpenVPN avec interface graphique pour Win 7

Pour commencer, téléchargez et installez l'installateur Windows OpenVPN le plus récent. OpenVPN 2.3.2 était le plus récent quand ceci a été écrit. À ce jour, l'interface de gestion est incluse avec l'installateur binaire Windows.

Vous devez démarrer le service OpenVPN. Allez à Démarrer > Ordinateur > Gestion > Services et Applications > Services. Cherchez le service OpenVPN et démarrez-le. Mettez son type de démarrage sur automatique. Pour la première exécution de l'interface graphique OpenVPN MI, vous devrez la lancer avec les droits administrateur. Faites un clic droit dessus et vous verrez cette option.

Vous devrez écrire votre configuration OpenVPN dans un fichier texte et le placer dans C:\Program Files\OpenVPN\config\client.ovpn avec le certificat d'AC. Vous pourriez placer le certificat de l'utilisateur dans le répertoire home de l'utilisateur comme dans l'exemple suivant.

# C:\Program Files\OpenVPN\config\client.ovpn
client
remote server.example.com
port 1194
proto udp
dev tun
dev-type tun
ns-cert-type server
reneg-sec 86400
auth-user-pass
auth-retry interact
comp-lzo yes
verb 3
ca ca.crt
cert "C:\\Users\\username\\My Documents\\openvpn\\client.crt"
key "C:\\Users\\username\\My Documents\\openvpn\\client.key"
management 127.0.0.1 1194
management-hold
management-query-passwords
auth-retry interact
; Set the name of the Windows TAP network interface device here
dev-node MyTAP

Note : si vous n'utilisez pas l’authentification utilisateur et/ou si vous voulez exécuter le service sans interaction de l'utilisateur, basculez les options suivantes en commentaire :

auth-user-pass
auth-retry interact
management 127.0.0.1 1194
management-hold
management-query-passwords

Vous voudrez peut être régler le service Windows sur « automatique ».

OpenVPN pour OpenWRT

OpenWRT est décrit comme une distribution Linux pour les systèmes embarqués comme les routeurs sans fil. Il y a certains types de routeurs WLAN qui peuvent être flashés pour exécuter OpenWRT. En fonction de la mémoire disponible sur votre routeur OpenWRT, vous pouvez exécuter un logiciel tel que OpenVPN et vous pouvez par exemple construire un petit routeur de succursale bon marché avec une connectivité VPN au bureau central. Plus d'informations pour OpenVPN sur OpenWRT se trouvent ici. Et voici la page d'accueil du projet OpenWRT : http://openwrt.org

Connectez-vous à votre routeur OpenWRT et installez OpenVPN:

opkg update
opkg install openvpn

Consultez /etc/config/openvpn et mettez-y votre configuration client. Copiez les certificats et les clés dans /etc/openvpn/

config openvpn client1
        option enable 1                                  
        option client 1                                  
#       option dev tap                                   
        option dev tun  
        option proto udp   
        option ca /etc/openvpn/ca.crt                
        option cert /etc/openvpn/client.crt
        option key /etc/openvpn/client.key
        option comp_lzo 1  

Redémarrez OpenVPN:

service openvpn restart

Vous devrez voir si vous avez besoin d'ajuster les règles de routage et de filtrage de votre routeur.

Références