wiki/HowtoOpenVPN.md

408 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.
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.
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:55:58 +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/)
2016-11-24 15:07:37 +01:00
qui ne nécessite pas de droits "root" avec Android 4 ou supérieur.
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 :
~~~
$ openssl pkcs12 -export -in goyk3OkjeuPread8Sluld.privacy.evolix.org.crt -inkey goyk3OkjeuPread8Sluld.privacy.evolix.org.key -out goyk3OkjeuPread8Sluld.privacy.evolix.org.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-07-24 13:37:19 +02:00
Si erreur _ca md too weak_ cela signifie que le certificat utilise du MD5. Pour forcer quand même, il faut même dans les options personnalisées :
~~~
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.