Mettre en place un VPN avec OpenVPN sur Debian

Un VPN c’est toujours pratique pour contourner les blocages géographiques si vous êtes à l’étranger ou pour faire péter les bridages de votre FAI (comme Free avec Youtube à une époque). Pour mettre en place un VPN, on va utiliser OpenVPN.

On va donc avoir besoin de OpenVPN, de OpenSSL et de Easy-RSA, un outil qui facilite la création des clé. Voici la la commande à lancer pour installer ces logiciels :
sudo install openvpn easy-rsa openssl

Maintenant que les logiciels sont installés, on va créer une ICP (ou PKI en anglais). Une ICP c’est une Infrastructure de Clés Publiques. C’est composé d’une clé publique, qui sera stockée sur le serveur, d’une clé privée, qui sera stockée sur le PC du ou des clients, et d’un certificat et une clé qui serviront à signer les certificats serveur et client, appelé Autorité de Certification Maître.

Principe de fonctionnement d’un VPN

Pour vous expliquer comment fonctionne un VPN (ou du moins ce que j’en ai compris), deux clés vont être créées. Une privée, qui sera la clé client, et une publique qui sera la clé serveur. Ces clés vont permettre au client et au serveur de se reconnaître. Une autorité de certification, qui sera auto-généré sur le serveur dans notre cas, va s’occuper de signer les certificats client et serveur afin de les marquer comme fiables, et ces certificats vont à leur tour valider l’identité des clés clients et serveur.
Dans un cadre professionnel, l’autorité de certification n’est pas auto-générée mais confiée à des sociétés comme VeriSign (à un prix assez élevé). Pour un VPN perso, une autorité de certification auto-généré fera parfaitement l’affaire.

Ensuite les clés et certificats client et serveur vont être créés. Les certificats, étant signées par l’autorité de certification, serviront à prouver l’identité des clés. Lorsqu’un client voudra se connecter au VPN, il faudra qu’il se munisse de sa clé privé. Le serveur VPN va vérifier que la clé privé soit fiable à l’aide de son certificat (qui a été signé par l’autorité de certification) puis l’associer (ou pas) à sa clé publique. Idem côté client.
Une fois l’association de clé acceptée, un canal chiffré SSL sera créé entre le client et le serveur. Ce chiffrement sera fait à l’aide d’une autre clé, utilisant la méthode Diffie-Hellman dans notre cas. Je ne vais pas expliquer le fonctionnement de cette méthode vu que je n’ai compris que les grandes lignes de cette méthode(ça m’évitera de dire des bêtises).

Une fois connecté au VPN,  si vous souhaitez accéder au site toto.fr, vous allez accéder d’abord au serveur VPN, via le tunnel VPN chiffré créé après l’échange des clés, puis le VPN va accéder au site toto.fr et vous renvoyer les info. Pour le site, vous êtes invisible et l’adresse IP qu’il voit est celle du VPN.

Pour autant un VPN n’est pas aussi anonyme que TOR par exemple. Le but d’un VPN hébergé sur une serveur perso n’est pas d’être totalement anonyme. Il y a des outils qui remplissent mieux ce rôle (TOR encore une fois).
Voila pour la théorie. Passons maintenant à la pratique.

Création des clés et des certificats

On va commencer par copier les scripts de Easy-RSA pour créer nos clés dans le répertoire /etc/openvpn. Lancez la commande
sudo cp -R /usr/share/easy-rsa/ /etc/openvpn/.

Allez dans le dossier copié avec la commande
cd /etc/openvpn/easy-rsa.

Dans le dossier /etc/openvpn/easy-rsa se trouve un fichier vars, un fichier de configuration, que l’on va éditer à l’aide de la commande
sudo nano vars.

Cherchez la partie

[pastacode lang=”bash” manual=”export%20KEY_COUNTRY%3D%22US%22%0Aexport%20KEY_PROVINCE%3D%22CA%22%0Aexport%20KEY_CITY%3D%22SanFrancisco%22%0Aexport%20KEY_ORG%3D%22Fort-Funston%22%0Aexport%20KEY_EMAIL%3D%22me%40myhost.mydomain%22%0Aexport%20KEY_OU%3D%22MyOrganizationalUnit%22″ message=”” highlight=”” provider=”manual”/]

et remplacer les valeurs par défaut par les bonnes valeurs (le bon nom de pays, ville, email, etc). On va également modifier la ligne export KEY_SIZE=2048 et mettre 4096 à la place de 2048 pour créer des clés 4096 bits au lieu de 2048. Y a plus qu’à sauvegarder (Ctrl+O) et fermer le fichier (Ctrl+X).

Autorité de certification maître

On va tout d’abord créer le certificat et la clé de l’Autorité de Certification Maître vu que les certificats serveur et client doivent être signés par cette autorité.
Comme les commandes qui vont suivre doivent être lancée en root, on va donc passer en root avec la commande
sudo -s.

On va ensuite mettre mettre à jour dans le système les variables que vous avez modifiées dans le fichier vars à l’aide la commande
. ./vars.

Avant de créer les clés et certificats, on va effacer toutes les clés et certificats existants à l’aide de la commande
./clean-all

Nous allons pouvoir maintenant construire le certificat et la clé de l’Autorité de Certification Maître (ça prend un peu de temps) avec la commande
./build-ca

On va vous demander de remplir des champs mais ils sont déjà pré-rempli grâce au fichier vars que l’on a édité plus tôt. Vous n’avez qu’à appuyer sur Entrée pour valider.
Si vous allez dans le dossier keys vous verrez un fichier ca.crt et un autre ca.key qui sont, respectivement, le certificat et la clé de l’Autorité de Certification Maître. Nous allons pouvoir maintenant générer nos clés serveur et client.

Clé et certificat serveur

On va commencer par la clé et le certificat serveur. Toujours dans le dossier /etc/openvpn/easy-rsa, lancez la commande
./build-key-server nomduserveur

Adaptez la commande en mettant le nom que vous voulez pour le serveur (pour ma part j’ai mis openvpn). Ca va lancer la création de la clé serveur. Comme pour tout à l’heure, il vous faudra valider les champs qui sont pré-rempli. Un mot de passe vous sera demandé, évitez de mettre 1234 ;). Ensuite un récapitulatif des données rentrées est affiché, si tout est OK, vous n’avez qu’à valider.
Dans le dossier keys vous verrez deux nouveaux fichiers, nomduserveur.crt et nomduserveur.key qui sont le certificat et la clé de votre clé serveur.

Clé et certificat client

Passons maintenant à la clé client. Dans le dossier /etc/openvpn/easy-rsa, lancer la commande
./build-key-pass client1

Comme pour la clé serveur il vous faudra l’adapter en mettant le nom de client que vous voulez. Il vous sera demandé une passphrase. C’est la passphrase qui vous permettra de vous connecter au VPN, donc choisissez une passphrase robuste.
Ensuite, là encore, il vous faudra valider des champs pré-remplis et donner un mot de passe. Il ne vous reste plus qu’à valider les info rentrées.
Dans le dossier keys vous verrez deux nouveaux fichiers, client1.crt et client1.key qui sont le certificat et la clé de votre clé client.

Clé secrète

On va créer une clé secrète qui sera partagée par le client et le serveur.
Cette clé a pour but de boucher une faille possible de sécurité. Le serveur VPN est obligé d’écouter en permanence le port 1194, ce qui le rend vulnérable aux attaques par déni de service.

Ces attaquent consistent à spammer le port d’un service pour le bloquer. Les célèbres attaques DDOS font parties de ces attaques par déni de service sauf qu’au lieu d’avoir un seul PC qui spamme le service, il y en a des dizaines ou des centaines. Ces attaques peuvent se produire pendant la phase d’initialisation de la connexion SSL lorsque le client échange avec le serveur.
C’est là où va intervenir la clé secrète. Elle va signer tous les paquets échangés entre le client et le serveur. Si le serveur reçoit un paquet qui n’est pas signé par cette clé il sera simplement ignoré, ce qui rendra impossible le fait de submerger le serveur VPN en le spammant de paquet.

Pour générer cette clé, aller dans le dossier /etc/openvpn/easy-rsa et tapez la commande
openvpn --genkey --secret keys/ta.key

Clé Diffie-Hellman

Il ne nous reste plus qu’à créer notre clé Diffie-Hellman qui nous servira à chiffrer le tunnel VPN. Dans le dossier /etc/openvpn/easy-rsa, lancez la commande
./build-dh.

Suivant la puissance de votre serveur/PC, ça peut prendre très, très longtemps (j’ai mis plus de deux heure pour générer la clé). A la fin, vous devriez avoir un nouveau fichier dh4096.pem dans le dossier keys.

Configuration du VPN

Faisons un récapitulatif des fichiers présents dans le répertoire keys :

Nom de fichier Utile à Utilité
ca.crt Serveur et tous les clients Certificat de l’autorité de certification
ca.key Serveur seulement Clé de l’autorité de certification
dh4096.pem Serveur seulement Clé Diffie-Hellman servant à chiffrer le tunnel VPN
ta.key Serveur et tous les clients Clé secrète
server.crt Serveur seulement Certificat serveur
server.key Serveur seulement Clé serveur
client1.crt Client1 seulement Certificat Client1
client1.key Client1 seulement Clé Client1

Sur la machine cliente, il vous faut donc le fichier ca.crt, ta.key, client1.crt et client1.key. Je vous recommande de copier ces fichiers dans un dossier accessible puis de les récupérer en sftp, c’est le moyen le plus simple. Pensez à les supprimer du dossier accessible une fois récupérés. Une fois récupérés sur le PC client, il faut les copier dans le répertoire /etc/openvpn (bien évidemment il faut que openvpn soit installé sur le PC client)

On va également copier les clés utiles au serveurs (ca.crt, ca.key, dh4096.pem, ta.key, server.crt et server.key) dans le répertoire /etc/openvpn. Depuis le répertoire /etc/openvpn/easy-rsa/keys, lancez la commande
cp ca.* openvpn.* dh4096.pem /etc/openvpn/

Adaptez la commande suivant le nom que vous avez donné à votre serveur VPN.

Configuration serveur

Maintenant que toutes nos clés et nos certificats sont créés, on va passer aux fichiers de configuration.

Des exemples de fichiers de configuration serveur et client sont fournis avec OpenVPN. On va commencer par le fichier de configuration serveur. On va le copier dans le répertoire /etc/openvpn avec la commande
zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Ouvrez le fichier server.conf que vous venez de copier. Il va falloir modifier plusieurs lignes

  • Adaptez la ligne cert server.crt suivant le nom que vous avez donné à votre serveur VPN.
  • Idem pour la ligne key server.key
  • Modifiez la ligne dh dh1024.pem et mettre dh dh4096.pem à la place.
  • Décommentez la ligne tls-auth ta.key 0 # This file is secret
  • Décommentez la ligne log-append  et rajoutez /var/log/ avant openvpn.log
  • Rajoutez la ligne push "route adresseipdevotreserveur/255 255.255.0.0"

C’est tout pour le fichier de configuration serveur

Configuration client

Passons au fichier client.

On va récupérer le fichier d’exemple avec la commande
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/

Ouvrez le fichier client.conf que vous venez de copier. Il va falloir, comme pour le fichier serveur, modifier des lignes.

  • Editez le nom des clé/certificat client suivant le nom que vous avez donné à votre client.
  • Décommentez la ligne remote et indiquez l’adresse IP de votre serveur.
  • Décommentez la ligne tls-auth ta.key 1.

Valider les modifications puis récupérer ce fichier sur le PC client et copiez le dans le répertoire /etc/openvpn.

Démarrage OpenVPN

On va maintenant vérifier qu’OpenVPN se lance avant d’aller plus loin.

Sortez du mode root puis, dans le dossier /etc/openvpn, lancez la commande
sudo openvpn server.conf.

Si vous voyez affiché Initialization Sequence Completed c’est que c’est bon. Si c’est pas le cas ça veut dire qu’il y a un soucis avec votre fichier server.conf.

Notre fichier de configuration étant bon, on va s’occuper du reste. Faites Ctrl+C pour arrêter OpenVPN. Commencez par ouvrir le port 1194 en UDP sur le serveur. Si vous utilisez ufw, la commande est
sudo ufw allow 1194/udp.

Ensuite on va activer le forward pour permettre au VPN de pouvoir accéder à internet en renvoyant le traffic arrivant sur le port 1194 sur l’interface eth0. Lancez la commande
sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

Pour rendre cette modification permanente, modifier le fichier /etc/sysctl.conf et ajouter la ligne net.ipv4.ip_forward = 1, puis valider les modifications.

Il va également falloir configurer Iptables pour le forward. Lancez ces 3 commandes

  • sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
  • sudo iptables -I FORWARD -i tun0 -j ACCEPT
  • sudo iptables -I FORWARD -o tun0 -j ACCEPT

Ces 3 commandes vont permettre de router le trafic qui arrive sur l’interface Tun0 vers Eth0 afin de pouvoir accéder à internet en utilisant le VPN. Les commandes Iptables n’étant pas permanentes (elles sont supprimées après un redémarrage), ouvrez le fichier /etc/rc.local et rajouter les 3 commandes Iptables, sans le sudo, juste avant la ligne Exit 0

On va configurer le système pour qu’il lance OpenVPN au démarrage. Lancez la commande
sudo systemctl enable openvpn@server.service

On va maintenant démarrer OpenVPN avec la commande s
udo systemctl start openvpn@server.service

Il ne vous reste plus qu’à vous connecter depuis votre poste client et vous pourrez naviguer à travers le VPN 😉

 

Source : https://doc.ubuntu-fr.org/openvpn, https://www.debian-fr.org/t/openvpn-connexion-internet-par-vpn/53241/8 et http://arnaud.aucher.net/?page_id=38

 

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.