409 lines
12 KiB
Markdown
409 lines
12 KiB
Markdown
---
|
||
categories: vpn sysadmin security
|
||
title: Howto OpenVPN
|
||
...
|
||
|
||
* Documentation : <https://openvpn.net/index.php/open-source/documentation.html>
|
||
|
||
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)
|
||
|
||
## 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
|
||
|
||
Nov 03 20:37:21 evolix-www01 systemd[1]: Starting OpenVPN service...
|
||
Nov 03 20:37:21 evolix-www01 systemd[1]: Started OpenVPN service.
|
||
~~~
|
||
|
||
### OpenBSD
|
||
|
||
~~~
|
||
# pkg_add openvpn
|
||
$ openvpn --version
|
||
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
|
||
~~~
|
||
|
||
## Configuration
|
||
|
||
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
|
||
|
||
La configuration se fera via un fichier `/etc/openvpn/server.conf` :
|
||
|
||
### Serveur, sous OpenBSD
|
||
|
||
~~~
|
||
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
|
||
~~~
|
||
|
||
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` :
|
||
|
||
~~~
|
||
/var/log/openvpn.log 600 52 * $W6D4 Z
|
||
~~~
|
||
|
||
### Serveur, sous Debian
|
||
|
||
~~~
|
||
#
|
||
# 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
|
||
~~~
|
||
|
||
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
|
||
|
||
~~~
|
||
# apt install libnet-telnet-perl
|
||
~~~
|
||
|
||
### 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>
|
||
~~~
|
||
|
||
## PKI avec shellPKI (OpenBSD et Debian)
|
||
|
||
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
|
||
|
||
~~~
|
||
# 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 un certificat
|
||
|
||
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/
|
||
~~~
|
||
|
||
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.
|
||
|
||
## Howto configuration du client
|
||
|
||
### Template systemd pour démarrer le client OpenVPN
|
||
|
||
Pour démarrer le client OpenVPN, il existe un template systemd, pour le démarrer et l'activer au démarrage :
|
||
|
||
~~~
|
||
# systemctl start openvpn@client
|
||
# systemctl enable openvpn@client
|
||
~~~
|
||
|
||
### Client OpenVPN sous Mac OS X
|
||
|
||
Télécharger la dernière version stable de Tunnelblick sur <https://tunnelblick.net/downloads.html>
|
||
|
||
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 la clé et les certificats (ca et cart) 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/packages/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.example.com.crt -inkey goyk3OkjeuPread8Sluld.privacy.example.com.key -out goyk3OkjeuPread8Sluld.privacy.example.com.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)
|
||
|
||
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 :
|
||
|
||
~~~
|
||
tls-cipher "DEFAULT:@SECLEVEL=0"
|
||
~~~
|
||
|
||
## Erreurs fréquentes
|
||
|
||
### Erreur "--crl-verify fails" (serveur OpenVPN – 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 "createipforwardentry" (client OpenVPN – 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" (client OpenVPN – Windows)
|
||
|
||
En cas d'erreur `no more TUN/TAP adapter` aller dans _menu démarrer_> _OpenVPN_> _Add new TUN/TAP Adapter_
|
||
|
||
### Erreur "cipher final failed" (client OpenVPN – Android)
|
||
|
||
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.
|
||
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.
|