From 93dba9c96363259d813f6dbbe3cef7e990bc788a Mon Sep 17 00:00:00 2001 From: tpilat Date: Thu, 24 Nov 2016 15:07:37 +0100 Subject: [PATCH] Initial import --- HowtoOpenVPN.md | 433 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 433 insertions(+) create mode 100644 HowtoOpenVPN.md diff --git a/HowtoOpenVPN.md b/HowtoOpenVPN.md new file mode 100644 index 00000000..1a67168a --- /dev/null +++ b/HowtoOpenVPN.md @@ -0,0 +1,433 @@ +# Howto OpenVPN + +https://openvpn.net/index.php/open-source/documentation.html + +## Installation sous OpenBSD + + + # pkg_add openvpn + + +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 : + + + # cd /etc/openvpn/ssl + # sh shellpki.sh create + + +Note : le CN sera par exemple de la forme `fw.vpn.example.com` (il sera demandé de le saisir deux fois). + +La configuration se fera via un 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) + * `push` : route vers le réseau que les clients VPN pourront joindre + * `cert` : certificat du serveur VPN (créé précédemment) + * `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 + + + + daemon + + port 1194 + proto udp + dev tun0 + dev-type tap + verb 4 + + user nobody + group nobody + chroot /var/empty + #comp-lzo + + max-clients 50 + keepalive 15 120 + tls-exit + persist-key + persist-tun + client-to-client + resolv-retry infinite + + server 10.11.99.0 255.255.255.0 + local 198.51.100.1 + #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" + + ca /etc/openvpn/ssl/ca/cacert.pem + dh /etc/openvpn/ssl/ca/dh1024.pem + + cert /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.crt + key /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.key + + log /var/log/openvpn.log + status /var/log/openvpn-status.log + + cipher AES-128-CBC # AES + + #fragment 1350 + #mssfix + + +Pour créer automatiquement une interface `TUN` au démarrage de la machine et démarrer OpenVPN : + + + # cat << EOF > /etc/hostname.tun0 + up + !/usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf + EOF + + +Pour lancer manuellement OpenVPN sans redémarrer la machine : + + + # ifconfig tun0 up + # /usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf + + +### Rotation des logs sous OpenBSD + +Pour que les logs générés par OpenVPN soient rotatés, ne pas oublier de décommenter la ligne en question dans le fichier _/etc/newsyslog.conf_ : + + /var/log/openvpn.log 600 52 * $W6D4 Z + + +## Installation sous Debian + + + # apt install openvpn + + +La configuration se fera via un fichier `/etc/openvpn/server.conf` : + + + + # + # General settings + # + + user nobody + group nogroup + + # Do not try to re-read key file and reopen tun device on restart since it runs + # without root privileges. + persist-key + persist-tun + #persist-remote-ip + #persist-local-ip + + # Status file + status /var/log/openvpn/status.log 1 + #log /var/log/openvpn/openvpn.log + # Logging verbosity. Logs are sent to syslog. + verb 3 + + # Keepalive + keepalive 10 120 + #reneg-sec 300 + + # + # Network settings + # + + port 1194 + proto udp + dev tun + + # Enable compression + comp-lzo + + # + # key/certificate + # + + ca /etc/openvpn/ssl/ca/cacert.pem + cert /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.crt + key /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.key + dh /etc/openvpn/ssl/ca/dh1024.pem + + # + # private network + # + + server 172.16.0.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 + + +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 + + +### check OpenVPN pour Nagios + +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 + + +Récupérer le script depuis le CVS _scripts_, et installer les dépendances (TODO: à mettre le script en public) + + + # apt install libnet-telnet-perl + + + +## Mise en place d'une PKI avec shellPKI (OpenBSD et Debian) + +OpenVPN s'appuye 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. + +* 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`) + + +## 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. +Ce fichier peut être utilisé afin de rendre persistantes les IPs attribuées aux clients. + +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. + +## Créer les paramètres pour un nouveau client VPN + +* Exécuter : + + + # cd /etc/openvpn/ssl + # sh shellpki.sh create + + +* Choisir un CN 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 le certificat principal du VPN + +Si le certificat indiqué au niveau de la configuration OpenVPN expire lui-même : + + + cert /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.crt + key /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.key + + +Il faut le révoquer, puis en recréer un : + + + # cd /etc/openvpn/ssl + # sh shellpki.sh revoke + # sh shellpki.sh create + # cp /etc/openvpn/ssl/crl.pem /var/empty/ + + +Enfin, on ajuste les lignes dans la configuration OpenVPN et on relance le daemon. + + +## Configuration inline pour client OpenVPN + +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 + + persist-key + persist-tun + pull + + cipher AES-128-CBC + + + -----BEGIN CERTIFICATE----- + […] + -----END CERTIFICATE----- + + + + Certificate: + Data: + […] + -----END CERTIFICATE----- + + + + -----BEGIN RSA PRIVATE KEY----- + […] + -----END RSA PRIVATE KEY----- + + + + +## Client OpenVPN sous Mac OS X + +Télécharger la dernière version stable de Tunnelblick sur http://code.google.com/p/tunnelblick/ + +On suit les instructions d'installation (en anglais), puis : +* On choisit de générer la configuration (indiquer qu'on n'a pas de fichiers de configuration) +* Cela génère une configuration standard, notamment un dossier sur le bureau avec un fichier _config.ovpn_ +* On édite le _config.ovpn_ en ajustant les options _remote_, _ca_, _cert_ et _key_. +* On copie également clé et certificatS dans ce dossier +* On doit ensuite renommer ce dossier avec un nom se terminant par .tblk +* 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 + +On utilise l'application libre "OpenVPN for Android" disponible sur [Google Play](https://play.google.com/store/apps/details?id=de.blinkt.openvpn) et [F-Droid](https://f-droid.org/repository/browse/?fdfilter=openvpn&fdid=de.blinkt.openvpn) +qui ne nécessite pas de droits "root" avec Android 4 ou supérieur. + +La configuration d'un VPN nécessite les informations suivantes : +* le certificat CA peut être importé sous format PEM +* le certificat client doit être au format PKCS#12 (fichier .p12 ou .pfx), on pourra ainsi le créer à partir de la clé/certificat : + + $ openssl pkcs12 -export -in goyk3OkjeuPread8Sluld.privacy.evolix.org.crt -inkey goyk3OkjeuPread8Sluld.privacy.evolix.org.key -out goyk3OkjeuPread8Sluld.privacy.evolix.org.p12 + +* décocher "Compression LZO" si ce n'est pas supporté par votre serveur +* décocher "Vérification du certificat de l'hôte" (sinon cela ne fonctionne pas a priori…) +* forcer "Algorithme de chiffrement" à AES-128-CBC (à ajuster selon votre serveur) + + +## How to OpenVPN niveau 2 + +Dans l'exemple qui suit le serveur VPN est sur une machine sous Debian et le client sur une machine sous OpenBSD + +Voici le fichier _/etc/openvpn/server.conf_ sous Debian : + + port 1194 + proto udp + dev tap0 + server-bridge + keepalive 10 120 + + ;tls-auth ta.key 0 # This file is secret + ;cipher BF-CBC # Blowfish (default) + ;cipher AES-128-CBC # AES + ;cipher DES-EDE3-CBC # Triple-DES + + comp-lzo + + ;max-clients 100 + ;user nobody + ;group nobody + + persist-key + persist-tun + + ca /etc/openvpn/ssl/ca/cacert.pem + cert /etc/openvpn/ssl/files/serveur/serveur.crt + key /etc/openvpn/ssl/files/serveur/serveur.key + dh /etc/openvpn/ssl/ca/dh2048.pem + + status /var/log/openvpn-status.log + log /var/log/openvpn.log + verb 3 + + +Voici le fichier de configuration client sous OpenBSD : + + client + proto udp + dev tun0 + dev-type tap + verb 4 + + tls-client + remote 1.2.3.4 1194 + + user _openvpn + group _openvpn + chroot /var/empty + + persist-key + persist-tun + pull + + status /var/log/openvpn-status.log + + comp-lzo + #verb 3 + #cipher AES-128-CBC + + ca /etc/openvpn/ssl/files/client/client.pem + cert /etc/openvpn/ssl/files/client/client.crt + key /etc/openvpn/ssl/files/client/client.key + + + +## FAQ + +### Erreur "--crl-verify fails" (constaté sur un serveur OpenVPN sous OpenBSD) + + + Options error: --crl-verify fails with 'crl.pem': No such file or directory + Options error: Please correct these errors. + + +Il faut parfois regénérer un fichier CRL. + +Si l'on utilise une version récente de [shellpki](https://forge.evolix.org/projects/shellpki) : + + + # cd /tmp + # shellpki.sh crl + # cp crl.pem /var/empty + + + +### Erreur "ROUTE: route addition failed using createipforwardentry" (constaté sur un client OpenVPN sous Windows) + +En cas d'erreur _ROUTE: route addition failed using createipforwardentry_, l'utilisateur n'a pas les droits suffisants pour ajouter une nouvelle route. +Il faut essayer d'exécuter les logiciels (_openvpn.exe_ et _openvpngui.exe_) dans un mode de compatibilité _lancer en Administrateur_. Pour plus de détails,voir http://www.bolehvpn.net/forum/index.php?topic=1746.0 + +### Erreur "no more TUN/TAP adapter" (constaté sur un client OpenVPN sous Windows) + +En cas d'erreur _no more TUN/TAP adapter_ aller dans _menu démarrer_> _OpenVPN_> _Add new TUN/TAP Adapter_ + +### Erreur "Authentificate/Decrypt packet error: cipher final failed" (constaté sur un client OpenVPN sous Android) + +Cela signifie que l'algorithme de chiffrement n'est pas synchronisé entre le client et le serveur. +Il faut donc ajuster la directive "cipher" sur le client. + +### Erreur "Bad LZO decompression header byte" (constaté sur un client OpenVPN sous Android) + +Cela signifie que la compression LZO n'est pas activée sur le serveur, il faut donc désactiver la compression au niveau du client.