Openvpn est un service vpn trés sûr, super stable, et d’enveloppe légère (la qualité enfonce largement PPTP), relativement simple à mettre en place, même si j’ai galéré à comprendre sa simplicité, et bourré de fonctionnalités utiles (cf la doc sur openvpn.org )…
Indépendamment des cas évidents ou l’on a besoin de connecter de manière sûre des sites distant, c’est un bon outil pour faire transiter des données jusqu’à une passerelle et travailler en wifi, le tout avec un bon niveau de sécurité.
Par ailleurs la version windows fonctionne aussi bien et se configure à peu prés de la même manière (et oui, on a parfois des clients windows à gèrer aussi, il faut s’en souvenir).
Phase 1 : prérequis, pré-installation des paquets nécessaires
Attention
En fin d’install, il y a des modifications à vérifier :
- Créer un user/group
openvpnavant de lancer le script. - Penser à changer l’interface d’écoute
eth0enbr0dans par exemple les fichiers de routage, de configuration diverses de serveurs (Squid, Samba, etc) ET surtout dans/etc/default/dhcp
openvpn plante parfois avec un noyau 2.4, il vaut mieux utiliser un 2.6.
Par ailleurs, quoi que je ne l’ai pas testé pour des raisons diverses, il est conseillé d’utiliser un noyau sur lequel est appliqué le patch grsecurity, trouvable sur grsecurity.net/ .
Votre noyau doit comporter les options actives suivantes :
Installations
Sur le serveur debian :
apt-get install bridge-utils openvpn openssl libssl-dev liblzo1 liblzo-dev
Sur le client debian :
apt-get install openvpn liblzo1
Tous ces paquets peuvent être pris en source et recompilés plus finement bien sûr dans le cas d’un serveur d’accès dédié.
Phase 2 : mise en œuvre de la PKI
Pour l’authentification, nous allons mettre en œuvre une PKI ( “Public Key Infrastructure”=Infrastructure de clé publique ), et identifier un à un les clients du serveur d’accès, en utilisant le jeu de scripts easy-rsa fourni par le paquet openvpn
Préparation
Commencez par recopier, dans un coin sûr, le répertoire
/usr/share/doc/openvpn/examples/easy-rsa
$ cp -R /usr/share/doc/openvpn/examples/easy-rsa/ .
Passez en root, et sécurisez le répertoire:
# chown -R root.root easy-rsa
# chmod -R 0700 easy-rsa
Descendez dans le répertoire.
La première étape consiste à modifier les variables communes à la génération des différentes clés.
Ces variables sont à ajuster dans le fichier vars
Voici un exemple:
À partir de maintenant, chaque fois que vous reviendrez générer des clés ou faire une opération de clé,
pensez à “sourcer” ce fichier avant pour mettre à jour votre environnement :
# . ./vars
Ensuite :
# mkdir keys
# touch keys/index.txt
# echo 01 > keys/serial
# chmod -R 0700 keys
Préparation des clés du serveur :
# ./build-dh
# ./build-ca
# ./build-key-server serveur
(ndr : à étoffer)
Et d’un client :
./build-key client
(ndr: à etoffer)
A l’issue de ces manœuvres on se retrouve avec les fichiers suivants dans keys :
-rwx------ 1 root root 0 2008-09-18 18:58 index.txt.old
-rwx------ 1 root root 3 2008-09-18 18:59 serial.old
-rw-r--r-- 1 root root 245 2008-09-18 19:00 dh1024.pem
-rw------- 1 root root 887 2008-09-18 19:01 ca.key
-rw-r--r-- 1 root root 1224 2008-09-18 19:01 ca.crt
-rw------- 1 root root 887 2008-09-18 19:01 serveur.key
-rw-r--r-- 1 root root 680 2008-09-18 19:01 serveur.csr
-rw-r--r-- 1 root root 3647 2008-09-18 19:01 serveur.crt
-rw-r--r-- 1 root root 3 2008-09-18 19:01 serial
-rw-r--r-- 1 root root 21 2008-09-18 19:01 index.txt.attr
-rw-r--r-- 1 root root 105 2008-09-18 19:01 index.txt
-rw-r--r-- 1 root root 3647 2008-09-18 19:01 01.pem
-rw-r--r-- 1 root root 887 2008-09-18 19:03 client.key
-rw-r--r-- 1 root root 688 2008-09-18 19:03 client.csr
-rw-r--r-- 1 root root 0 2008-09-18 19:03 client.crt
Les fichiers .key sont les clefs privés du serveur, du client et du serveur d’authentification (ca.key).
Les fichiers .crt sont les certificats correspondants.
dh1024.pem est un paramètre Diffie Hellman [à expliquer, m’a l’air curieux ce truc]
permettant apparemment de sécuriser les transferts contre une attaque man-in-the-middle
Pour notre utilisation, il faut en fait mettre ces fichiers dans le répertoire /etc/openvpn
# cp ./keys/ca.crt /etc/openvpn/
# cp ./keys/ca.key /etc/openvpn/
# cp ./keys/serveur.crt /etc/openvpn/
# cp ./keys/serveur.key /etc/openvpn/
# cp ./keys/dh1024.pem /etc/openvpn/
Notes:
- N’oubliez pas d’utiliser des
CN(Common Name) unique pour chaque participant duVPN(serveur, et chaque client), sinon votre serveur ne fonctionnera pas !
Mettez aussi unON(Organization Name) commun au serveur et aux clients. - N’utilisez pas de
fqdnpour désigner votre serveur et vos clients,
openvpnn’aime pas les clés avec un nom de fichier long avec une arobase dedans.
Je n’ai pas réussi à savoir pourquoi, mais certains nomsfqdnpassent, d’autres non. - Ne transférez pas vos clés par un canal non sécurisé.
L’idéal est de stocker le répertoirekeyssur une clé usb et rien sur la machine,
mais on peut aussi utiliser le useropenvpnpour les transférer enscp(puisque le userrootdoit si vous êtes raisonnable être désactivé pourssh). - Une précaution supplémentaire est d’utiliser une solution
TLSet de générer une clé supplémentaire pour éviter les interceptions de clé (attaque “Man in the Middle”).
Vous pourrez trouver un exemple de config ici : nbs-system.com/article/openvpn2_howto.
Pour les paranos, ce tuto effectue unchrootdu serveur en plus de la démarche que je décris ici, et il est en français.
Ça y est, vous pouvez annoncer à tout le monde que vous avez votre propre PKI (la frime) 
Configuration du serveur
Comme je l’ai indiqué dans le titre, ce tuto propose une configuration en mode pont ("Bridged"), en opposition au mode routé ("Routed").
Ponté ou non, openvpn utilise un mécanisme appelé Tun/Tap, qui est une sorte de “câble virtuel” entre le client et le serveur, et qui se traduit des deux cotés par l’ajout d’une interface (tunX en routé, tapX en ponté).
Le mode routé est facilement compréhensible, à savoir qu’il faut configurer, une fois le “câble” branché, les tables éventuelles de routage sur le client et le serveur qu’on considère alors comme des routeurs.
Cette configuration est plutôt simple, mais nécessite d’utiliser un réseau “à part” pour l’interface d’entrée du serveur et les clients, augmente d’un hop la distance entre les deux lan connectés, et ne permet pas de transférer d’autres protocoles que ceux qu’iptables sait router (pas d’ipx, ni de - beurk - netbios, par exemple).
Pour info, il suffit d’installer la config serveur openvpn d’exemple, de modifier un peu les valeurs, et de configurer un peu de routage.
Config sur le serveur (dans /etc/openvpn/server.conf, par exemple)
port 5555
proto udp
dev tap0
ca ca.crt
cert serveur.crt
key serveur.key
dh dh1024.pem
ifconfig-pool-persist ipp.txt
server-bridge 192.168.0.1 255.255.255.0 192.168.0.151 192.168.0.250
keepalive 10 120
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
status openvpn-status.log
verb 1
Démarrage d’openvpn
À l’installation, openvpn est configuré pour démarrer avec la machine.
Pour le mode ponté, cela n’est pas souhaitable, car cela pose des problèmes si le pont n’est pas bien configuré à ce moment-là.
Pour désactiver le service :
update-rc.d -f openvpn remove
Plutôt que d’utiliser un script pour lever le bridge comme beaucoup de tutos non spécifiques debian font,
nous allons utiliser les scripts de levées d’interface dans /etc/network/interfaces
C’est le bridge qui va désormais hériter des caractéristiquesd de la carte vers le lan.
Considèrons dans notre exemple que la carte (la seule dans notre exemple) vers le lan est eth0 configurée en static 192.168.0.1/24.
On aura alors:
/etc/network/interfaces
auto lo br0
iface lo inet loopback
iface br0 inet static
address 192.168.0.1
netmask 255.255.255.0
broadcast 192.168.0.255
bridge-ports eth0
post-up /etc/openvpn/scripts/ovup && /etc/init.d/openvpn start
pre-down /etc/init.d/openvpn stop
post-down /etc/openvpn/scripts/ovdown
/etc/openvpn/scripts/ovup
#!/bin/sh
openvpn --mktun --dev tap0
brctl addif br0 tap0
ifconfig eth0 promisc up
ifconfig tap0 promisc up
ifconfig br0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255
/etc/openvpn/scripts/ovdown
#!/bin/sh
openvpn --rmtun --dev tap0
Config sur le client :
Sur le client, un fichier de config suffit :
/etc/openvpn/client.conf
client
dev tap0
proto udp
remote adresse.du.serveur 5555
resolv-retry infinite
nobind
user openvpn
group openvpn
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 1
Conclusion
N’hésitez pas à regarder les fichier d’exemple de configuration dans
/usr/share/doc/openvpn/examples
Je ne peux que vous renvoyer à nbs-system.com/article/openvpn2_howto qui s’est encore affiné depuis le début de la redaction de ce post.




