OpenVPN est une application logicielle open-source qui implémente des techniques de réseau privé virtuel pour créer des connexions sécurisées point à point ou site à site dans des configurations routées ou pontées et des installations d’accès distant.
xakz > moi j’dis: tor browser -> openvpn perso sur vps -> vpn payant (3-4e/mois) -> méchant Internet
Licence
OpenVPN est fournis avec à la base 2 connexions gratuites, généralement pour effectuer des tests. Au delà de 2 utilisateurs clients il faudra acheter des licences (15$/client par an) https://openvpn.net/%20pricing/
Installation
On commence simplement par installer Openvpn via la commande apt
# apt install openvpn |
Configuration
Génération des clés et certificats
L’installation d’Openvpn ajoutera automatiquement le paquet easy-rsa
, les fichiers se trouveront dans /usr/share/easy-rsa
(Selon les distributions les fichiers peuvent se trouver dans /usr/share/doc/openvpn/examples/easy-rsa/2.0
)
On copie ensuite ces fichiers dans le répertoire d’openvpn.
# cp -a /usr/share/easy-rsa /etc/openvpn/ |
Les scripts présent dans /etc/openvpn/easy-rsa/
ont besoin d’être configurés pour utiliser l’authentification par clés/certificats. On se place donc dans ce répertoire afin de procéder à la configuration et la génération de ces dernier·ère·s
# cd /etc/openvpn/easy-rsa |
On ouvre le fichier vars
présent dans ce répertoire
# vim /etc/openvpn/easy-rsa/vars |
Puis on modifie ces lignes (elles peuvent être laissées avec leurs valeurs par défaut)
export KEY_COUNTRY="US" |
On charge les (nouvelles) valeurs.
# source ./vars |
On nettoie les anciens certificats qui auraient été générés antérieurement à l’aide du script clean-all
présent dans le répertorie.
# ./clean-all |
On lance la création de la clé de Diffie-Helman (qui peut prendre beaucoup de temps), toujours à l’aide des scripts présents, ici build-dh
.
# ./build-dh |
On utilise maintenant le script pkitool
, c’est un outil qui nous permettra de générer les clés privées du serveur ainsi que son certificat. Pour plus d’information sur son utilisation il suffit de regarder l’aide :
# ./pkitool --help |
Génération du certificat ca.crt
et de la clé privée ca.key
root dans /etc/openvpn/easy-rsa/keys/
, cette dernière doit être gardée en sécurité et ne doit pas être directement utilisable par Openvpn. Normalement ses droits sont à rw-------
# ./pkitool --initca |
Génération de la clé MonServer.key
et du certificat MonServer.crt
dans /etc/openvpn/easy-rsa/keys/
./pkitool --server MonServer |
Et enfin on génère a clé ta.key
. L’option genkey
permet de générer une clé qui sera utilisée comme secret. L’option secret permet d’écrire la clé dans le fichier.
# openvpn --genkey --secret keys/ta.key |
On copie ensuite les clés et les certificats utiles pour le serveur dans le répertoire /etc/openvpn/
:
# cp keys/ca.crt keys/ta.key keys/MonServer.crt keys/MonServer.key keys/dh1024.pem /etc/openvpn/ |
Chrooter OpenVPN
Par mesure de sécurité on va chrooté OpenVPN dans le répertoire /etc/openvpn/jail/
, ainsi en cas de faille de sécurité le processus ne pourra pas s’exécuter au-delà de ce répertoire.
# mkdir /etc/openvpn/jail |
Configuration du serveur VPN
On va maintenant créer le fichier de configuration d’OpenVPN et y ajouter les options nécessaires. Il est à noter que beaucoup de firewall bloquent le port 1194, si aucun service http ne tourne sur le serveur il est judicieux d’utiliser le port 443 (https) qui sera certainement accessible.
# Vim /etc/openvpn/server.conf |
# Serveur TCP/1194 |
Ce fichier server.conf
permet de créer un serveur VPN SSL routé basée sur le protocole TCP et utilisant le port HTTPS (443) afin de maximiser sont accessibilité depuis des réseaux sécurisés par des Firewalls. Les clients obtiendront une nouvelle adresse IP dans le range 10.8.0.0/24.
Pour vérifier si la configuration et correcte, on se place dans le répertoire /etc/openvpn
.
# cd /etc/openvpn |
Et on lance la commande openvpn server.conf
:
# openvpn server.conf |
On peut maintenant lancer le serveur :
# service openvpn start |
Configuration réseaux
Autoriser le sous-réseau à communiquer vers l’extérieur
Il faut configurer le serveur pour en faire un routeur. Les clients peuvent à ce stade se connecter au VPN et auront une adresse en 10.8.0.x, cependant ils ne sont pas autorisés à sortir de ce réseaux privé et il leur est donc impossible d’accéder à Internet.
Il faut donc router ce sous-réseau privé vers l’extérieur, le serveur fera le lien entre l’interface du VPN (tun0) et l’interface physique (eth0) et fera également la translation d’adresse (NAT) entre les adresses en 10.8.0.x privés et son adresse IP réelle (publique).
Pour activer le routage il faut modifier la valeur par défaut dans le fichier /proc/sys/net/ipv4/ip_forward
qui est à zéro et la mettre à 1. Vous pouvez l’ouvrir avec vim et y modifier cette valeur ou directement passer par cette commande :
# echo 1 > /proc/sys/net/ipv4/ip_forward |
Pour que le routage soit permanent il faut décommenter la ligne 28 du fichier /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4 |
Configurer IPtables
Si vous utiliser Iptables il faut configurer certaines règles pour autoriser la connexion ainsi que le routage. Si vous n’utiliser pas Iptables il est possible que le firewall vous bloque quand même car la politique des règles par défaut est à DROP.
# Pour router les paquets (faire en sorte que le serveur ait un rôle de routeur |
Révoquer des certificats
Pour révoquer des certificats, en cas de départ de membre du personnel ou en cas de perte d’un pc portable par exemple, on se place dans /etc/openvpn/easy-rsa
et on lance le script revoke-full avec en paramètre le certificat à révoquer.
# ./revoke-full PC42 |
Un fichier crl.pem
sera généré (crl = certificate revocation list) et il faudra le copier dans /etc/openvpn/
# cp keys/crl.pem /etc/openvpn/ |
Pour que ce fichier soit pris en compte, il faut préciser l’option crl-verify
dans le fichier de configuration du serveur /etc/openvpn/clientconf
. Normalement la modification est immédiate.
Comptes clients OpenVPN
On crée, par soucis d’organisation, un répertoire qui contiendra la configuration des clients.
# mkdir /etc/openvpn/clientconf |
Nous allons maintenant créer une clé pour le client PC1, on se place dans /etc/openvpn/easy-rsa
:
# cd /etc/openvpn/easy-rsa |
On charge les (nouvelles) valeurs.
# source vars |
Clé sans mot de passe
On pourra ici se connecter au VPN directement. Pour cela on lance le script qui va générer cette clé.
# ./build-key PC1 |
Clé avec mot de passe
Lors de la connexion au VPN, un mot de passe sera demandé :
# ./build-key-pass PC1 |
Les fichiers
Les scripts généreront 3 fichiers dans le répertoire /etc/openvpn/easy-rsa/keys
- PC1.crt: Certificat pour le client
- PC1.csr: Certificat à laisser sur le serveur
- PC1.key: Clés pour le client
On copie ces fichiers dans un dossier PC1 à créer dans /etc/openvpn/clientconf/
# mkdir /etc/openvpn/clientconf/PC1/ |
Copie des fichiers :
# cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/PC1.crt keys/PC1.key /etc/openvpn/clientconf/PC1/ |
Obtenir son adresse IP
On se place dans /etc/openvpn/clientconf/PC1/
:
# cd /etc/openvpn/clientconf/PC1/ |
On crée le fichier client.conf
, il faut mettre l’adresse IP publique du serveur sur lequel est installé OpenVPN à la place des xxx.yyy.zzz.aaa.
Vous pouvez obtenir l’adresse IP publique du serveur via la commande ip addr
sous réserve que ce dernier ne se situe pas dans un réseau privé. Sinon vous aurez l’adresse IP locale.
# ip addr |
Vous pouvez utiliser wget
qui va interroger un site web qui fournit l’adresse IP publique.
# wget -qO- ifconfig.me/ip |
ou bien simplement utiliser la commande hotname -i
, là encore il ne faut pas que le serveur soit sur un réseau privé, vous obtiendrez cette fois-ci l’adresse de loopback.
# hostname -i |
Ou encore cette solution :
ip route show dev eth0 |
Ici l’interface réseau est eth0, pour les lister un simple ifconfig suffit.
Création du fichier client
# Configuration du client |
Si vous voulez installer votre client sur Windows il faudra mettre l’extension .ovpn à votre fichier. On en fait donc une copie, qui sera toujours utile au cas où.
# cp client.conf client.ovpn |
Le répertoire /etc/openvpn/clientconf/PC1/
doit maintenant contenir les fichiers suivant :
- **ca.crt ** : Certificat du serveur
- **client.conf ** : Fichier de config du client OpenVPN pour Linux, BSD, MacOS X
- **client.ovpn ** : Fichier de config du client OpenVPN pour Windows
- hennionn.crt : Certificat du client
- hennionn.key : Clés du client
- **ta.key ** : Clés pour l’authentification
On archive le tout et on peut envoyer l’archive sur le poste client.
# zip PC1.zip * |
ou
# tar -czf PC1.tar * |
Client sous Windows
Il faut télécharger le client sur http://openvpn.net/index.php/open-source/downloads.html
Une fois installé vous pouvez décompresser l’archive dans C:\Programs Files\Openvpn\conf\
. Vous pouvez maintenant vous connecter via le bouton qui se trouve dans la barre des taches.
Erreurs rencontrées
J’avais une erreur et en faisant un netstat
j’ai constaté que Apache utilisait déjà le port 443 pour le https, ce qui gênait OpenVPN. Il est cependant possible de faire cohabiter Apache et OpenVPN pour l’utilisation de ce port.
# netstat -plnt |
Annexes
Script
Script (https://github.com/nicolargo/openvpnscripts/) permettant d’automatiser les étapes décrites dans ce paragraphe et donc de permettre simplement la déclaration d’un nouveau client VPN sur votre serveur:
Plan réseau
Réaffecter soi-même les routes pour le VPN :
Commandes réseaux
# route add -net 10.8.0.0/24 gw 91.121.3.255 |
Configuration Iptables
# OpenVPN |
Documentation
https://openvpn.net/community/
https://openvpn.net/%20pricing/
https://angristan.fr/proxy-http-squid/
https://desgeeksetdeslettres.com/hardware/difference-proxy-vpn-anonyme
https://blog.nicolargo.com/2010/10/installation-dun-serveur-openvpn-sous-debianubuntu.html
https://technique.arscenic.org/.../installation-et-configuration-d
https://www.tecmint.com/install-openvpn-in-debian/
http://michauko.org/blog/openvpn-les-doigts-dans-le-nez-631/
https://fr.wikibooks.org/wiki/Administration_r%C3%A9seau_sous_Linux/Routage
https://www.hscripts.com/fr/tutoriels/linux-commands/route.html
http://openvpn.net/index.php/open-source/downloads.html
https://github.com/nicolargo/openvpnscripts/
https://raw.github.com/nicolargo/openvpnscripts/master/ovcreateclient-debian.sh
https://raw.github.com/nicolargo/openvpnscripts/master/ovcreateclient-centos.sh