From 7dd4b53de8001933a33c775413cb713fe9cd7fc8 Mon Sep 17 00:00:00 2001 From: Gregory Colpart Date: Sat, 11 Nov 2017 19:36:18 +0100 Subject: [PATCH] relecture --- HowtoOpenVPN.md | 200 +++++++++++++++++++++++++++--------------------- 1 file changed, 114 insertions(+), 86 deletions(-) diff --git a/HowtoOpenVPN.md b/HowtoOpenVPN.md index b3bae6fa..0c2cae68 100644 --- a/HowtoOpenVPN.md +++ b/HowtoOpenVPN.md @@ -5,7 +5,7 @@ title: Howto OpenVPN * Documentation : -[OpenVPN](https://openvpn.net/) permet de monter des tunnels [VPN](https://fr.wikipedia.org/wiki/Réseau_privé_virtuel) (Virtual Private Network) en utilisant [SSL/TLS](https://fr.wikipedia.org/wiki/Transport_Layer_Security) pour le chiffrement. Bien qu'OpenVPN sache utiliser aussi une clé partagé (PSK — Pre-Shared Key) ou des couples *utilisateur*/*mot de passe*, nous préférons utiliser des certificats avec une [PKI](https://fr.wikipedia.org/wiki/Infrastructure_%C3%A0_cl%C3%A9s_publiques) (Public Key Infrastructure). +[OpenVPN](https://openvpn.net/) permet de monter des tunnels [VPN](https://fr.wikipedia.org/wiki/Réseau_privé_virtuel) (Virtual Private Network) en utilisant [SSL/TLS](HowtoSSL) pour le chiffrement. Pour l'authentification, OpenVPN peut utiliser une simple clé partagée (PSK — Pre-Shared Key) ou des couples *utilisateur*/*mot de passe*, mais nous préférons utiliser des certificats avec une [PKI](https://fr.wikipedia.org/wiki/Infrastructure_%C3%A0_cl%C3%A9s_publiques) (Public Key Infrastructure). ## Installation @@ -36,19 +36,21 @@ OpenVPN 2.4.4 x86_64-unknown-openbsd6.2 [SSL (OpenSSL)] [LZO] [LZ4] [MH/RECVDA] library versions: LibreSSL 2.6.3, LZO 2.10 ~~~ -## Configuration +## Configuration serveur -On gère une PKI sur le serveur via shellpki (voir ci-dessous). -On crée clé/certificat pour le serveur VPN avec la commande suivante : +On met en place une PKI sur le serveur via [shellpki](HowtoShellpki) : ~~~ +# mkdir /etc/openvpn/ssl +# git clone https://forge.evolix.org/shellpki.git /etc/openvpn/ssl # cd /etc/openvpn/ssl +# sh shellpki.sh init # sh shellpki.sh create ~~~ -Note : le CN (*Common Name*) sera par exemple de la forme `fw.vpn.example.com` (il sera demandé de le saisir deux fois). +Mettre un _Common Name_ du type `fw.vpn.example.com` avec une durée de plusieurs années. Pour plus d'informations, voir [HowtoShellpki](HowtoShellpki) -La configuration se fait via un fichier `/etc/openvpn/server.conf` avec les paramètres suivants à adapter : +La configuration se fait via le fichier `/etc/openvpn/server.conf` avec les paramètres suivants à adapter : * `server` : réseau privé sur lequel le serveur VPN et les clients communiqueront * `local` : adresse IP du serveur, sur laquelle les clients se connecteront (adresse IP publique généralement) @@ -57,7 +59,7 @@ La configuration se fait via un fichier `/etc/openvpn/server.conf` avec les para * `key` : clé du serveur VPN (créée précédemment) * `ifconfig-pool-persist` : permet aux clients de conserver la même IP en cas de redémarrage -### Serveur, sous OpenBSD +### Serveur sous OpenBSD ~~~ daemon @@ -81,13 +83,13 @@ persist-tun client-to-client resolv-retry infinite -server 10.11.99.0 255.255.255.0 local 198.51.100.1 +server 192.0.2.0 255.255.255.0 #client-to-client ifconfig-pool-persist /etc/openvpn/ipp.txt #route-method exe #route-delay 2 -push "route 192.0.2.0 255.255.255.0 10.11.99.1" +push "route 203.0.113.0 255.255.255.0 192.0.2.1" ca /etc/openvpn/ssl/ca/cacert.pem dh /etc/openvpn/ssl/ca/dh1024.pem @@ -126,7 +128,7 @@ Pour que les logs générés par OpenVPN soient "rotatés", il faut rajouter la /var/log/openvpn.log 600 52 * $W6D4 Z ~~~ -### Serveur, sous Debian +### Serveur sous Debian ~~~ # @@ -177,8 +179,8 @@ dh /etc/openvpn/ssl/ca/dh1024.pem # private network # -server 172.16.0.0 255.255.0.0 -mode server +server 192.0.2.0 255.255.0.0 +mode server # Management interface (used by check_openvpn for Nagios) management 127.0.0.1 1195 /etc/openvpn/management-pwd @@ -187,41 +189,38 @@ management 127.0.0.1 1195 /etc/openvpn/management-pwd Générer un mot de passe pour l'accès à l'interface de management (nécessaire au check Nagios) : ~~~ -# apg -n1 -m 12 >/etc/openvpn/management-pwd +# apg -n1 -m 12 > /etc/openvpn/management-pwd ~~~ -Puis ajouter le check Nagios dans la conf NRPE : - -~~~ -# echo "command[check_openvpn]=/usr/lib/nagios/plugins/check_openvpn.pl -H 127.0.0.1 -p 1195 -P $(cat /etc/openvpn/management-pwd)" >>/etc/nagios/nrpe.d/evolix.cfg -~~~ - -Enfin on installe les dépendances du check +On peut ensuite utiliser le check Nagios suivant : ~~~ # apt install libnet-telnet-perl +# /usr/lib/nagios/plugins/check_openvpn.pl -H 127.0.0.1 -p 1195 -P $(cat /etc/openvpn/management-pwd)" ~~~ -### Client + +## Cconfiguration client Pour simplifier la configuration pour les utilisateurs finaux on peut générer un fichier de configuration embarquant les certificats : ~~~ client dev tap0 -tls-client proto udp -#comp-lzo -#ns-cert-type server tls-client remote vpn.example.com 1194 +comp-lzo +nobind +user nobody +group nogroup +#chroot /var/empty persist-key persist-tun -pull - -cipher AES-128-CBC +max-routes 1000 +#cipher AES-128-CBC -----BEGIN CERTIFICATE----- @@ -243,52 +242,20 @@ Certificate: ~~~ -## PKI avec shellPKI (OpenBSD et Debian) +### Nouveau certificat avec shellpki -OpenVPN s'appuie par défaut sur des certificats, il est donc nécessaire de mettre en place une PKI. -On utilisera [shellPKI](https://forge.evolix.org/projects/shellpki) permettant de gérer une PKI très simplement en ligne de commande. - -### Mise en place - -* Créer le répertoire `/etc/openvpn/ssl`, et cloner le dépôt shellpki : - -~~~ -# mkdir /etc/openvpn/ssl -# cd /etc/openvpn/ssl -# git clone https://forge.evolix.org/shellpki.git . -~~~ - -* Créer le répertoire `/var/www/htdocs/vpn/ssl` (OpenBSD) ou `/var/www/vpn/ssl` (Debian) dans lequel les certificats seront copiés par défaut pour être distribués. Cet emplacement est configurable dans `shellpki.sh` - -* Editer les paramètres de la section `[ req_distinguished_name ]` du fichier `openssl.cnf`, notamment : - * `countryName_default` - * `stateOrProvinceName_default` - * `localityName_default` - * `0.organizationName_default` - * `emailAddress_default` - -* Exécuter : - -~~~ -# sh shellpki.sh init -~~~ - -* Confirmer l'initialisation, et choisir la passphrase qui sera demandée à chaque création de nouveaux certificats, puis le `Common Name` des futurs certificats créés (ex : `vpn.example.com`) - -### Créer un nouveau certificat +Pour une nouvelle connexion VPN, il faudra créer un nouveau certificat : ~~~ # cd /etc/openvpn/ssl # sh shellpki.sh create ~~~ -* Choisir un CN unique pour la machine (ex : `client1.vpn.example.com`) +* Choisir un _Common Name_ unique pour la machine (ex : `client1.vpn.example.com`) * Récupérer le certificat et la clé dans `/var/www/htdocs/vpn/ssl` -* Dans la conf client, rajouter la directive `nobind`. Par défaut le client se bind sur l'ip locale et le port 1194, `nobind` force l'utilisation d'un port aléatoire. - -### Renouveller un certificat +### Renouveller un certificat avec shellpki Il faut le révoquer, puis en recréer un : @@ -299,26 +266,10 @@ Il faut le révoquer, puis en recréer un : # cp /etc/openvpn/ssl/crl.pem /var/empty/ ~~~ -Si c'est le certificat du serveur OpenVPN, il faut en plus modifier -la configuration puis relancer le démon. +Si c'est le certificat du serveur OpenVPN, il faut en plus modifier la configuration puis relancer le démon. -## Permettre aux clients de conserver la même IP au fil de connexions -Le fichier `ipp.txt` contient une liste des clients et de leur adresse IP afin qu'en cas de redémarrage du serveur, -ils conservent la même adresse. - -Dans le `server.conf` ou `server.ovpn` : - -~~~ -ifconfig-pool-persist /etc/openvpn/ipp.txt 0 -~~~ - -Cela rend le fichier `ipp.txt` en lecture seule pour OpenVPN. -Il faudra donc ajouter une nouvelle ligne de la forme `CN,IP` à chaque ajout d'un nouveau client. - -## Configuration du client - -### Template systemd pour démarrer le client OpenVPN +### Client sous Linux Pour démarrer le client OpenVPN, il existe un template systemd, pour le démarrer et l'activer au démarrage : @@ -327,7 +278,18 @@ Pour démarrer le client OpenVPN, il existe un template systemd, pour le démarr # systemctl enable openvpn@client ~~~ -### Client OpenVPN sous Mac OS X +### Client sous Windows + +On peut télécharger un client 32bits ou 64biits sur . + +Une fois installé, copier les fichiers `.ovpn` et le certificat de la CA dans le répertoire de configuration d'OpenVPN, par exemple `C:\Program Files\OpenVPN\config`. + +Attention, il faut exécuter OpenVPN en tant qu'administrateur, cela peut se faire via un clic droit : `Exécuter en tant qu'administrateur`. + +OpenVPN est alors disponible dans la barre des tâches. +Pour lancer une session, effectuez un clic-droit et sélectionnez `Connecter`. + +### Client sous Mac OS X Télécharger la dernière version stable de Tunnelblick sur @@ -341,7 +303,7 @@ On suit les instructions d'installation (en anglais), puis : * on "double-clic" ensuite dessus, et cela installe configuration ; * on peut ensuite lancer le VPN via l'icone présente, puis choisir diverses options (connexion automatique, etc.). -### Client OpenVPN sous Android +### Client sous Android On utilise l'application libre "OpenVPN for Android" disponible sur [Google Play](https://play.google.com/store/apps/details?id=de.blinkt.openvpn) @@ -367,14 +329,15 @@ Si erreur `ca md too weak` cela signifie que le certificat utilise du MD5. Pour tls-cipher "DEFAULT:@SECLEVEL=0" ~~~ -### Client OpenVPN sous iOS +### Client sous Apple iOS -Les systèmes iOS d'Apple disposent nativement du support de plusieurs types de VPN (IKEv2, IPsec ou L2TP), mais pas pour OpenVPN. On utilise alors l'application "OpenVPN Connect" (éditée par "OpenVPN Technologies") qui va exploiter les API bas niveau de l'OS pour un support complet d'OpenVPN dans les interfaces du système. +Les systèmes iOS d'Apple disposent nativement du support de plusieurs types de VPN (IKEv2, IPsec ou L2TP), mais pas pour OpenVPN. On utilise alors l'application "OpenVPN Connect" (éditée par "OpenVPN Technologies") qui va exploiter les API bas niveau de l'OS pour un support d'OpenVPN dans les interfaces du système. -Pour ajouter une configuration cliente, il suffit de s'envoyer le fichier `.ovpn` par mail ou via un partage de fichier quelconque et il s'ouvrira dans l'application. Il est possible d'avoir plusieurs configuration disponibles. +Pour ajouter une configuration cliente, il suffit d'ouvrir le fichier `.ovpn`. Il est possible d'avoir plusieurs configurations disponibles. Pour activer la connexion VPN il faut alors se rendre dans l'application "Réglages", puis "VPN" où sont listés les profils disponibles. On peut choisir celui à utiliser et activer la connexion. Si tout se passe bien, le symbole "VPN" apparaît dans la barre d'icones tout en haut de l'écran. + ## Erreurs fréquentes ### Erreur "--crl-verify fails" (serveur OpenVPN – OpenBSD) @@ -411,3 +374,68 @@ Il faut donc ajuster la directive "cipher" sur le client. ### Erreur "Bad LZO decompression header byte" (client OpenVPN – Android) L'erreur `Bad LZO decompression header byte` signifie que la compression LZO n'est pas activée sur le serveur, il faut donc désactiver la compression au niveau du client. + + +## FAQ + +### Permettre aux clients de conserver la même IP au fil de connexions + +#### ipp.txt + +Le fichier `ipp.txt` contient une liste des clients et de leur adresse IP afin qu'en cas de redémarrage du serveur, +ils conservent la même adresse. + +Dans le `server.conf` ou `server.ovpn` : + +~~~ +ifconfig-pool-persist /etc/openvpn/ipp.txt 0 +~~~ + +Cela rend le fichier `ipp.txt` en lecture seule pour OpenVPN. +Il faudra donc ajouter une nouvelle ligne de la forme `CN,IP` à chaque ajout d'un nouveau client. + +#### /etc/openvpn/ccd + +Une autre méthode est d'ajouter la directive suivante pour le serveur OpenVPN : + +~~~ +client-config-dir /etc/openvpn/ccd +username-as-common-name +~~~ + +Le répertoire `/etc/openvpn/ccd/` contient des fichiers avec les _Common Name_ et contenant les adresses IP fixés ainsi : + +~~~ +ifconfig-push 172.16.1.1 255.255.0.0 +~~~ + +### Authentification via Radius + +Il faut installer le plugin : + +~~~ +# apt install openvpn-auth-radius +# cp /usr/share/doc/openvpn-auth-radius/examples/radiusplugin.cnf /etc/openvpn/ +# openvpn --genkey --secret /etc/openvpn/ta.key +~~~ + +On ajoute dans la configuration du serveur : + +~~~ +client-cert-not-required +username-as-common-name +tls-auth ta.key 0 +topology subnet +plugin /usr/lib/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf +status /var/log/openvpn/status.log 1 +~~~ + +et on modifie le paramètre _sharedsecret_ du fichier `/etc/openvpn/radiusplugin.cnf` pour se connecter au serveur Radius. + +Puis dans la configuration du client : + +~~~ +auth-user-pass +#auth-user-pass /etc/openvpn/passwd +auth-nocache +~~~