wiki/HowtoOpenVPN.md

409 lines
12 KiB
Markdown
Raw Normal View History

2017-11-03 21:01:24 +01:00
---
categories: vpn sysadmin security
title: Howto OpenVPN
...
2016-11-24 15:07:37 +01:00
2017-11-03 21:01:24 +01:00
* Documentation : <https://openvpn.net/index.php/open-source/documentation.html>
2016-11-24 15:07:37 +01:00
2017-11-06 17:06:51 +01:00
OpenVPN est un logiciel qui permet de faire des tunnels VPN en utilisant le chiffrement [TLS](https://fr.wikipedia.org/wiki/Transport_Layer_Security). Bien qu'OpenVPN sache utiliser aussi une clé partagé (*PSK*) ou des couples *utilisateur*:*mot de passe*, nous utilisons exclusivement des [PKI](https://fr.wikipedia.org/wiki/Infrastructure_%C3%A0_cl%C3%A9s_publiques)
2017-11-03 21:01:24 +01:00
## Installation
### Debian
~~~
# apt install openvpn
# openvpn --version
OpenVPN 2.3.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 26 2017
library versions: OpenSSL 1.0.2l 25 May 2017, LZO 2.08
# /etc/init.d/openvpn status
● openvpn.service - OpenVPN service
Loaded: loaded (/lib/systemd/system/openvpn.service; enabled)
Active: active (exited) since Fri 2017-11-03 20:37:21 CET; 20min ago
Process: 20889 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 20889 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/openvpn.service
2017-11-03 21:02:45 +01:00
Nov 03 20:37:21 evolix-www01 systemd[1]: Starting OpenVPN service...
Nov 03 20:37:21 evolix-www01 systemd[1]: Started OpenVPN service.
2017-11-03 21:01:24 +01:00
~~~
### OpenBSD
2016-11-24 15:07:37 +01:00
~~~
# pkg_add openvpn
$ openvpn --version
2017-11-03 21:01:24 +01:00
OpenVPN 2.4.4 x86_64-unknown-openbsd6.2 [SSL (OpenSSL)] [LZO] [LZ4] [MH/RECVDA] [AEAD] built on Sep 29 2017
library versions: LibreSSL 2.6.3, LZO 2.10
~~~
2016-11-24 15:07:37 +01:00
2017-11-03 21:01:24 +01:00
## Configuration
2016-11-24 15:07:37 +01:00
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
~~~
2016-11-24 15:07:37 +01:00
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
2016-11-24 15:07:37 +01:00
La configuration se fera via un fichier `/etc/openvpn/server.conf` :
2017-11-09 21:41:16 +01:00
### Serveur, sous OpenBSD
~~~
daemon
2016-11-24 15:07:37 +01:00
port 1194
proto udp
dev tun0
dev-type tap
verb 4
2016-11-24 15:07:37 +01:00
user nobody
group nobody
chroot /var/empty
#comp-lzo
2016-11-24 15:07:37 +01:00
max-clients 50
keepalive 15 120
tls-exit
persist-key
persist-tun
client-to-client
resolv-retry infinite
2016-11-24 15:07:37 +01:00
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"
2016-11-24 15:07:37 +01:00
ca /etc/openvpn/ssl/ca/cacert.pem
dh /etc/openvpn/ssl/ca/dh1024.pem
2016-11-24 15:07:37 +01:00
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
2016-11-24 15:07:37 +01:00
log /var/log/openvpn.log
status /var/log/openvpn-status.log
2016-11-24 15:07:37 +01:00
cipher AES-128-CBC # AES
2016-11-24 15:07:37 +01:00
#fragment 1350
#mssfix
~~~
2016-11-24 15:07:37 +01:00
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
~~~
2016-11-24 15:07:37 +01:00
Pour lancer manuellement OpenVPN sans redémarrer la machine :
~~~
# ifconfig tun0 up
# /usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf
~~~
2016-11-24 15:07:37 +01:00
Pour que les logs générés par OpenVPN soient rotatés, il faut rajouter la ligne en question dans le fichier `/etc/newsyslog.conf` :
2016-11-24 15:07:37 +01:00
~~~
/var/log/openvpn.log 600 52 * $W6D4 Z
~~~
2016-11-24 15:07:37 +01:00
2017-11-09 21:41:16 +01:00
### Serveur, sous Debian
2016-11-24 15:07:37 +01:00
~~~
#
# General settings
#
2016-11-24 15:07:37 +01:00
user nobody
group nogroup
2016-11-24 15:07:37 +01:00
# 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
2016-11-24 15:07:37 +01:00
# Status file
status /var/log/openvpn/status.log 1
#log /var/log/openvpn/openvpn.log
# Logging verbosity. Logs are sent to syslog.
verb 3
2016-11-24 15:07:37 +01:00
# Keepalive
keepalive 10 120
#reneg-sec 300
2016-11-24 15:07:37 +01:00
#
# Network settings
#
2016-11-24 15:07:37 +01:00
port 1194
proto udp
dev tun
2016-11-24 15:07:37 +01:00
# Enable compression
comp-lzo
2016-11-24 15:07:37 +01:00
#
# key/certificate
#
2016-11-24 15:07:37 +01:00
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
2016-11-24 15:07:37 +01:00
#
# private network
#
2016-11-24 15:07:37 +01:00
server 172.16.0.0 255.255.0.0
mode server
2016-11-24 15:07:37 +01:00
# Management interface (used by check_openvpn for Nagios)
management 127.0.0.1 1195 /etc/openvpn/management-pwd
~~~
2016-11-24 15:07:37 +01:00
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
~~~
2016-11-24 15:07:37 +01:00
Puis ajouter le check Nagios dans la conf NRPE :
2016-11-24 15:07:37 +01:00
~~~
# 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
~~~
2016-11-24 15:07:37 +01:00
Enfin on installe les dépendances du check
2016-11-24 15:07:37 +01:00
~~~
# apt install libnet-telnet-perl
~~~
2016-11-24 15:07:37 +01:00
2017-11-09 21:41:16 +01:00
### 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
persist-key
persist-tun
pull
cipher AES-128-CBC
<ca>
-----BEGIN CERTIFICATE-----
[…]
-----END CERTIFICATE-----
</ca>
<cert>
Certificate:
Data:
[…]
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN RSA PRIVATE KEY-----
[…]
-----END RSA PRIVATE KEY-----
</key>
~~~
2016-11-24 15:07:37 +01:00
2017-11-09 21:36:50 +01:00
## PKI avec shellPKI (OpenBSD et Debian)
2016-11-24 15:07:37 +01:00
2017-11-09 21:36:50 +01:00
OpenVPN s'appuie par défaut sur des certificats, il est donc nécessaire de mettre en place une PKI.
2016-11-24 15:07:37 +01:00
On utilisera [shellPKI](https://forge.evolix.org/projects/shellpki) permettant de gérer une PKI très simplement en ligne de commande.
2017-11-09 21:36:50 +01:00
### Mise en place
2016-11-24 15:07:37 +01:00
* 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 .
~~~
2016-11-24 15:07:37 +01:00
* 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`
2016-11-24 15:07:37 +01:00
* 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`
2016-11-24 15:07:37 +01:00
* Exécuter :
~~~
# sh shellpki.sh init
~~~
2016-11-24 15:07:37 +01:00
* 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`)
2017-11-09 21:36:50 +01:00
### Créer un nouveau certificat
2016-11-24 15:07:37 +01:00
~~~
# cd /etc/openvpn/ssl
# sh shellpki.sh create
~~~
2016-11-24 15:07:37 +01:00
* 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.
2017-11-09 21:36:50 +01:00
### Renouveller un certificat
2016-11-24 15:07:37 +01:00
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/
~~~
2016-11-24 15:07:37 +01:00
2017-11-09 21:36:50 +01:00
Si c'est le certificat, du serveur OpenVPN, il faut en plus modifier
la configuration puis relancer le démon.
2017-11-09 21:47:13 +01:00
## Permettre aux clients de conserver la même IP au fil de connexions
2017-11-09 21:36:50 +01:00
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.
2016-11-24 15:07:37 +01:00
2017-11-09 21:47:13 +01:00
## Howto configuration du client
2017-11-09 21:42:56 +01:00
### Template systemd pour démarrer le client OpenVPN
2017-05-19 09:54:11 +02:00
2017-09-14 17:48:39 +02:00
Pour démarrer le client OpenVPN, il existe un template systemd, pour le démarrer et l'activer au démarrage :
2017-05-19 09:54:11 +02:00
~~~
2017-05-19 09:55:23 +02:00
# systemctl start openvpn@client
2017-11-09 21:42:56 +01:00
# systemctl enable openvpn@client
2017-05-19 09:54:11 +02:00
~~~
2016-11-24 15:07:37 +01:00
2017-11-09 21:42:56 +01:00
### Client OpenVPN sous Mac OS X
2016-11-24 15:07:37 +01:00
2017-11-09 21:49:27 +01:00
Télécharger la dernière version stable de Tunnelblick sur <https://tunnelblick.net/downloads.html>
2016-11-24 15:07:37 +01:00
On suit les instructions d'installation (en anglais), puis :
2016-11-24 15:07:37 +01:00
* 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_.
2017-11-09 21:50:54 +01:00
* On copie également la clé et les certificats (ca et cart) dans ce dossier
2016-11-24 15:07:37 +01:00
* 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.)
2017-11-09 21:42:56 +01:00
### Client OpenVPN sous Android
2016-11-24 15:07:37 +01:00
2017-11-09 21:57:34 +01:00
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/packages/de.blinkt.openvpn/) qui ne
nécessite pas de droits "root" avec Android 4 ou supérieur.
2016-11-24 15:07:37 +01:00
La configuration d'un VPN nécessite les informations suivantes :
2016-11-24 15:07:37 +01:00
* 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 :
~~~
2017-11-09 21:57:34 +01:00
$ openssl pkcs12 -export -in goyk3OkjeuPread8Sluld.privacy.example.com.crt -inkey goyk3OkjeuPread8Sluld.privacy.example.com.key -out goyk3OkjeuPread8Sluld.privacy.example.com.p12
~~~
2016-11-24 15:07:37 +01:00
* 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)
2017-11-09 21:57:34 +01:00
Si erreur _ca md too weak_ cela signifie que le certificat utilise du MD5. Pour forcer quand même, il faut mettre dans les options personnalisées :
2017-07-24 13:37:19 +02:00
~~~
tls-cipher "DEFAULT:@SECLEVEL=0"
~~~
2016-11-24 15:07:37 +01:00
2017-11-09 21:47:13 +01:00
## Erreurs fréquentes
2017-01-20 11:22:34 +01:00
### Erreur "--crl-verify fails" (serveur OpenVPN OpenBSD)
2016-11-24 15:07:37 +01:00
~~~
Options error: --crl-verify fails with 'crl.pem': No such file or directory
Options error: Please correct these errors.
~~~
2016-11-24 15:07:37 +01:00
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
~~~
2016-11-24 15:07:37 +01:00
2017-01-20 11:22:34 +01:00
### Erreur "createipforwardentry" (client OpenVPN Windows)
2016-11-24 15:07:37 +01:00
En cas d'erreur `ROUTE: route addition failed using createipforwardentry`, l'utilisateur n'a pas les droits suffisants pour ajouter une nouvelle route.
2016-11-24 15:07:37 +01:00
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
2017-01-20 11:22:34 +01:00
### Erreur "no more TUN/TAP adapter" (client OpenVPN Windows)
2016-11-24 15:07:37 +01:00
En cas d'erreur `no more TUN/TAP adapter` aller dans _menu démarrer_> _OpenVPN_> _Add new TUN/TAP Adapter_
2016-11-24 15:07:37 +01:00
2017-01-20 11:22:34 +01:00
### Erreur "cipher final failed" (client OpenVPN Android)
2016-11-24 15:07:37 +01:00
2017-01-20 11:21:14 +01:00
L'erreur `Authentificate/Decrypt packet error: cipher final failed` signifie que l'algorithme de chiffrement n'est pas synchronisé entre le client et le serveur.
2016-11-24 15:07:37 +01:00
Il faut donc ajuster la directive "cipher" sur le client.
2017-01-20 11:22:34 +01:00
### Erreur "Bad LZO decompression header byte" (client OpenVPN Android)
2016-11-24 15:07:37 +01:00
2017-01-20 11:21:14 +01:00
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.