Mémo d'installation d'un serveur OpenVPN

Mémo d'installation d'un serveur OpenVPN
Crédit photo : Dayne Topkin on Unsplash

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 !

Avant de commencer

Pour installer OpenVPN sous Windows, il suffit de télécharger l’installeur sur le site officiel

Sous Debian : apt install openvpn easy-rsa

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 est facile d’utiliser les commandes fournies par easy-rsa.
Sa documentation complète s’installe dans /usr/share/doc/easy-rsa/doc.
Pour créer une autorité de certification, les commandes à utiliser sont :

make-cadir monCA
cd monCA
nano ./vars

Généralement il y a peu de paramètres à modifier. Vous pouvez être tentés par :

  • EASYRSA_DN: donner la valeur cn_only (par défaut) pour générer des certificats qui ne contiennent qu’un nom ou la valeur org pour les champs habituels (comme les certificats TLS) de pays, région, ville…
  • EASYRSA_REQ_xx : si vous avez opté pour la valeur org décrite ci-dessus.
  • EASYRSA_KEY_SIZE : taille de la clé. La valeur par défaut de 2048 est raisonnable. Il est possible de choisir 4096 au prix d’une plus grande consommation de CPU.
  • EASYRSA_ALGO : algorithme de chiffrement de la clé. Là encore, la valeur par défaut (rsa) est tout à fait convenable.
  • EASYRSA_CA_EXPIRE : la durée de validité de l’autorité de certification
  • EASYRSA_CERT_EXPIRE : la durée de validité des certificats générés

Ensuite, il faut initialiser l’infrastructure de gestion des clés (PKI) avec la commande ./easyrsa init-pki.

L’étape suivante est la création de la clé privée et du certificat (auto signé) de l’autorité de certification. Elle se réalise avec la commande ./easy-rsa build-ca.

La commande va demander un mot de passe pour protéger la clé privée de la CA et le nom de l’autorité (c’est le nom de signataire qui est affiché dans les certificats signés par cette autorité).

A la fin du script, vous devez avoir un sous-répertoire pki contenant le fichier ca.crt. 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.

La sécurité de votre VPN repose entièrement sur les clés privées stockées dans le répertoire pki/private. Ne les divulguez pas et ne les 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 :

./easyrsa build-server-full nomduserveur nopass

ATTENTION : avec cette commande, la clé privée du serveur n’est pas protégée par un mot de pase. C’est nécessaire pour que le service OpenVPN puisse démarrer automatiquement. Si vous n’utilisez pas l’option nopass, vous devrez saisir un mot de passe pour protéger la clé privée (et lancer le VPN manuellement).

Vous avez maintenant deux fichiers supplémentaires : pki/private/nomduserveur.key et pki/issued/nomduserveur.crt (où nomduserveur 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 :

./easyrsa build-client-full clientA

Pour protéger la clé du client, indiquez un mot de passe. Pour signer le certificat du client, il sera nécessaire de saisir le mot de passe de l’autorité de certification. Recommencez la procédure pour chaque client.

Cette fois encore, vous avez de nouveaux fichiers qui apparaissent pour chaque client : pki/private/clientA.key et pki/issued/clientA.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 :

./easy-rsa gen-dh

Vous obtenez un fichier pki/dh.pem.

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 /etc/openvpn/server/monserveur.conf.

Note : le nom du fichier importe peu mais sera utilisé dans le nom du service au démarrage (voir plus bas).

Voici son contenu :

# mode indique qu'il s'agit d'un fichier de configuration d'un serveur
mode server
topology subnet
# 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

#
# 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 ping 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 /var/run/openvpn/jail
# tmpdir est relatif à la jail
tmp-dir /tmp
persist-key
persist-tun
allow-compression no
#
# Log
verb 3
mute 20
# les chemins des logs sont absolus
status /var/run/openvpn/jail/log/openvpn-status.log
log-append /var/run/openvpn/jail/log/openvpn.log

Avant de démarrer le serveur, il reste à créer les répertoires dans lequel celui-ci s’isolera après son lancement :

mkdir -p /var/run/openvpn/jail
mkdir -p /var/run/openvpn/jail/tmp
mkdir -p /var/run/openvpn/jail/log
chown -R nobody:nogroup /var/run/openvpn
chmod -R 770 /var/run/openvpn

Et c’est tout, le serveur est prêt à l’emploi. Démarrez-le avec la commande systemctl start openvpn-server@monserveur 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
#
# 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
auth-nocache
remote-cert-tls server
#
# Securite
nobind
persist-key
persist-tun
verb 3

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