2017-11-03 21:01:24 +01:00
---
2017-11-11 13:45:01 +01:00
categories: vpn sysadmin security network
2017-11-03 21:01:24 +01:00
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-11 19:36:18 +01:00
[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).
2017-11-11 12:19:11 +01:00
2017-11-03 21:01:24 +01:00
## Installation
### Debian
~~~
# apt install openvpn
2017-11-11 12:19:11 +01:00
$ /usr/sbin/openvpn --version
OpenVPN 2.4.0 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017
2017-11-03 21:01:24 +01:00
library versions: OpenSSL 1.0.2l 25 May 2017, LZO 2.08
2017-11-11 12:19:11 +01:00
# systemctl status openvpn
2017-11-03 21:01:24 +01:00
● openvpn.service - OpenVPN service
Loaded: loaded (/lib/systemd/system/openvpn.service; enabled)
Process: 20889 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 20889 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/openvpn.service
~~~
### OpenBSD
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
~~~
# pkg_add openvpn
2017-11-09 21:30:00 +01:00
$ 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
2017-01-20 11:17:55 +01:00
~~~
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
## Configuration serveur
2017-11-03 21:01:24 +01:00
2017-11-11 19:36:18 +01:00
On met en place une PKI sur le serveur via [shellpki ](HowtoShellpki ) :
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
~~~
2017-11-11 19:36:18 +01:00
# mkdir /etc/openvpn/ssl
# git clone https://forge.evolix.org/shellpki.git /etc/openvpn/ssl
2017-01-20 11:17:55 +01:00
# cd /etc/openvpn/ssl
2017-11-11 19:36:18 +01:00
# sh shellpki.sh init
2017-01-20 11:17:55 +01:00
# sh shellpki.sh create
~~~
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
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 )
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
La configuration se fait via le fichier `/etc/openvpn/server.conf` avec les paramètres suivants à adapter :
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
* `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
2017-11-11 19:36:18 +01:00
### Serveur sous Debian
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
~~~
#
# General settings
#
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
user nobody
group nogroup
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +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
2017-01-20 11:17:55 +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
2017-01-20 11:17:55 +01:00
# Keepalive
keepalive 10 120
#reneg-sec 300
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
#
# Network settings
#
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
port 1194
proto udp
dev tun
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
# Enable compression
2018-02-14 14:35:46 +01:00
# comp-lzo
2018-03-27 23:20:04 +02:00
# compress (à partir d'OpenVPN 2.4)
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
#
# key/certificate
#
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +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
2017-11-30 00:29:16 +01:00
dh /etc/openvpn/ssl/ca/dh2048.pem
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
#
# private network
#
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
server 192.0.2.0 255.255.0.0
mode server
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +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) :
2017-01-20 11:17:55 +01:00
~~~
2017-11-11 19:36:18 +01:00
# apg -n1 -m 12 > /etc/openvpn/management-pwd
2017-01-20 11:17:55 +01:00
~~~
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
On peut ensuite utiliser le check Nagios suivant :
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
~~~
# apt install libnet-telnet-perl
2017-11-11 19:36:18 +01:00
# /usr/lib/nagios/plugins/check_openvpn.pl -H 127.0.0.1 -p 1195 -P $(cat /etc/openvpn/management-pwd)"
2017-01-20 11:17:55 +01:00
~~~
2016-11-24 15:07:37 +01:00
2017-11-13 01:33:08 +01:00
### Serveur sous OpenBSD
~~~
daemon
port 1194
proto udp
2018-02-15 11:46:41 +01:00
dev tap0
2017-11-13 01:33:08 +01:00
dev-type tap
verb 4
user nobody
group nobody
chroot /var/empty
2018-03-27 23:20:04 +02:00
#compress
2017-11-13 01:33:08 +01:00
max-clients 50
keepalive 15 120
tls-exit
persist-key
persist-tun
client-to-client
resolv-retry infinite
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 203.0.113.0 255.255.255.0 192.0.2.1"
ca /etc/openvpn/ssl/ca/cacert.pem
2017-11-30 00:29:16 +01:00
dh /etc/openvpn/ssl/ca/dh2048.pem
2017-11-13 01:33:08 +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
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
~~~
2017-11-13 11:38:00 +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` :
2017-11-13 01:33:08 +01:00
~~~
/var/log/openvpn.log 600 52 * $W6D4 Z
~~~
2017-11-11 19:36:18 +01:00
2017-11-13 01:33:08 +01:00
## Configuration client
2017-11-09 21:41:16 +01:00
Pour simplifier la configuration pour les utilisateurs finaux on peut générer un fichier de configuration embarquant les certificats :
~~~
client
dev tap0
proto udp
tls-client
remote vpn.example.com 1194
2018-03-27 23:20:04 +02:00
#compress
2017-11-11 19:36:18 +01:00
nobind
user nobody
group nogroup
#chroot /var/empty
2017-11-09 21:41:16 +01:00
persist-key
persist-tun
2017-11-11 19:36:18 +01:00
max-routes 1000
#cipher AES-128-CBC
2017-11-09 21:41:16 +01:00
< 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-11 19:36:18 +01:00
### Nouveau certificat avec shellpki
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
Pour une nouvelle connexion VPN, il faudra créer un nouveau certificat :
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +01:00
~~~
# cd /etc/openvpn/ssl
# sh shellpki.sh create
~~~
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
* Choisir un _Common Name_ unique pour la machine (ex : `client1.vpn.example.com` )
2016-11-24 15:07:37 +01:00
* Récupérer le certificat et la clé dans `/var/www/htdocs/vpn/ssl`
2017-11-11 19:36:18 +01:00
### Renouveller un certificat avec shellpki
2016-11-24 15:07:37 +01:00
Il faut le révoquer, puis en recréer un :
2017-01-20 11:17:55 +01:00
~~~
# cd /etc/openvpn/ssl
# sh shellpki.sh revoke
# sh shellpki.sh create
~~~
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +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:36:50 +01:00
2017-11-11 19:36:18 +01:00
### Client sous Linux
2017-11-09 21:36:50 +01:00
2017-11-11 19:36:18 +01:00
Pour démarrer le client OpenVPN, il existe un template systemd, pour le démarrer et l'activer au démarrage :
2017-11-09 21:36:50 +01:00
~~~
2017-11-11 19:36:18 +01:00
# systemctl start openvpn@client
# systemctl enable openvpn@client
2017-11-09 21:36:50 +01:00
~~~
2017-11-11 19:36:18 +01:00
### Client sous Windows
2016-11-24 15:07:37 +01:00
2017-11-13 11:42:02 +01:00
On peut télécharger un client 32 bits ou 64 bits sur < https: / / openvpn . net / index . php / open-source / downloads . html > .
2017-11-09 21:47:13 +01:00
2017-11-11 19:36:18 +01:00
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` .
2017-05-19 09:54:11 +02:00
2017-11-11 19:36:18 +01:00
Attention, il faut exécuter OpenVPN en tant qu'administrateur, cela peut se faire via un clic droit : `Exécuter en tant qu'administrateur` .
2017-05-19 09:54:11 +02:00
2017-11-11 19:36:18 +01:00
OpenVPN est alors disponible dans la barre des tâches.
Pour lancer une session, effectuez un clic-droit et sélectionnez `Connecter` .
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
### Client 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 :
2017-01-20 11:17:55 +01:00
2017-11-11 13:41:45 +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` ;
2017-11-13 11:38:00 +01:00
* on édite le fichier `config.ovpn` en ajustant les options `remote` , `ca` , `cert` et `key` ;
2017-11-11 13:41:45 +01:00
* on copie également la clé et les certificats (ca et cart) dans ce dossier ;
* on doit ensuite renommer ce dossier avec un nom se terminant par `.tblk` ;
2017-11-13 11:38:00 +01:00
* on « double-clic » ensuite dessus, et cela installe configuration ;
2017-11-11 13:41:45 +01:00
* on peut ensuite lancer le VPN via l'icone présente, puis choisir diverses options (connexion automatique, etc.).
2016-11-24 15:07:37 +01:00
2017-11-11 19:36:18 +01:00
### Client sous Android
2016-11-24 15:07:37 +01:00
2017-11-13 11:38:00 +01:00
On utilise l'application libre « OpenVPN for Android » disponible sur
2017-11-09 21:57:34 +01:00
[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
2017-11-13 11:38:00 +01:00
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 :
2017-01-20 11:17:55 +01:00
2017-11-13 11:49:25 +01:00
* le certificat CA peut être importé sous format PEM ;
2016-11-24 15:07:37 +01:00
* 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-01-20 11:17:55 +01:00
~~~
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
2017-01-20 11:17:55 +01:00
~~~
2016-11-24 15:07:37 +01:00
2017-11-13 11:49:25 +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).
2016-11-24 15:07:37 +01:00
2017-11-11 13:41:45 +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-11 19:36:18 +01:00
### Client sous Apple iOS
2017-11-11 13:41:45 +01:00
2017-11-13 11:38:00 +01:00
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.
2017-11-11 13:41:45 +01:00
2017-11-11 19:36:18 +01:00
Pour ajouter une configuration cliente, il suffit d'ouvrir le fichier `.ovpn` . Il est possible d'avoir plusieurs configurations disponibles.
2017-11-11 13:41:45 +01:00
2017-11-13 11:38:00 +01:00
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'icônes tout en haut de l'écran.
2017-11-11 13:41:45 +01:00
2017-11-11 19:36:18 +01:00
2017-11-09 21:47:13 +01:00
## Erreurs fréquentes
2017-11-13 11:38:00 +01:00
### Erreur « --crl-verify fails » (serveur OpenVPN – OpenBSD)
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +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 ) :
2017-01-20 11:17:55 +01:00
~~~
# cd /tmp
# shellpki.sh crl
# cp crl.pem /var/empty
~~~
2016-11-24 15:07:37 +01:00
2017-11-13 11:38:00 +01:00
### Erreur « createipforwardentry » (client OpenVPN – Windows)
2016-11-24 15:07:37 +01:00
2017-01-20 11:17:55 +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.
2017-11-11 13:41:45 +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 > .
2016-11-24 15:07:37 +01:00
2017-11-13 11:38:00 +01:00
### Erreur « no more TUN/TAP adapter » (client OpenVPN – Windows)
2016-11-24 15:07:37 +01:00
2017-11-13 11:51:42 +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-11-13 11:38:00 +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.
2017-11-13 11:38:00 +01:00
Il faut donc ajuster la directive « cipher » sur le client.
2016-11-24 15:07:37 +01:00
2017-11-13 11:38:00 +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.
2017-11-11 19:36:18 +01:00
## 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
~~~
2018-03-27 23:20:04 +02:00
### comp-lzo ou compress ?
< https: / / community . openvpn . net / openvpn / wiki / DeprecatedOptions # a--comp-lzo >
2018-09-18 15:36:04 +02:00
À partir d'OpenVPN 2.4, _comp-lzo_ est déprécié et doit être remplacé par l'option _compress_ pour activer la compression (tant au niveau serveur que client).
Ne préciser que _compress_ n'active cependant aucun algorithme de compression. Il faut préciser l'algorithme, soit _lz4_ , soit _lzo_ . _compress lz4_ est plus performant, mais _compress lzo_ est rétro-compatible avec l'option _comp-lzo_ et est donc préférable dans le cas où des clients ont une version inférieure à 2.4.