OpenVPN : mettre en place une connexion VPN

Présentation

OpenVPN est un protocole VPN open-source permettant de chiffrer les échanges entre 2 appareils (un client et ce qu’on appelle un serveur).

Afin d’utiliser la dernière version, nous allons ajouter le repository officiel et pour cela nous allons commencer par importer la clé PGP publique pour signer les paquetages :

$ wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -

Puis ajoutons le repo à la liste des sources :

$ echo "deb http://build.openvpn.net/debian/openvpn/release/2.4 stretch main" > /etc/apt/sources.list.d/openvpn-aptrepo.list

Nous pouvons maintenant installer les packages requis

$ apt update && apt install openvpn easy-rsa

OpenVPN est un VPN TLS/SSL. Cela signifie qu’il utilise des certificats pour chiffrer le trafic Internet entre le serveur et les clients. Pour cela, nous allons devoir créer une autorité de certification (CA).
Nous allons créer un dossier pour les clés et utiliser un jeu de scripts livrés avec OpenVPN.

$ mkdir /etc/openvpn/keys
$ cp /usr/share/easy-rsa/ /etc/openvpn -r

Configuration du serveur

Grace aux scripts installés dans le répertoire /etc/openvpn/easy-rsa/ nous allons pouvoir maintenant configurer OpenVPN et utiliser une authentification par clés et certificats.
Le fichier /etc/openvpn/easy-rsa/vars permet d’initialiser les variables.

$ vi /etc/openvpn/easy-rsa/vars

Configurer maintenant le fichier

export KEY_SIZE=4096
export KEY_COUNTRY="FR"
export KEY_PROVINCE="IDF"
export KEY_CITY="Paris"
export KEY_ORG="XXX"
export KEY_EMAIL="nomail@XXX.net"
export KEY_OU="XXXServer"
export KEY_NAME="server"

Compléter les champs XXX ci-dessus sans modifier la variable KEY_NAME.
Ensuite lancez les commandes suivantes pour générer les fichiers

$ cd /etc/openvpn/easy-rsa
$ ln -s openssl-1.0.0.cnf openssl.cnf

Chargeons les variables

$ source vars

Réinitialisons les clés (utile si vous avez déjà généré des clés ou que vous voulez recommencer leur génération)

$ ./clean-all

Créer l’autorité de certification

$ ./build-ca

Puisque nous avons renseigné les variables, vous n’avez qu’à appuyer sur Entrée pour confirmer

Generating a 4096 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) [FR]:
State or Province Name (full name) [BZH]:
Locality Name (eg, city) [Rennes]:
Organization Name (eg, company) [Petitsurfeur]:
Organizational Unit Name (eg, section) [PetitsurfeurServer]:
Common Name (eg, your name or your server's hostname) [Petitsurfeur CA]:
Name [server]:
Email Address [nomail@petitsurfeur.net]:

Créez maintenant le certificat du serveur
(c’est à ca que va servir KEY_NAME= »server »)

$ ./build-key-server server

Ne tapez pas de challenge password et tapez y pour signer le certificat.

[...]
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Cela a généré les fichiers server.crt et server.key dans /etc/openvpn/easy-rsa/keys/, et ces fichiers sont signés par l’autorité de certification.

Nous allons maintenant créer un dispositif cryptographique nommé Diffie Hellman. Cela va servir à échanger des clés utilisés par 2 équipements pour établir une clé partagée connue d’eux seuls. Cela va prendre plusieurs minutes.

$ openssl dhparam 4096 > /etc/openvpn/easy-rsa/keys/dh4096.pem

Pour la dernière étape de la configuration serveur, nous allons générer une clé HMAC (Hash-based message authentication code) prépartagée pour contrer les attaques reposant sur les injections de paquets et les interceptions (de type man in the middle).

$ openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key

Si tout s’est bien passé, vous devriez avoir les fichiers suivants :

$ ll /etc/openvpn/easy-rsa/keys
-rw-r--r-- 1 root root 5560 mai   14 14:03 01.pem
-rw-r--r-- 1 root root 1716 mai   14 13:58 ca.crt
-rw------- 1 root root 1704 mai   14 13:58 ca.key
-rw-r--r-- 1 root root  424 mai   14 14:16 dh4096.pem
-rw-r--r-- 1 root root  129 mai   14 14:03 index.txt
-rw-r--r-- 1 root root   21 mai   14 14:03 index.txt.attr
-rw-r--r-- 1 root root    0 mai   14 13:55 index.txt.old
-rw-r--r-- 1 root root    3 mai   14 14:03 serial
-rw-r--r-- 1 root root    3 mai   14 13:55 serial.old
-rw-r--r-- 1 root root 5560 mai   14 14:03 server.crt
-rw-r--r-- 1 root root 1074 mai   14 14:03 server.csr
-rw------- 1 root root 1704 mai   14 14:03 server.key
-rw------- 1 root root  636 mai   14 14:30 ta.key

Configuration du serveur OpenVPN

Nous allons déplacer tous les fichiers qui concernent la configuration du serveur dans le dossier /etc/openvpn/server.

$ cd /etc/openvpn/easy-rsa/keys
$ cp ca.crt ca.key server.crt server.key ta.key dh4096.pem /etc/openvpn/server

Récupérons maintenant le fichier de configuration du serveur

$ gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

OpenVPN tourne par défaut avec l’utilisateur root. Nous allons donc créer un utilisateur spécifique

$ adduser --system --shell /usr/sbin/nologin --no-create-home openvpn

Editez le fichier de configuration du serveur et modifiez ainsi les instructions :

$ vi /etc/openvpn/server.conf

[...]
# TCP or UDP server?
proto tcp
;proto udp
[...]
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key  # This file should be kept secret
[...]
dh /etc/openvpn/server/dh4096.pem
[...]
push "redirect-gateway def1 bypass-dhcp"
[...]
# Ce sont les serveur OpenDNS
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
[...]
tls-auth /etc/openvpn/server/ta.key 0 # This file is secret
#key-direction 0
[...]
cipher AES-256-CBC
auth SHA512
# Limit Ciphers
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA
[...]
user openvpn
group nogroup
[...]
status /var/log/openvpn-status.log
[...]
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
verb 5 # Pour avoir des logs plus complets en cas de problème au lancement
[...]
;explicit-exit-notify 1

Si vous ne souhaitez pas conserver les logs, vous pouvez les rediriger vers /dev/null

Démarrer le serveur
Il y a 2 services à lancer :

$ systemctl start openvpn
$ systemctl start openvpn@server

Le @server est le nom du serveur que vous avez configuré dans le fichier vars (= export KEY_NAME)
Vérifions que les services tournent bien

$ systemctl status openvpn*.service

Si les 2 services ont un statut ‘active’, c’est que c’est bon.

Nous pouvons également vérifier si l’interface tun0 est disponible

$ ip addr show tun0

Vous devriez obtenir la réponse suivante

3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::e473:e01c:6a8c:2208/64 scope link flags 800
       valid_lft forever preferred_lft forever

Il ne reste plus qu’à activer le service pour qu’il se lance au démarrage

$ systemctl enable openvpn@server

Configuration des clients

Maintenant que le serveur est actif, nous allons pouvoir passer à la configuration des clients

$ cd /etc/openvpn/easy-rsa
source vars

Dans l’exemple suivant, le client s’appellera client1 mais je vous conseille de choisir un nom plus explicite (nom de machine ou de la personne qui utilisera le certificat)
Pour sécuriser le certificat client avec un mot de passe, tapez la commande suivante

$ ./build-key-pass client1

Si vous ne voulez pas utiliser de mot de passe, ce qui est conseillé pour une connexion VPN automatique, la commande est

$ ./build-key client1

Nous allons maintenant créer le fichier de configuration pour le(s) client(s).
Nous allons préparer le répertoire :

$ mkdir -p /etc/openvpn/client-configs/files
$ chmod 700 /etc/openvpn/client-configs/files

et y copier le fichier de configuration client

$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-configs/base.conf

Editons le fichier

$ cd /etc/openvpn/client-configs
$ vi base.conf

Adaptez le fichier pour obtenir ceci :

proto tcp
;proto udp
[...]
# Inscrivez ici l'IP du serveur
remote vpn.petitsurfeur.net 1194
[...]
user nobody
group nogroup
[...]
# Si vous souhaitez insérer les certificats dans le fichier, vous pouvez commenter les lignes suivantes. Sinon pensez à changer les noms des fichiers
ca ca.crt
cert client1.crt
key client1.key
[...]
tls-auth ta.key 1
key-direction 1
[...]
cipher AES-256-CBC
auth SHA512

# Cipher Restrictions
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA

Script de configuration

Nous allons créer un script pour compiler dans le fichier de configuration le certificat et les clés.
Créons le fichier make_config.sh dans le dossier /etc/openvpn/client-configs/

$ vi /etc/openvpn/client-configs/make_config.sh

Et collez le contenu suivant

#!/bin/bash

# First argument: Client identifier

KEY_DIR=/etc/openvpn/easy-rsa/keys
OUTPUT_DIR=/etc/openvpn/client-configs/files
BASE_CONFIG=/etc/openvpn/client-configs/base.conf

cat ${BASE_CONFIG} \
      <(echo -e '') \
      <(echo -e '\n') ${KEY_DIR}/ca.crt \
      <(echo -e '') \
      <(echo -e '') \
      <(echo -e '\n') ${KEY_DIR}/${1}.crt \
      <(echo -e '') \
      <(echo -e '') \
      <(echo -e '\n') ${KEY_DIR}/${1}.key \
      <(echo -e '') \
      <(echo -e '') \
      <(echo -e '\n') ${KEY_DIR}/ta.key \
      <(echo -e '') \
      <(echo -e '') > ${OUTPUT_DIR}/${1}.ovpn

Rendons le fichier exécutable

$ chmod 700 /etc/openvpn/client-configs/make_config.sh

Générer le fichier de configuration client

Avec le script, nous allons pouvoir générer facilement les fichiers de configuration client. Nous avons précédemment créer les fichiers client1.crt et client1.key, nous allons maintenant créer le fichier de configuration pour client1.

$ cd /etc/openvpn/client-configs
./make_config.sh client1

Si tout se passe bien, vous devriez avoir un fichier client1.ovpn dans /etc/openvpn/client-configs/files

Si le client est sous Windows, vous devrez commenter les lignes suivantes dans le fichier .ovpn

;user nobody
;group nobody

Pour finir, copier le fichier .ovpn dans le dossier C:\Program Files\OpenVPN\config et lancer OpenVPN GUI.

Paramétrage réseau du serveur

Nous devons tout d’abord autoriser le serveur à rediriger le trafic. Ouvrez le fichier suivant

$ vi /etc/sysctl.conf

et activez la directive suivante en supprimant le commentaire

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Collez le contenu suivant :
Redémarrez

$ sysctl -p

Vous aimerez aussi...