Petite LAN entre amis (installer et configurer un OpenVPN)

Pour jouer en LAN lorsqu'on est séparé par plusieurs centaines de kilomètres et des box diverses et variées, le plus simple c'est d'installer et de configurer un VPN sur un serveur accessible par tous.

Le principe est le suivant : - sur mon dédié, j'ai installé OpenVPN - chaque participant à la LAN virtuelle se connecte au VPN C'est bon, tout le monde est sur le même réseau, on peut jouer !

Cet article détaille la configuration du serveur OpenVPN ainsi que celle d'un client. Je ne vais pas entrer dans le détail de l'installation d'OpenVPN lui-même, sous Windows il suffit d'exécuter le package d'install et sous Linux c'est généralement l'affaire d'un apt-get (ou équivalent).

Quelques mots sur les mécanismes de sécurité

La sécurité dans OpenVPN repose sur une infrastructure de clés (des couples de clés publiques/privées). Avant d'utiliser OpenVPN, vous devez générer une autorité de certification. Le serveur (et les clients) auront besoin de la clé publique de cette autorité. La clé privée de cette autorité doit rester secrète et sert à signer les clés des participants.

Préparation de l'autorité de certification

Pour créer l'autorité de certification, il suffit de se placer dans le répertoire easy-rsa. Sur ma Debian, il est dans /usr/share/doc/openvpn/examples/easy-rsa et de lancer les scripts suivants :

. ./vars
./clean-all
./build-ca

ATTENTION ! Ces trois commandes vont totalement remettre à zéro la configuration de votre autorité de certification et en créer une nouvelle. Ne les lancez qu'une seule fois !

Le lancement de build-ca provoque une série de questions pour construire votre autorité de certification :

frag@nuage:~/vpn_k$ ./build-ca
Generating a 1024 bit RSA private key
.++++++
..............................++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:FR <--------------- Ici le code du pays
State or Province Name (full name) [CA]:Herault <-------------- Le nom du département
Locality Name (eg, city) [SanFrancisco]:Montpellier <--------- Le nom de la ville
Organization Name (eg, company) [Fort-Funston]:Kranamyths <----------- Le nom de votre organisation
Organizational Unit Name (eg, section) []: <----------- Le nom de votre 'service réseau'
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:KranamythCA <--------- Le nom de votre Autorité de certification
Name []:  <------------ Le nom de la personne responsable 
Email Address [me@myhost.mydomain]:frag@kranamyth.fr  <----------- L'adresse email de la personne responsable

A la fin du script, vous devez avoir un sous-répertoire keys contenant deux fichiers ca.crt et ca.key. Le fichier ca.crt est la clé publique (le certificat) de votre autorité de certification. Ce fichier sera distribué dans les configuration du serveur et des clients. Le fichier ca.key est la clé privée de l'autorité. La sécurité de votre VPN repose en grande partie sur cette clé privée. Ne la divulguez pas et ne la distribuez pas.

Création d'une clé pour le serveur

Il faut maintenant générer une clé privée et un certificat pour le serveur. Pour cela, utilisez la commande :

build-key-server nomduserveur

Ne donnez pas de mot de passe et signez immédiatement le certificat du serveur. Vous avez maintenant deux fichiers supplémentaires dans le répertoire keys : serveur.key et serveur.crt (où serveur correspond au nom de serveur que vous avez donné sur la ligne de commande). Ces fichiers correspondent respectivement à la clé privée du serveur (à garder secrète) et à sa clé publique (son certificat).

Création de clés pour les clients

Le principe est sensiblement le même, la commande est cette fois-ci :

build-key-pass nomduclient

Pour protéger la clé du client, indiquez un mot de passe. Signez également la clé du client avec l'autorité de certification. Recommencez la procédure pour chaque client.

Cette fois encore, vous avez de nouveaux fichiers qui apparaissent dans le répertoire keys : client.key et client.crt.

Paramètre de Diffie-Hellman

Pour sécuriser encore plus la connexion, OpenVPN utilise l'algorithme d'échange de clé de Diffie-Hellman. Pour générer ce paramètre spécial, utilisez le script :

build-dh

Vous obtenez un fichier dh1024.pem dans le répertoire keys lui aussi.

Création de la clé de sécurisation de l'établissement de connexion TLS

L'établissement de connexion peut être renforcé en signant les phases d’établissement de connexion TLS. Pour cela, il faut générer une clé statique avec la commande :

openvpn --genkey --secret ta.key

Munis de tous ces fichiers, nous allons pouvoir configurer le serveur…

Configuration du serveur

Le fichier de configuration du serveur est assez simple, il se nomme server.conf et se trouve dans /etc/openvpn Voici son contenu :

# mode indique qu'il s'agit d'un fichier de configuration d'un serveur
mode server
# proto détermine si le VPN utilise TCP ou UDP
proto udp
# port indique le port d'écoute du serveur (le port par défaut est 1194)
port 1194
# dev indique si le tunnel fait du routage IP (tun) ou du bridge ethernet (tap)
dev tun
#
# Cles et certificats
# Clé publique (certificat) de l'autorité de certification
ca ca.crt
# Clé publique et clé privée du serveur
cert serveur.crt
key serveur.key
# Clé de Diffie-Hellman
dh dh1024.pem
# Clé de signature HMAC du handshake TLS
tls-auth ta.key 0
# Algorithme de cryptage utilisé
cipher AES-256-CBC
#
# Reseau
# Fixe le réseau du serveur et les IP qu'il distribuera
server 10.8.0.0 255.255.255.0
# Le keep alive permet de vérifier l'état de la connexion (puisque UDP est un protocole sans connexion)
# ici on 'pingue' toutes les 10 secondes et on considère que l'autre partie est déconnectée si on n'a pas de réponse après 120 secondes.
keepalive 10 120
# Cette directive indique que les clients peuvent se voir entre eux
# C'est essentiel pour faire un LAN (sinon ils ne voient que le serveur)
client-to-client
#
# Securite
user nobody
group nogroup
chroot /etc/openvpn/jail
persist-key
persist-tun
comp-lzo
#
# Log
verb 3
mute 20
status openvpn-status.log
log-append /var/log/openvpn.log

Et c'est tout, le serveur est prêt à l'emploi. Démarrez-le et vérifiez dans les logs qu'il n'y a pas de message d'erreur. Si tout va bien, un netstat -anup doit vous afficher votre OpenVPN en écoute sur le port de votre choix.

On peut à présent passer à la configuration des clients.

Configuration d'un client

Là encore, rien de très compliqué, le fichier de configuration des clients se présente comme suit :

# Indique qu'il s'agit d'une configuration client
client
# dev indique si le tunnel fait du routage IP (tun) ou du bridge ethernet (tap)
dev tun
# proto détermine si le VPN utilise TCP ou UDP
proto udp
# remote donne l'adresse et le port de connexion au serveur
remote adresseduserveur 1194
# nombre d'essai de connexion
resolv-retry infinite
# Algorithme de cryptage utilise
cipher AES-256-CBC
#
# Cles et certificats
# Clé publique (certificat) de l'autorité de certification
ca ca.crt
# Clé publique du client
cert client.crt
# Clé privée du client
key client.key
# Clé de signature HMAC du handshake TLS
tls-auth ta.key 1
#
# Securite
nobind
persist-key
persist-tun
comp-lzo
verb 3

Voilà, il ne vous reste plus qu'à vous connecter !