Mise en place d’un serveur OpenVPN

Avant de commercer la configuration, procédons par la mise à jour de la liste des paquets avant de passer à l’installation du paquet « openvpn » sur le serveur.
aptitude update && aptitude install openvpn openssl

Il faut à présent récupérer le dossier de scripts permettant de générer facilement des certificats OpenSSL. OpenVPN conseille de ne pas travailler sur les fichiers sources, car en cas de mise à jour d’OpenVPN, les modifications réalisées dans ce dossier sont écrasées.
Ici, je décide de placer le dossier avec les fichiers de configurations d’OpenVPN.
mkdir /etc/openvpn/easy-rsa && cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

Dans le répertoire de documentation, d’OpenVPN, il est possible de trouver un large panel d’exemples de fichiers de configuration. Rendez-vous dans « /usr/share/doc/openvpn/examples/sample-config-files/ » pour les découvrir.

Plaçons nous dans le répertoire que nous avons précédemment créé.
cd /etc/openvpn/easy-rsa/

Avant d’utiliser les scripts de génération de certificats, il faut éditer le fichier « vars » présent dans le dossier « easy-rsa ». Nous changeons tout d’abord la taille des clés générées, puis les informations personnelles placées dans les certificats.
[generic]# Increase this to 2048 if you
# are paranoid. This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=2048

[…]

# These are the default values for fields
# which will be placed in the certificate.
# Don’t leave any of these fields blank.
export KEY_COUNTRY="FR"
export KEY_PROVINCE="Région"
export KEY_CITY="Ville"
export KEY_ORG="MaCompagnie"
export KEY_EMAIL="moi@macompagnie.fr"
export KEY_EMAIL=moi@macompagnie.fr
export KEY_CN=openvpn
export KEY_NAME=OpenVPN
export KEY_OU=VPN
export PKCS11_MODULE_PATH=""
export PKCS11_PIN=1234[/generic]

Nous exportons les valeurs précédemment saisies en exécutant le fichier « vars ».
source ./vars

Pour effacer les anciens certificats générés, il faut faire appel au script « clean-all ». Attention, c’est une opération destructrice et donc irréversible !
./clean-all

Nous générons en premier lieu le certificat d’autorité (CA). Valider par Entrée, jusqu’à temps de revenir au prompt.
./build-ca

Puis nous passons à la génération du certificat pour notre serveur. Valider par Entrée, jusqu’à temps de revenir au prompt.
./build-key-server mon-serveur.macompagnie.fr

Ensuite à la génération d’un certificat pour un client Valider par Entrée, jusqu’à temps de revenir au prompt.
./build-key pc-portable.macompagnie.fr

Et enfin, il ne nous reste plus qu’à générer le certificat Diffie-Hellman.
./build-dh

Le répertoire « keys » présent dans « easy-rsa » devrait contenir les fichiers suivants.

Il faut déplacer (ici, je vais faire un lien symbolique) les quatre certificats suivant à la racine du répertoire « /etc/openvpn » : ca.crt, mon-serveur.macompagnie.fr.key, mon-serveur.macompagnie.fr.crt et dh2048.pem
ln -s /etc/openvpn/easy-rsa/keys/{ca.crt,mon-serveur.macompagnie.fr.key,mon-serveur.macompagnie.fr.crt,dh2048.pem} /etc/openvpn/

Les certificats suivants seront à récupérer pour les placer avec le fichier de configuration de notre client ; un client SCP comme WinSCP pour Windows fera très bien l’affaire.

  • ca.crt
  • pc-portable.macompagnie.fr.key
  • pc-portable.macompagnie.fr.crt

Voici le contenu du fichier de configuration du serveur à placer dans « /etc/openvpn ». Nous l’appelerons « server.conf » mais le nom du fichier n’a aucune importante (l’extention devra cependant être .conf).
##################################################
# /etc/openvpn/server.conf
# Date : 10/03/2012
# Version : 0.2
##################################################

# Pour utiliser ce fichier pour un client Windows,
# renommer simplement l'extension en .ovpn
# Il faudra modifier si besoin la section Windows
# de ce fichier
# Sur Windows, pour définir des chemins penser à
# utiliser des trouves anti-slash comme ci-dessous.
# "C:Program FilesOpenVPNconfigfoo.key"

#---
# Authentification et sécurisation
#

# Clé et certificats SSL/TLS.
# Il est conseillé d'avoir des certificats séparés
# pour chaque client.
# Par contre, on peut avoir qu'un seul
# Certificat Autoritaire.
# La clé serveur ne doit jamais être distribuée, si
# cela arrive, il faudra en générer une nouvelle.
ca ca.crt
cert mon-serveur.macompagnie.fr.crt
key mon-serveur.macompagnie.fr.key

# Certificat Diffie-Hellman.
dh dh2048.pem

# Déclaration de la clé tls-auth
# Le second paramètre doit être 0 sur le serveur
# et 1 sur le(s) client(s).
;tls-auth ta.key 0

# Utilisation de la cryptographie Cipher.
;cipher BF-CBC # Blowfish (default)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES

#---
# Configuration de la connexion
#

# Adresse IP sur laquelle OpenVPN doit écouter.
;local a.b.c.d

# Port TCP/UDP sur lequel OpenVPN doit écouter.
# Pour plusieurs intances serveur, il faudra un port pour
# chacune d'elles.
# Bien penser aussi à ouvrir les ports concernés pour laisser
# passer le trafic réseau.
port 1194

# Protocole de transport des données.
;proto tcp
proto udp

# Type d'interface à utiliser pour la connexion.
# tap permet de créer un tunnel Ethernet alors que tun
# permet de faire un tunnel IP routé.
# En cas d'utilisation d'une interface tap, il faudra au
# préalable créer cette interface.
;dev tap
dev tun

#---
# Configuration générale
#

# Nombre maximum de clients autorisés à se connecter.
;max-clients 100

# Activation de la compression du trafic circulant
# dans le tunnel VPN.
comp-lzo

# Toutes les 10 secondes un test de connectivité est effectué.
# Passée une période de 120 secondes sans réponse, l'hôte distant
# est déclaré arrêté.
keepalive 10 120

# Options persistantes malgré un redémarrage.
# On ne relit pas les clés de cryptographie,
# On ne réinitialise pas l'interface virtuelle.
persist-key
persist-tun

# Attribution d'un pool d'adresses au serveur qu'il
# pourra fournir aux clients se connectant.
# Ici, le serveur prendra l'adresse IP 10.8.0.1 pour lui
# et laissera le reste pour les clients.
# Commenter cette directive en cas d'utilisation d'un pont
# Ethernet.
server 10.8.0.0 255.255.255.0

# Configure OpenVPN pour faire du pont Ethernet et utiliser
# un DHCP-proxy. Ainsi les clients VPN pourront accéder aux
# serveurs DHCP et DNS.
# Il faut d'abord utiliser les fonctions de pontage de
# l'OS pour rassembler la carte physique et la carte virtuelle
# TAP.
# Note : Ce mode ne fonctionne qu'avec des clients comme Windows,
# où l'interface virtuelle TAP est liée à un client DHCP.
;server-bridge

# Configure OpenVPN pour faire du pont Ethernet.
# Il faut d'abord utiliser les fonctions de pontage de
# l'OS pour rassembler la carte physique et la carte virtuelle
# TAP. Ensuite, il ne reste plus à définir manuellement les
# paramètres réseau du pont ainsi que la plage d'adresses
# IP utilisable pour les clients VPN, ici de 10.8.0.50
# à 10.8.0.100.
# Commenter cette directive en cas d'utilisation d'un pont
# Ethernet.
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

# En plus de fournir un tunnel VPN, OpenVPN est capable
# d'envoyer des paramètres aux clients comme des routes.
# Les clients peuvent ainsi joindre des sous-réseaux
# accessibles à partir du serveur.
# Ne pas oublier que ces sous-réseaux devront connaître
# le réseau virtuel pour pouvoir répondre aux clients VPN.
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

# Il est aussi possible d'envoyer aux clients des paramètres
# spécifiques à Windows comme l'adresse d'un serveur DNS ou un
# serveur WINS.
# CAVEAT: http://openvpn.net/faq.html#dhcpcaveats
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

# Si activée, cette directive va forcer les clients à rediriger
# tout leur trafic Internet vers le VPN, comme par exemple
# la navigation Web, les requêtes DNS, ...
# Il faudra par ailleurs que la machine hébergeant le serveur VPN
# utilise NAT ou un pont Ethernet pour que ceci fonctionne correctement.
;push "redirect-gateway def1 bypass-dhcp"

# Répertoire contenant les configurations personnalisées des clients.
# Le répertoire "/etc/openvpn/ccd" n'existe pas de base, il faudra le créer.
# Les fichiers doivent porter le Common Name du certificat associé.
;client-config-dir /etc/openvpn/ccd

# Activée, cette directive permet aux clients VPN de pouvoir
# communiquer les uns avec les autres.
# Par défaut, un client ne peut voir que le serveur.
# Pour forcer les clients à ne voit que le servuer, il faudra
# aussi configurer en conséquence le pare-feu.
;client-to-client

# Il est possible de générer un certificat client commun
# à différent client.
# Cependant ce type d'utilisation n'est pas conseillé pour
# raison de sécurité ; à ne faire qu'à des fins de tests.
# Ceci est dans le cas où le "Common name" du certificat est commun
# pour tous les clients VPN.
;duplicate-cn

#---
# Journalisation
#

# Garde une trace client <-> adresse IP virtuelle ainsi
# en cas de redémarrage d'OpenVPN, le serveur est capable d'assigner
# à nouveau la même adresse IP aux clients se reconnectant.
ifconfig-pool-persist ipp.txt

# Fichier de journalisation permettant d'avoir une trace
# des connexions courantes.
# Il est actualisé toutes les minutes.
status openvpn-status.log

# Par défaut, les fichiers de journalisation iront se placer
# dans syslog pour Linux et dans C:Program FilesOpenVPNlog pour
# Windows, si OpenVPN est lancé comme démon/service.
# Les directives suivantes permettent de changer cela. Cependant, il
# ne faut jamais les utiliser en même temps.
# log va vider le fichier de journalisation au démarrage d'OpenVPN
# alors que log-append va ajouter les nouvelles entrées à la suite de
# l'existant.
;log openvpn.log
;log-append openvpn.log

# Niveau de verbosité utilisé pour les fichiers de
# journalisation.
verb 3

# Ne journalise pas plus de n messages consécutifs similaires.
;mute 20

#---
# Spécifique à Linux
#

# Après initialisation, on réduit les droits du
# démon par mesure de sécurité.
;user nobody
;group nogroup

#---
# Spécifique à Windows
#

# Windows demande à ce que le nom de l'interface virtuelle soit
# nommée TAP-Win32.
# Il peut arriver que vous en ayez plus qu'une. Dans ce cas, donnez
# son nom ici.
;dev-node MyTap

Pour notre client, voici à quoi va ressembler son fichier de configuration. Il est préparé pour être utilisé sur une client Linux, mais sera facilement adaptable pour Windows.
##################################################
# /etc/openvpn/client.conf
# Date : 18/05/2011
# Version : 0.1
##################################################

# Pour utiliser ce fichier pour un client Windows,
# renommer simplement l'extension en .ovpn
# Il faudra modifier si besoin la section Windows
# de ce fichier
# Sur Windows, pour définir des chemins penser à
# utiliser des trouves anti-slash comme ci-dessous.
# "C:Program FilesOpenVPNconfigfoo.key"

#---
# Configuration propre au client
#

# FQDN/IP du serveur, ainsi que son port d'écoute.
# Il est possible définir plusieurs serveurs en
# duplicant la ligne ci-dessous.
remote mon-serveur.macompagnie.fr 1194

# Clé et certificats SSL/TLS.
# Il est conseillé d'avoir des certificats séparés
# pour chaque client.
# Par contre, on peut avoir qu'un seul
# Certificat Autoritaire.
ca ca.crt
cert pc-portable.macompagnie.fr.crt
key pc-portable.macompagnie.fr.key

#---
# Partie devant être identique avec le serveur
#

# Protocole de transport des données.
;proto tcp
proto udp

# Type d'interface à utiliser pour la connexion.
# tap permet de créer un tunnel Ethernet alors que tun
# permet de faire un tunnel IP routé.
# tap sera plus utilisé pour faire un pont d'interfaces,
# cela implique d'avoir déjà créé une interface du genre tap0.
;dev tap
dev tun

# Activation de la compression du trafic circulant
# dans le tunnel VPN.
comp-lzo

# Déclaration de la clé tls-auth
# Le second paramètre doit être 0 sur le serveur
# et 1 sur le(s) client(s).
;tls-auth ta.key 1

# Utilisation de la cryptographie Cipher.
;cipher BF-CBC # Blowfish (default)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES

#---
# Configuration générale
#

# Activation du mode client, ainsi, nous pourrons
# récupérer certaines directives du serveur.
client

# Niveau de verbosité utilisé pour les fichiers de
# journalisation.
verb 3

# Ne journalise pas plus de n messages consécutifs similaires.
;mute 20

# Si plusieurs serveurs ont précédemment été déclarés,
# il est possible de faire de l'équilibrage de charge
# via ce paramètre. Sinon on utilise l'ordre de
# déclaration des serveurs.
;remote-random

# Permet de résoudre indéfiniment le
# FQDN du serveur OpenVPN. Très utile
# sur des machines qui ne sont pas connectées en permanence
# à Internet tels que les ordinateurs portables.
resolv-retry infinite

# La plupart des clients n'ont pas besoin d'être liés
# un port local spécifique. Un port est attribué
# dynamiquement.
nobind

# Options persistantes malgré un redémarrage.
# On ne relit pas les clés de cryptographie,
# On ne réinitialise pas l'interface virtuelle.
persist-key
persist-tun

# Si le client est connecté à Internet via un proxy,
# il faut définir les informations ici.
# Si le proxy demande une authentification, consulter
# le manuel.
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]

# Désactive l'affiche des messages d'avertissement
# concernant la duplication de paquet qui sont la plupart
# du temps de faux indicateurs sur un réseau Wifi.
# Avec cette option, on dispose toujours de la protection
# associée à la duplication de paquet tout en désactivant
# la verbosité.
;mute-replay-warnings

# Vérification de la présence de la directive nsCertType
# contenue dans le certificat du serveur.
# Elle permet d'être protéger contre de potentielles attaques.
# Voir ici pour plus d'informations : http://openvpn.net/howto.html#mitm
#
# Cette directive est normalement insérée si l'on génère le certificat
# du serveur via le script build-key-server présent dans le dossier
# easy-rsa.
ns-cert-type server

#---
# Spécifique à Linux
#

# Après initialisation, on réduit les droits du
# démon par mesure de sécurité.
;user nobody
;group nogroup

#---
# Spécifique à Windows
#

# Windows demande à ce que le nom de l'interface virtuelle soit
# nommée TAP-Win32.
# Il peut arriver que vous en ayez plus qu'une. Dans ce cas, donnez
# son nom ici.
;dev-node MyTap

Dernière chose et pas des moindre, ne pas oublier d’ouvrir le port 1194 en UDP (à adapter si vous avez touchez les fichiers de configurations) et le rediriger sur le serveur VPN 😉

Pour lancer le service OpenVPN sur le serveur et le client, rien de plus simple, il faut saisir la commande suivante.
service openvpn restart

Effectuons un test de connectivité à partir du client pour nous assurer que tout fonctionne.
ping 10.8.0.1 -c 4

Pour révoquer un certificat, il faut retourner dans « /etc/openvpn/easy-rsa ».
cd /etc/openvpn/easy-rsa
./revoke-full pc-portable.macompagnie.fr

Notre serveur fraichement installé est à l’écoute de n’importe quelle demande de connexion. Ainsi, n’importe qui peut lui demander de se connecter, même si la connexion se voit refusée par la suite ; ceci est donc « gourmand » en ressources, et peut causer des types “Denial of Service“. Pour réduire le nombre de personnes ayant l’autorisation de se connecter, nous allons générer un clé permettant de crypter la connexion initiale.
La clé “ta.key” créée devra être copiée sur le serveur ainsi que sur chaque client ! Il faudra d’ailleurs modifier les fichiers de configuration client/serveur pour prendre en compte cette nouvelle clé.
Il faudra aussi décommenter le paramètre « tls-auth » dans les fichiers de configuration.
openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key
ln -s /etc/openvpn/easy-rsa/keys/ta.key /etc/openvpn

Pour la mise en place plus détaillée d’OpenVPN en mode bridge, (et comme pour par mal de choses d’ailleurs) rendez-vous sur la rubrique documentation d’OpenVPN : Ethernet Bridging.