Un VPN est un réseau privé virtuel qui vous permet d'accéder à Internet ou à certains services même à partir d'un réseau non fiable. En gros, c'est comme si vous étiez physiquement connecté à un réseau privé :par exemple, vous pouvez accéder à votre compte bancaire ou effectuer des paiements sans craindre que quelqu'un intercepte le trafic généré par votre appareil.
OpenVPN est un VPN basé sur les protocoles TLS (Transport Layer Security) et SSL (Secure Sockets Layer). OpenVPN utilise certains certificats pour crypter le trafic entre le serveur et le client.
Dans ce tutoriel, vous verrez comment configurer OpenVPN sur un serveur avec Ubuntu 18.04.
Pour mettre en œuvre ce tutoriel, une machine serveur et une autre machine faisant office de CA (Autorité de Certification), qui évaluera la validité des certificats, sont nécessaires.
Vous devrez vous connecter à votre serveur et à votre CA via une connexion SSH. Si vous ne l'avez pas encore fait, il est recommandé de suivre notre guide pour vous connecter en toute sécurité avec le protocole SSH.
Installer OpenVPN
Accéder à votre serveur.
OpenVPN est déjà disponible sur le référentiel Ubuntu officiel d'Ubuntu, il n'est donc pas nécessaire d'ajouter quoi que ce soit d'autre.
Tapez :
sudo apt update
sudo apt install openvpn
À ce stade, OpenVPN aura été installé avec succès sur votre serveur.
Installer EasyRSA
Continuez en téléchargeant EasyRSA sur votre Serveur et sur votre CA en tapant sur les deux machines :
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
La dernière version peut être téléchargée depuis https://github.com/OpenVPN/easy-rsa/releases
$ cd ~
$ sudo tar xvf EasyRSA-3.0.4.tgz
Le nom peut être différent selon la version téléchargée
Configuration du serveur
Terminez la configuration du serveur en tapant :
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ sudo gzip -d /etc/openvpn/server.conf.gz
$ sudo nano /etc/openvpn/server.conf
Recherchez la section qui fait référence à HMAC ("tls-auth"). Si la ligne est commentée, supprimez le ";".
Retrouvez la section sur le chiffrement ("chiffrement"). Si commenté, supprimez le ";". Ajoutez une nouvelle ligne contenant le texte "auth SHA256" juste en dessous.
Trouvez la section "dh" définissant les paramètres Diffie-Hellman et supprimez "2048" du nom ("dh dh.pem" devrait être obtenu).
Recherchez la section "utilisateur" et "groupe" et supprimez le ";" pour décommenter les lignes.
Configuration d'EasyRSA sur l'autorité de certification
Après l'installation d'EasyRSA, un fichier de configuration pour définir les variables de votre CA a été créé sur votre CA. Saisissez :
$ cd ~/EasyRSA-3.0.4/
$ cp vars.example vars
$ nano vars
Supprimez le "#" des instructions présentées dans la figure ci-dessous :
Démarrez le script "easyrsa" pour initialiser l'infrastructure à clé publique (PKI) :
$ sudo ./easyrsa init-pki
$ sudo ./easyrsa build-ca nopass
avec cette commande deux fichiers seront créés :
ca.crt :certificat CA public utilisé par les serveurs et les clients pour notifier mutuellement qu'ils font partie du même réseau de confiance.
ca.key :clé privée utilisée par la machine CA pour signer les clés et les certificats des serveurs et des clients. Ce fichier doit être conservé uniquement sur la machine CA (qui n'est pas accessible par des tiers), sinon la sécurité du réseau peut être compromise.
Vous devrez entrer un nom. Laissez-le vide et appuyez sur Entrée.
Demander un certificat de serveur à l'autorité de certification
Maintenant que la machine CA est configurée, demandez au serveur de générer une clé privée et une demande de certificat et envoyez-les à la machine CA pour les faire signer :
$ cd ~/EasyRSA-3.0.4
$ ./easyrsa init-pki
$ ./easyrsa gen-req server nopass
Pour plus de simplicité, laissez "serveur" comme nom pour la machine, pour éviter de faire plusieurs modifications par la suite.
Vous venez de créer une clé privée pour le serveur et une demande de certificat appelée "server.req":
$ sudo cp ~/EasyRSA-v3.0.6/pki/private/server.key /etc/openvpn/
Copiez le fichier server.req sur la machine CA :
$ sudo scp ~/EasyRSA-3.0.4/pki/reqs/server.req [email protected]_CA_ip:/tmp
Génération et signature du certificat
Sur votre CA dans le dossier EasyRSA, importez le fichier que vous venez de copier et signez-le :
$ cd ~/EasyRSA-3.0.4/
$ sudo ./easyrsa import-req /tmp/server.req server
$ sudo ./easyrsa sign-req server server
Tapez "oui" et appuyez sur Entrée.
Transférer le certificat signé et le ca.crt au serveur VPN :
$ sudo scp pki/issued/server.crt [email protected]_server_ip:/tmp
$ sudo scp pki/ca.crt [email protected]_server_ip:/tmp
Puis dans votre serveur
copier les fichiers reçus dans les répertoires appropriés :
$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/
$ cd ~/EasyRSA-3.0.4/
Générer une clé d'échange forte basée sur Diffie-Hellman.
$ sudo ./easyrsa gen-dh
$ sudo openvpn --genkey --secret ta.key
Copiez les fichiers générés dans le dossier "/etc/openvpn/"
$ sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/
$ sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/
Configuration d'un client
Créer un dossier pour stocker les certificats et les clés du client (ce guide ne présentant qu'un seul client, il est ici appelé 'client1', mais l'opération doit être répétée pour chaque client, en utilisant un dénomination)
$ sudo mkdir -p ~/client-configs/keys
$ sudo chmod -R 700 ~/client-configs
$ cd ~/EasyRSA-3.0.4/
$ sudo ./easyrsa gen-req client1 nopass
Appuyez sur Entrée pour accepter le nom standard proposé.
$ sudo cp pki/private/client1.key ~/client-configs/keys/
Copiez la clé du client dans le dossier créé précédemment.
$ sudo scp pki/reqs/client1.req [email protected]_CA_IP:/tmp
Envoyez le fichier client1.req à la machine CA.
Importez la demande de certificat sur votre CA :
$ cd ~/EasyRSA-3.0.4/
$ sudo ./easyrsa import-req /tmp/client1.req client1
$ sudo ./easyrsa sign-req client client1
Tapez "yes" pour autoriser la signature.
Téléchargez client1.crt sur votre serveur :
scp pki/issued/client1.crt [email protected]_SERVER:/tmp
Sur votre serveur, copiez les fichiers suivants dans les dossiers appropriés.
$ sudo mkdir -p ~/client-configs/keys
$ sudo chmod -R 700 ~/client-configs
$ sudo cp /tmp/client1.crt ~/client-configs/keys/
$ sudo cp ~/EasyRSA-3.0.4/ta.key ~/client-configs/keys/
$ sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/
Maintenant, les certificats et les clés du serveur et du client ont été générés.
Configuration du routage IP et du pare-feu
Modifiez les règles de transfert IP :
$ sudo nano /etc/sysctl.conf
Recherchez la section "net.ipv4.ip_forward" et supprimez le "#" pour rendre l'instruction "non commentée".
Modifiez certaines règles de pare-feu afin d'acheminer correctement les connexions client.
$ ip route | grep default
Stockez le nom après "dev" (nommé "eth0" dans la figure ci-dessous) :
$ sudo nano /etc/ufw/before.rules
Ajoutez les commandes comme dans la figure ci-dessous, en remplaçant "eth0" par le nom de votre interface réseau.
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
Enregistrer et quitter. Modifiez maintenant le fichier de configuration UFW :
$ sudo nano /etc/default/ufw
Changez la valeur du paramètre "DEFAULT_FORWARD_POLICY" avec "ACCEPT".
$ sudo ufw allow 1194/udp
Ajouter le port 1194 pour le trafic UDP.
$ sudo ufw allow OpenSSH
Redémarrez UFW :
$ sudo ufw disable
$ sudo ufw enable
Démarrez le service OpenVPN :
$ sudo systemctl start openvpn
Vérifiez l'état du service :
$ sudo systemctl status openvpn
Définir le service au démarrage du serveur.
$ sudo systemctl enable openvpn
Créez le fichier de configuration pour le client :
$ sudo mkdir -p ~/client-configs/files
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
$ sudo nano ~/client-configs/base.conf
Trouvez la section "remote" et assurez-vous qu'elle indique "remote IP_Server 1194"
IP_Server :écrivez l'IP du serveur
1194 :port précédemment sélectionné.
Recherchez la section "proto" pour vous assurer que le serveur est défini sur UDP (vous trouverez la ligne TCP commentée par un ";").
Recherchez la section "utilisateur" et "groupe" et supprimez le ";" pour leur faire "sans commentaires".
Recherchez les sections "ca.crt" - "client.crt" - "client.key" - "ta.key" et commentez-les avec un "#" au début de chaque ligne.
Recherchez la section "cipher" et ajoutez l'instruction "auth SHA256" sous l'instruction "cipher AES-256-CBC".
Ajouter l'instruction "key-direction 1" à tout moment.
Ajoutez ces lignes commentées à tout moment. Si le client est une machine Linux, faites-leur "sans commentaires".
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
Enregistrer et quitter.
Génération de la configuration pour les clients
Sur votre serveur, créez un script pour compiler automatiquement la configuration d'un client.
nano ~/client-configs/make_config.sh
Copiez et collez le texte :
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn
Enregistrer et quitter.
chmod 700 ~/client-configs/make_config.sh
Essayez maintenant de générer la "configuration" du client client
$ cd ~/client-configs
$ sudo ./make_config.sh client1
Un fichier appelé "client1.ovpn" sera créé.
Transférez maintenant ce fichier sur l'appareil que vous souhaitez utiliser. Il sera utilisé par le logiciel VPN pour la connexion.
Révocation des certificats client
$ cd EasyRSA-3.0.4/
$ sudo ./easyrsa revoke client1
client1 est le nom du client auquel les autorisations doivent être retirées
Tapez "yes" pour confirmer.
Générez et chargez le fichier crl.pem sur votre serveur :
$ sudo ./easyrsa gen-crl
$ sudo scp ~/EasyRSA-3.0.4/pki/crl.pem [email protected]_Server:/tmp
Mettez à jour la configuration de votre machine serveur pour vérifier la révocation.
$ sudo cp /tmp/crl.pem /etc/openvpn
$ sudo nano /etc/openvpn/server.conf
A la fin du fichier ajouter "crl-verify crl.pem".
Enregistrer et quitter.
$ sudo systemctl restart [email protected]
Redémarrez le serveur pour mettre en œuvre les modifications.