Il suffit donc d'installer le paquet openvpn
et les dépendances manquantes viendront avec. L'installation, en plus du code et de la documentation dans /usr/share/doc/openvpn
(Le README.Debian n'est pas une lecture inutile) produit un répertoire /etc/openvpn
vide et un fichier /etc/default/openvpn
auquel il faudra jeter un coup d'œil. De plus, un script d'init /etc/init.d/openvpn
permettra le démarrage et l'arrêt automatique du tunnel. Enfin, des scripts de gestion du réseau permettront de démarrer ou d'arrêter les tunnels suivant l'état des interfaces physiques associées.
Voici la liste complète des fichiers installés par le paquet :
:~# dpkg -L openvpn /. /etc /etc/openvpn /etc/network /etc/network/if-up.d /etc/network/if-up.d/openvpn /etc/network/if-down.d /etc/network/if-down.d/openvpn /etc/default /etc/default/openvpn /etc/init.d /etc/init.d/openvpn /usr /usr/sbin /usr/sbin/openvpn /usr/share /usr/share/man /usr/share/man/man8 /usr/share/man/man8/openvpn.8.gz /usr/share/doc /usr/share/doc/openvpn /usr/share/doc/openvpn/README.auth-pam /usr/share/doc/openvpn/README.down-root /usr/share/doc/openvpn/AUTHORS /usr/share/doc/openvpn/PORTS /usr/share/doc/openvpn/README /usr/share/doc/openvpn/README.Debian /usr/share/doc/openvpn/copyright /usr/share/doc/openvpn/examples /usr/share/doc/openvpn/examples/sample-config-files /usr/share/doc/openvpn/examples/sample-config-files/openvpn-startup.sh /usr/share/doc/openvpn/examples/sample-config-files/firewall.sh /usr/share/doc/openvpn/examples/sample-config-files/loopback-client /usr/share/doc/openvpn/examples/sample-config-files/README /usr/share/doc/openvpn/examples/sample-config-files/xinetd-server-config /usr/share/doc/openvpn/examples/sample-config-files/loopback-server /usr/share/doc/openvpn/examples/sample-config-files/office.up /usr/share/doc/openvpn/examples/sample-config-files/xinetd-client-config /usr/share/doc/openvpn/examples/sample-config-files/home.up /usr/share/doc/openvpn/examples/sample-config-files/openvpn-shutdown.sh /usr/share/doc/openvpn/examples/sample-config-files/static-home.conf /usr/share/doc/openvpn/examples/sample-config-files/tls-home.conf /usr/share/doc/openvpn/examples/sample-config-files/tls-office.conf /usr/share/doc/openvpn/examples/sample-config-files/client.conf /usr/share/doc/openvpn/examples/sample-config-files/static-office.conf /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /usr/share/doc/openvpn/examples/sample-keys /usr/share/doc/openvpn/examples/sample-keys/README /usr/share/doc/openvpn/examples/sample-keys/dh1024.pem /usr/share/doc/openvpn/examples/sample-keys/pass.crt /usr/share/doc/openvpn/examples/sample-keys/pass.key /usr/share/doc/openvpn/examples/sample-keys/tmp-ca.crt /usr/share/doc/openvpn/examples/sample-keys/tmp-ca.key /usr/share/doc/openvpn/examples/sample-keys/server.crt /usr/share/doc/openvpn/examples/sample-keys/server.key /usr/share/doc/openvpn/examples/sample-keys/client.crt /usr/share/doc/openvpn/examples/sample-keys/client.key /usr/share/doc/openvpn/examples/sample-keys/pkcs12.p12 /usr/share/doc/openvpn/examples/easy-rsa /usr/share/doc/openvpn/examples/easy-rsa/2.0 /usr/share/doc/openvpn/examples/easy-rsa/2.0/vars /usr/share/doc/openvpn/examples/easy-rsa/2.0/list-crl /usr/share/doc/openvpn/examples/easy-rsa/2.0/clean-all /usr/share/doc/openvpn/examples/easy-rsa/2.0/Makefile /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf /usr/share/doc/openvpn/examples/easy-rsa/2.0/sign-req /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-key-pkcs12 /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-key-server /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-key-pass /usr/share/doc/openvpn/examples/easy-rsa/2.0/revoke-full /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-req-pass /usr/share/doc/openvpn/examples/easy-rsa/2.0/inherit-inter /usr/share/doc/openvpn/examples/easy-rsa/2.0/whichopensslcnf /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-key /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-req /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-ca /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-dh /usr/share/doc/openvpn/examples/easy-rsa/2.0/build-inter /usr/share/doc/openvpn/examples/easy-rsa/2.0/pkitool /usr/share/doc/openvpn/examples/easy-rsa/2.0/README.gz /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl-0.9.6.cnf.gz /usr/share/doc/openvpn/examples/easy-rsa/vars /usr/share/doc/openvpn/examples/easy-rsa/list-crl /usr/share/doc/openvpn/examples/easy-rsa/clean-all /usr/share/doc/openvpn/examples/easy-rsa/openssl.cnf /usr/share/doc/openvpn/examples/easy-rsa/sign-req /usr/share/doc/openvpn/examples/easy-rsa/build-key-pkcs12 /usr/share/doc/openvpn/examples/easy-rsa/build-key-server /usr/share/doc/openvpn/examples/easy-rsa/build-key-pass /usr/share/doc/openvpn/examples/easy-rsa/revoke-full /usr/share/doc/openvpn/examples/easy-rsa/.externals /usr/share/doc/openvpn/examples/easy-rsa/make-crl /usr/share/doc/openvpn/examples/easy-rsa/build-req-pass /usr/share/doc/openvpn/examples/easy-rsa/build-key /usr/share/doc/openvpn/examples/easy-rsa/build-req /usr/share/doc/openvpn/examples/easy-rsa/build-ca /usr/share/doc/openvpn/examples/easy-rsa/build-dh /usr/share/doc/openvpn/examples/easy-rsa/build-inter /usr/share/doc/openvpn/examples/easy-rsa/revoke-crt /usr/share/doc/openvpn/examples/easy-rsa/README.gz /usr/share/doc/openvpn/changelog.Debian.gz /usr/share/doc/openvpn/changelog.gz /usr/share/openvpn /usr/share/openvpn/verify-cn /usr/lib /usr/lib/openvpn /usr/lib/openvpn/openvpn-auth-pam.so /usr/lib/openvpn/openvpn-down-root.so /usr/include /usr/include/openvpn /usr/include/openvpn/openvpn-plugin.h
Il suffira de placer dans le répertoire /etc/openvpn/
autant de fichiers de configuration que l'on souhaitera démarrer de tunnels différents. Ces fichiers de configuration devront contenir les paramètres que nous avons jusqu'ici indiqué en ligne de commande.
Nous allons donc créer pour chaque extrémité de tunnel un fichier de configuration qui aboutira au même mode de fonctionnement que celui que nous avons vu en page précédente.
(Le serveur)
Nous avions la ligne de commande :
openvpn --port 8147 --dev tun1 --ifconfig 192.168.25.1 192.168.25.2 --comp-lzo --verb 5 --tls-server --dh dh1024.pem --ca bts.eme-cacert.pem --cert aaron.bts.eme.pem --key aaron.bts.eme-key.pem --reneg-sec 21600
Ceci va nous donner, avec quelques modifications nécessaires :
port 8147
dev tun1
ifconfig 192.168.25.1 192.168.25.2
comp-lzo
verb 5
tls-server
dh /root/dh1024.pem
ca /root/bts.eme-cacert.pem
cert /root/aaron.bts.eme.pem
key /root/aaron.bts.eme-key.pem
reneg-sec 21600
Il sera sans doute intéressant de compléter quelque peu ce fichier, et probablement de déplacer les clés, certificats et autres ustenciles de sécurité ailleurs, avant de démarrer le tunnel.
(Le client)
Nous avions :
openvpn --remote 82.127.57.95 --port 8147 --dev tun1 --ifconfig 192.168.25.2 192.168.25.1 --comp-lzo --verb 5 --tls-client --ca bts.eme-cacert.pem --cert cyclope.maison.mrs.pem --key cyclope.maison.mrs-key.pem
Ce qui nous donne :
remote 82.127.57.95 port 8147 dev tun1 ifconfig 192.168.25.2 192.168.25.1 comp-lzo verb 5 tls-client ca /root/bts.eme-cacert.pem cert /root/cyclope.maison.mrs.pem key /root/cyclope.maison.mrs-key.pem
Mêmes remarques.
Voyons un peu, avant de mettre en production, s'il est possible de prendre quelques mesures susceptibles de rendre notre tunnel plus solide, en termes de sécurité.
Dans la configuration actuelle, openvpn va écouter sur toutes les interfaces de l'hôte. Ce n'est ni nécessaire ni même souhaitable, suivant la configuration de notre hôte. Le paramètre :
local <adresse_ip>
permettra de n'écouter que sur l'adresse spécifiée. Pratique uniquement en cas d'adresse IP fixe bien entendu.
OpenVPN, dans ses versions 2.0 et supérieures, sait faire des tunnels multipoints. Si ce n'est pas ce que nous souhaitons, autant le spécifier, même si la documentation dit que le mode par défaut est le mode point à point :
mode p2p
Notre tunnel a pour vocation d'être placé entre deux routeurs, afin d'interconnecter deux réseaux privés distants. Nos routeurs (serveur comme client) ont besoin de connaitre la route vers le réseau distant à atteindre.
Supposons que aaron
soit dans le réseau IP 192.168.1.0/24 et que cyclope
soit dans 192.168.2.0/24, nous n'aurons pour aaron
qu'à rajouter dans la configuration la ligne suivante :
route 192.168.2.0 255.255.255.0 192.168.25.2
Et pour cyclope
:
route 192.168.1.0 255.255.255.0 192.168.25.1
Par défaut, OpenVPN va démarrer sous l'identité root
, puis le service restera sous cette identité. Ce n'est sans doute pas une bonne idée et mieux vaudra choisir un utilisateur sans privilèges.
Les paramètres :
user nobody group nogroup
Arrangeront ça. Mais attention ! Sitôt le tunnel négocié (par root
), openvpn va passer en mode « daemon » sans aucun privilèges. En cas de rupture du tunnel, il y aura des problèmes, les clés n'étant lisibles que par root
. De même pour la manipulation de tun
. Il est donc conseillé d'ajouter les paramètres :
persistent-key persistent-tun
de manière à ce que nobody
ne soit pas amené à faire des choses qu'il n'a pas le droit de faire.
La directive tls-auth
ajoute une authentification de type HMAC 1) au dessus du canal TLS « to protect against DoS attacks », dit la documentation.
Nous utilisons une clé partagée, comme celle que nous avons réalisée plus tôt dans ce chapitre, et que nous avions appelée poétiquement shared.key
.
Cette mesure présente quelques avantages, surtout s'il n'est pas possible de spécifier les adresses IP de chaque bout (les vraies, pas celles qui sont dans le tunnel). Nous avons vu que le client doit connaitre l'adresse IP du serveur, mais dans notre configuration le serveur ne connait pas celle du client et peut difficilement la connaitre si le client dispose d'une adresse IP dynamique, ce qui est souvent le cas.
La documentation dit :
The tls-auth directive adds an additional HMAC signature to all SSL/TLS handshake packets for integrity verification. Any UDP packet not bearing the correct HMAC signature can be dropped without further processing. The tls-auth HMAC signature provides an additional level of security above and beyond that provided by SSL/TLS. It can protect against:
Ca fait envie…
La méthode d'utilisation est assez simple :
tls-auth <chemin_vers_shared.key> 0
tls-auth <chemin_vers_shared.key> 1
Dans un cas simple d'un seul tunnel par hôte, nous n'avons rien à modifier dans /etc/default/openvpn
. Nous avons juste à créer un fichier de configuration pour chacune des extrémités, que nous appellerons par exemple vpn.conf
et à le mettre dans /etc/openvpn
.
Nous allons créer un répertoire pour y ranger tous les ustensiles de sécurité (certificats, clés…), par exemple /etc/openvpncerts
, y placer pour chaque extrémité :
root
;root
elle aussi.Enfin, la version finale des fichiers de configuration :
mode p2p port 8147 dev tun1 user nobody group nogroup persist-key persist-tun ifconfig 192.168.25.1 192.168.25.2 tls-server dh /etc/openvpncerts/dh1024.pem ca /etc/openvpncerts/bts.eme-cacert.pem cert /etc/openvpncerts/aaron.bts.eme.pem key /etc/openvpncerts/aaron.bts.eme-key.pem tls-auth /etc/openvpncerts/shared.key 0 reneg-sec 900 comp-lzo verb 1 route 192.168.0.0 255.255.255.0 192.168.25.2
mode p2p remote 82.127.57.95 port 8147 dev tun1 user nobody group nogroup persist-key persist-tun ifconfig 192.168.25.2 192.168.25.1 tls-client ca /etc/openvpncerts/bts.eme-cacert.pem cert /etc/openvpncerts/cyclope.maison.mrs.pem key /etc/openvpncerts/cyclope.maison.mrs-key.pem tls-auth /etc/openvpncerts/shared.key 1 reneg-sec 900 comp-lzo verb 1 route 192.168.10.0 255.255.255.0 192.168.25.1
Cette configuration devrait donner satisfaction dans bien des cas.
Nous sommes très loin d'avoir vu tout ce qu'il est possible de faire avec OpenVPN. Sa documentation n'est pas toujours très claire, mais elle vous en apprendra sans doute encore beaucoup plus sur ses possibilités.
La solution vue ici permettra de relier simplement deux réseaux IP privés distants à travers l'internet, avec un niveau de sécurité convenable.