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 :
1 |
$ wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add - |
Puis ajoutons le repo à la liste des sources :
1 |
$ 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
1 |
$ 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.
1 2 |
$ 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.
1 |
$ vi /etc/openvpn/easy-rsa/vars |
Configurer maintenant le fichier
1 2 3 4 5 6 7 8 |
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
1 2 |
$ cd /etc/openvpn/easy-rsa $ ln -s openssl-1.0.0.cnf openssl.cnf |
Chargeons les variables
1 |
$ 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)
1 |
$ ./clean-all |
Créer l’autorité de certification
1 |
$ ./build-ca |
Puisque nous avons renseigné les variables, vous n’avez qu’à appuyer sur Entrée pour confirmer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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”)
1 |
$ ./build-key-server server |
Ne tapez pas de challenge password et tapez y pour signer le certificat.
1 2 3 4 5 6 |
[...] 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.
1 |
$ 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).
1 |
$ openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key |
Si tout s’est bien passé, vous devriez avoir les fichiers suivants :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ 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.
1 2 |
$ 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
1 |
$ 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
1 |
$ adduser --system --shell /usr/sbin/nologin --no-create-home openvpn |
Editez le fichier de configuration du serveur et modifiez ainsi les instructions :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
$ 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 :
1 2 |
$ 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
1 |
$ 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
1 |
$ ip addr show tun0 |
Vous devriez obtenir la réponse suivante
1 2 3 4 5 6 |
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
1 |
$ systemctl enable openvpn@server |
Configuration des clients
Maintenant que le serveur est actif, nous allons pouvoir passer à la configuration des clients
1 2 |
$ 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
1 |
$ ./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
1 |
$ ./build-key client1 |
Nous allons maintenant créer le fichier de configuration pour le(s) client(s).
Nous allons préparer le répertoire :
1 2 |
$ mkdir -p /etc/openvpn/client-configs/files $ chmod 700 /etc/openvpn/client-configs/files |
et y copier le fichier de configuration client
1 |
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-configs/base.conf |
Editons le fichier
1 2 |
$ cd /etc/openvpn/client-configs $ vi base.conf |
Adaptez le fichier pour obtenir ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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/
1 |
$ vi /etc/openvpn/client-configs/make_config.sh |
Et collez le contenu suivant
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/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
1 |
$ 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.
1 2 |
$ 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
1 2 |
;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
1 |
$ vi /etc/sysctl.conf |
et activez la directive suivante en supprimant le commentaire
1 2 |
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 |
Collez le contenu suivant :
Redémarrez
1 |
$ sysctl -p |