OpenVPN
Si vous voulez plus que de simples clés pré-partagées OpenVPN rend la configuration facile et emploie une clé publique d'infrastructure (PKI) pour utiliser des certificats SSL/TLS à des fins d'authentification et un échange de clés entre le serveur VPN et les clients. OpenVPN peut être utilisé en mode VPN route ou passerelle et il peut être configuré pour utiliser UDP ou TCP. Le numéro de port peut être également configuré, mais le port 1194 est l'officiel. Et il utilise seulement ce port pour toutes les communications. Les implémentations du client VPN sont disponibles pour presque toutes les distributions Linux, OS X, Windows et les routeurs WLAN basés sur OpenWRT.
Installation du serveur
Pour installer openvpn, exécutez la commande suivante dans un terminal :
sudo apt-get install openvpn easy-rsa
Configuration d'une infrastructure à clés publiques
La première étape dans la construction d'une configuration OpenVPN est d'établir une infrastructure PKI (infrastructure à clé publique). L'ICP est composée de :
un certificat distinct (également connu sous le nom de clé publique) et la clé privée pour le serveur et chaque client et
le certificat de l’autorité de certification maître (AC) et la clé qui est utilisée pour identifier les certificats serveurs et clients.
OpenVPN supporte l'authentification bidirectionnelle basée sur les certificats, ce qui signifie que le client doit authentifier le certificat du serveur et le serveur doit authentifier le certificat client avant que la confiance mutuelle soit établie.
Tant le serveur que le client authentifieront l'autre en commençant par vérifier que le certificat présenté a été signé par l'autorité de certification maître (CA), et ensuite en testant les informations dans l'en-tête du certificat maintenant authentifié, comme le nom commun du certificat ou le type de certificat (client ou serveur).
Configuration de l'autorité de certification
Pour configurer votre propre autorité de certification (CA) et générer des certificats et des clés pour un serveur OpenVPN et clients multiples, copiez d'abord le répertoire easy-rsa dans /etc/openvpn. Cela vous permettra de vous assurer que toutes les modifications apportées aux scripts ne seront pas perdues lorsque le paquet sera mis à jour. Depuis une console mettez vous en superutilisateur et :
mkdir /etc/openvpn/easy-rsa/ cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
Ensuite, modifiez /etc/openvpn/easy-rsa/vars en ajustant les valeurs pour votre environnement :
export KEY_COUNTRY="US" export KEY_PROVINCE="NC" export KEY_CITY="Winston-Salem" export KEY_ORG="Example Company" export KEY_EMAIL="steve@example.com" export KEY_CN=MyVPN export KEY_NAME=MyVPN export KEY_OU=MyVPN
Saisissez ce qui suit pour générer le certificat maître Certificate Authority (CA) et une clé :
cd /etc/openvpn/easy-rsa/ source vars ./clean-all ./build-ca
Certificats du serveur
Ensuite, nous allons générer un certificat et une clé privée pour le serveur:
./build-key-server myservername
Comme dans l'étape précédente, la majorité des paramètres peuvent être définies par défaut. Deux autres requêtes nécessitent des réponses positives, "Sign the certificate? [y/n]" et "1 out of 1 certificate requests certified, commit? [y/n]".
Des paramètres Diffie Hellman doivent être générés pour le serveur OpenVPN :
./build-dh
Tous les certificats et les clés ont été générés dans le sous-répertoire keys/. La pratique courante est de les copier dans /etc/openvpn/ :
cd keys/ cp myservername.crt myservername.key ca.crt dh2048.pem /etc/openvpn/
Certificats du client
Le client VPN a également besoin d'un certificat pour s'authentifier auprès du serveur. Habituellement, vous créez un certificat différent pour chaque client. Pour créer le certificat, tapez ce qui suit dans un terminal avec les droits super-utilisateur :
cd /etc/openvpn/easy-rsa/ source vars ./build-key client1
Copiez les fichiers suivants sur le client à l'aide d'une méthode sécurisée:
/etc/openvpn/ca.crt
/etc/openvpn/easy-rsa/keys/client1.crt
/etc/openvpn/easy-rsa/keys/client1.key
Comme les certificats clients et les clés ne sont nécessaires que sur la machine client, vous devez les supprimer du serveur.
Configuration d'un serveur simple
Avec votre installation de OpenVPN, vous avez obtenu ces exemples de fichiers de configuration (et beaucoup plus si vous vérifiez) :
root@server:/# ls -l /usr/share/doc/openvpn/examples/sample-config-files/ total 68 -rw-r--r-- 1 root root 3427 2011-07-04 15:09 client.conf -rw-r--r-- 1 root root 4141 2011-07-04 15:09 server.conf.gz
Commencez par copier et décompresser server.conf.gz vers /etc/openvpn/server.conf.
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ sudo gzip -d /etc/openvpn/server.conf.gz
Modifiez le fichier /etc/openvpn/server.conf pour vous assurer que les lignes suivantes pointent vers les certificats et les clés que vous avez créés dans la section ci-dessus.
ca ca.crt cert myservername.crt key myservername.key dh dh2048.pem
C'est le minimum que vous devez configurer pour un serveur OpenVPN fonctionnel. Vous pouvez utiliser tous les paramètres par défaut dans l'échantillon du fichier server.conf. Maintenant, lancez le serveur. Vous trouverez la journalisation et les messages d'erreur dans votre journal système (syslog).
root@server:/etc/openvpn# service openvpn start * Starting virtual private network daemon(s)... * Autostarting VPN 'server' [ OK ]
Maintenant, vérifiez si OpenVPN a créé une interface tun0:
root@server:/etc/openvpn# ifconfig tun0 tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 [...]
Configuration du client simple
Il existe différentes variantes de clients OpenVPNavec ou sans interface graphique. Vous trouverez plus de détails dans une prochaine section. Pour le moment, nous utilisons le client OpenVPN pour Ubuntu, qui est le même exécutable que le serveur. Vous devez donc également installer le paquet openvpn sur la machine client :
sudo apt-get install openvpn
Cette fois, copiez le fichier de configuration d'exemple client.conf dans /etc/openvpn/.
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
Copiez les clés du client et le certificat de l'autorité de certification (AC) que vous avez créés dans la section ci-dessus dans, par exemple, /etc/openvpn/ et modifiez /etc/openvpn/client.conf pour vous assurer que les lignes suivantes pointent bien vers ces fichiers. Si vos fichiers se trouvent dans /etc/openvpn/ vous pouvez omettre le chemin.
ca ca.crt cert client1.crt key client1.key
Et vous devez au moins préciser le nom ou l'adresse du serveur OpenVPN. Assurez-vous que le mot-clé client est dans la configuration. C'est ce qui permet le mode client.
client remote vpnserver.example.com 1194
De plus, assurez-vous de bien spécifier les noms des fichiers des clés copiés depuis le serveur
ca ca.crt cert client1.crt key client1.key
Maintenant, lancez le client OpenVPN:
root@client:/etc/openvpn# service openvpn start * Starting virtual private network daemon(s)... * Autostarting VPN 'client' [ OK ]
Vérifiez si cela a créé une interface tun0:
root@client:/etc/openvpn# ifconfig tun0 tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.6 P-t-P:10.8.0.5 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
Vérifiez si vous pouvez faire un ping sur le serveur OpenVPN:
root@client:/etc/openvpn# ping 10.8.0.1 PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data. 64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=0.920 ms
Le serveur OpenVPN utilise toujours la première adresse IP utilisable dans le réseau du client et seulement cette adresse est pingable. Par exemple, si vous avez configuré un /24 pour le masque réseau du client, l'adresse .1 sera utilisée. L'adresse P-t-P que vous voyez dans la sortie ifconfig ci-dessous ne répond généralement pas aux requêtes de ping.
Vérifiez vos itinéraires :
root@client:/etc/openvpn# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 10.8.0.5 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 10.8.0.1 10.8.0.5 255.255.255.255 UGH 0 0 0 tun0 192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.42.1 0.0.0.0 UG 0 0 0 eth0
Premier dépannage
Si ce qui précède ne fonctionne pas pour vous, vérifiez ceci:
Vérifiez votre journal système, par exemple grep -i vpn /var/log/syslog
Vérifiez si vous avez correctement spécifié les noms des fichiers des clés dans client.conf et server.conf.
Le client peut-il se connecter au serveur ? Peut-être un pare-feu bloque-t-il l'accès ? Vérifiez le journal système sur le serveur.
Client et serveur doivent utiliser le même protocole et port, par exemple, le port UDP 1194, voir l'option de configuration port et proto
Client et serveur doivent utiliser la même configuration en ce qui concerne la compression, voir l'option comp-lzo config
Le client et le serveur doivent utiliser la même configuration pour ce qui est du mode pontage ou routage, voir les options de configuration serveur ou pont de serveur
Configuration avancée
Configuration de routage VPN avancée sur le serveur
Ce qui précède est un réseau privé virtuel (VPN) fonctionnel très simple. Le client peut accéder à des services sur le serveur VPN via un tunnel crypté. Si vous voulez atteindre plus de serveurs ou quoi que ce soit dans d'autres réseaux, créez certains routages aux clients. Par exemple, si votre réseau d'entreprise peut se résumer au réseau 192.168.0.0/16, vous pouvez appuyer sur cette voie pour les clients. Mais vous devrez également modifier le routage pour le retour - vos serveurs ont besoin de savoir la routage vers le client VPN-réseau.
Ou bien vous pouvez donner une passerelle par défaut à tous les clients pour envoyer d'abord tout leur trafic Internet vers la passerelle VPN, et de là, via le pare-feu d'entreprise vers Internet. Cette section vous montre quelques options possibles.
Forcer les routes du client pour l'autoriser à accéder aux autres sous-réseaux privés derrière le serveur. Souvenez vous que ces sous-réseaux auront également besoin de router le pool d'adresses du client OpenVPN (10.8.0.0/24) jusqu'au serveur OpenVPN.
push "route 10.0.0.0 255.0.0.0"
Si activée, cette directive permettra de configurer tous les clients pour que leur passerelle par défaut emprunte le VPN, entraînant tout le trafic IP comme la navigation web ou la résolution DNS à passer par le VPN (le serveur OpenVPN ou votre pare-feu central peut avoir besoin d'ajouter une règle NAT pour l'interface TUN/TAP afin que cela fonctionne correctement).
push "redirect-gateway def1 bypass-dhcp"
Configure server mode and supply a VPN subnet for OpenVPN to draw client addresses from. The server will take 10.8.0.1 for itself, the rest will be made available to clients. Each client will be able to reach the server on 10.8.0.1. Comment this line out if you are ethernet bridging.
server 10.8.0.0 255.255.255.0
Maintenez un enregistrement d'association des clients aux d'adresses IP virtuelles dans ce fichier. Si OpenVPN tombe en panne ou est redémarré, la reconnexion des clients pourra se faire à la même adresse IP virtuelle du pool d'adresses qui a été précédemment attribué.
ifconfig-pool-persist ipp.txt
Poussez les serveurs DNS au client.
push "dhcp-option DNS 10.0.0.2" push "dhcp-option DNS 10.1.0.2"
Permettez la communication client à client.
client-to-client
Activez la compression sur le lien VPN.
comp-lzo
The keepalive directive causes ping-like messages to be sent back and forth over the link so that each side knows when the other side has gone down. Ping every 1 second, assume that remote peer is down if no ping received during a 3 second time period.
keepalive 1 3
C'est une bonne idée de réduire les privilèges du démon OpenVPN après l'initialisation.
user nobody group nogroup
OpenVPN 2.0 inclut une fonctionnalité qui permet au serveur OpenVPN d'obtenir de manière sécurisée un nom d'utilisateur et un mot de passe d'un client qui tente de se connecter,et d'utiliser ces informations comme base pour l'authentification du client. Pour utiliser cette méthode d'authentification, vous devez d'abord ajouter la directive auth-user-pass à la configuration du client. Cela donnera l'instruction au client OpenVPN de demander à l'utilisateur son identifiant et son mot de passe, pour les transmettre au serveur via le canal TLS sécurisé.
# client config! auth-user-pass
Ceci indique au serveur OpenVPN de valider le nom d'utilisateur/mot de passe saisi par les clients qui utilisent le module de connexion PAM. Utile si vous avez une authentification centralisée avec, par exemple, Kerberos.
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login
Veuillez lire le guide de durcissement de la sécurité OpenVPN pour obtenir des conseils de sécurité supplémentaires.
Configuration avancée de VPN ponté sur le serveur
OpenVPN can be setup for either a routed or a bridged VPN mode. Sometimes this is also referred to as OSI layer-2 versus layer-3 VPN. In a bridged VPN all layer-2 frames - e.g. all ethernet frames - are sent to the VPN partners and in a routed VPN only layer-3 packets are sent to VPN partners. In bridged mode all traffic including traffic which was traditionally LAN-local like local network broadcasts, DHCP requests, ARP requests etc. are sent to VPN partners whereas in routed mode this would be filtered.
Préparez la configuration de l'interface pour le pontage sur le serveur
Assurez-vous que vous avez installé le paquet bridge-utils:
sudo apt-get install bridge-utils
Avant de configurer OpenVPN en mode ponté, il faut changer la configuration de votre interface. Supposons que votre serveur dispose d'une interface eth0 connectée à internet et une interface eth1 connectée au réseau local que vous voulez ponter. Votre /etc/network/interfaces devrait ressembler à ceci :
auto eth0 iface eth0 inet static address 1.2.3.4 netmask 255.255.255.248 default 1.2.3.1 auto eth1 iface eth1 inet static address 10.0.0.4 netmask 255.255.255.0
This straight forward interface config needs to be changed into a bridged mode like where the config of interface eth1 moves to the new br0 interface. Plus we configure that br0 should bridge interface eth1. We also need to make sure that interface eth1 is always in promiscuous mode - this tells the interface to forward all ethernet frames to the IP stack.
auto eth0 iface eth0 inet static address 1.2.3.4 netmask 255.255.255.248 default 1.2.3.1 auto eth1 iface eth1 inet manual up ip link set $IFACE up promisc on auto br0 iface br0 inet static address 10.0.0.4 netmask 255.255.255.0 bridge_ports eth1
À ce stade, vous devez mettre en place la passerelle. Il se peut que cela ne fonctionne pas du premier coup et que vous perdiez la connexion distante. Assurez vous que vous pouvez régler les problèmes en ayant un accès local.
sudo ifdown eth1 && sudo ifup -a
Préparer la configuration du serveur pour le pontage
Modifiez /etc/openvpn/server.conf avec les options suivantes :
;dev tun dev tap up "/etc/openvpn/up.sh br0 eth1" ;server 10.8.0.0 255.255.255.0 server-bridge 10.0.0.4 255.255.255.0 10.0.0.128 10.0.0.254
Ensuite, créez un script d'aide pour ajouter l'interface tap à la passerelle et assurez vous que eth1 est en mode espion. Créez /etc/openvpn/up.sh :
#!/bin/sh BR=$1 ETHDEV=$2 TAPDEV=$3 /sbin/ip link set "$TAPDEV" up /sbin/ip link set "$ETHDEV" promisc on /sbin/brctl addif $BR $TAPDEV
Puis rendez-le exécutable :
sudo chmod 755 /etc/openvpn/up.sh
Après avoir configuré le serveur, redémarrez openvpn en tapant :
sudo service openvpn restart
Configuration du client
Installez d'abord openvpn sur le client :
sudo apt-get install openvpn
Puis, une fois le serveur configuré et les certificats du client copiés dans le répertoire /etc/openvpn/, créez un fichier de configuration client en copiant l'exemple. Dans un terminal sur la machine client, saisissez :
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn
Maintenant, éditez /etc/openvpn/client.conf en modifiant les options suivantes :
dev tap ;dev tun ca ca.crt cert client1.crt key client1.key
Enfin, redémarrez openvpn :
sudo service openvpn restart
Vous devriez maintenant être en mesure de vous connecter au réseau LAN distant via le VPN.
Implémentations logicielles des clients
Interface graphique Linux Network-Manager pour OpenVPN
De nombreuses distributions Linux notamment les variantes de bureau Ubuntu sont livrées avec Network Manager, une interface graphique agréable pour configurer vos paramètres réseau. Il peut également gérer vos connexions VPN. Assurez-vous que le paquet network-manager-openvpn est bien installé. Ici vous pouvez voir que le programme d'installation installe aussi tous les autres paquets nécessaires :
root@client:~# apt-get install network-manager-openvpn Lecture de la liste de paquets… Terminé Construction de l'arbre de dépendances Lecture des informations de l'état… Terminé Les paquets supplémentaires suivants seront installés : liblzo2-2 libpkcs11-helper1 network-manager-openvpn-gnome openvpn Paquets suggérés : resolvconf Les nouveaux paquets suivants seront installés : liblzo2-2 libpkcs11-helper1 network-manager-openvpn network-manager-openvpn-gnome openvpn 0 mis à jour, 5 nouvellement installés, 0 à supprimer et 631 non mis à jour. Nécessité de prendre 700 ko d'archives. Après cette opération, 3,031 ko d'espace disque supplémentaire seront utilisés. Voulez vous continuer [O/n][nbsp}?
Pour informer network-manager sur les nouveaux paquets installés, vous devrez le redémarrer :
root@client:~# restart network-manager network-manager start/running, process 3078
Open the Network Manager GUI, select the VPN tab and then the 'Add' button. Select OpenVPN as the VPN type in the opening requester and press 'Create'. In the next window add the OpenVPN's server name as the 'Gateway', set 'Type' to 'Certificates (TLS)', point 'User Certificate' to your user certificate, 'CA Certificate' to your CA certificate and 'Private Key' to your private key file. Use the advanced button to enable compression (e.g. comp-lzo), dev tap, or other special settings you set on the server. Now try to establish your VPN.
OpenVPN avec interface graphique pour Mac OS X : Tunnelblick
Tunnelblick est une excellente implémentation, libre et open source d'une interface graphique pour OpenVPN sur OS X. La page d'accueil du projet est sur http://code.google.com/p/tunnelblick/. Téléchargez ici la dernière version pour OS X et installez-la. Ensuite, mettez votre fichier de configuration avec les certificats et clés de client.ovpn dans /Users/nom_d'utilisateur/Library/Application Support/Tunnelblick/Configurations/ et lancez Tunnelblick depuis votre dossier Applications.
# client.ovpn d'exemple pour Tunnelblick client remote blue.example.com port 1194 proto udp dev tun dev-type tun ns-cert-type server reneg-sec 86400 auth-user-pass auth-nocache auth-retry interact comp-lzo yes verb 3 ca ca.crt cert client.crt key client.key
OpenVPN avec interface graphique pour Win 7
Pour commencer, téléchargez et installez l'installateur Windows OpenVPN le plus récent. OpenVPN 2.3.2 était le plus récent quand ceci a été écrit. À ce jour, l'interface de gestion est incluse avec l'installateur binaire Windows.
Vous devez démarrer le service OpenVPN. Allez à Démarrer > Ordinateur > Gestion > Services et Applications > Services. Cherchez le service OpenVPN et démarrez-le. Mettez son type de démarrage sur automatique. Pour la première exécution de l'interface graphique OpenVPN MI, vous devrez la lancer avec les droits administrateur. Faites un clic droit dessus et vous verrez cette option.
Vous devrez écrire votre configuration OpenVPN dans un fichier texte et le placer dans C:\Program Files\OpenVPN\config\client.ovpn avec le certificat d'AC. Vous pourriez placer le certificat de l'utilisateur dans le répertoire home de l'utilisateur comme dans l'exemple suivant.
# C:\Program Files\OpenVPN\config\client.ovpn client remote server.example.com port 1194 proto udp dev tun dev-type tun ns-cert-type server reneg-sec 86400 auth-user-pass auth-retry interact comp-lzo yes verb 3 ca ca.crt cert "C:\\Users\\username\\My Documents\\openvpn\\client.crt" key "C:\\Users\\username\\My Documents\\openvpn\\client.key" management 127.0.0.1 1194 management-hold management-query-passwords auth-retry interact ; Set the name of the Windows TAP network interface device here dev-node MyTAP
Note : si vous n'utilisez pas l’authentification utilisateur et/ou si vous voulez exécuter le service sans interaction de l'utilisateur, basculez les options suivantes en commentaire :
auth-user-pass auth-retry interact management 127.0.0.1 1194 management-hold management-query-passwords
Vous voudrez peut être régler le service Windows sur « automatique ».
OpenVPN pour OpenWRT
OpenWRT est décrit comme une distribution Linux pour les systèmes embarqués comme les routeurs sans fil. Il y a certains types de routeurs WLAN qui peuvent être flashés pour exécuter OpenWRT. En fonction de la mémoire disponible sur votre routeur OpenWRT, vous pouvez exécuter un logiciel tel que OpenVPN et vous pouvez par exemple construire un petit routeur de succursale bon marché avec une connectivité VPN au bureau central. Plus d'informations pour OpenVPN sur OpenWRT se trouvent ici. Et voici la page d'accueil du projet OpenWRT : http://openwrt.org
Connectez-vous à votre routeur OpenWRT et installez OpenVPN:
opkg update opkg install openvpn
Consultez /etc/config/openvpn et mettez-y votre configuration client. Copiez les certificats et les clés dans /etc/openvpn/
config openvpn client1 option enable 1 option client 1 # option dev tap option dev tun option proto udp option ca /etc/openvpn/ca.crt option cert /etc/openvpn/client.crt option key /etc/openvpn/client.key option comp_lzo 1
Redémarrez OpenVPN:
service openvpn restart
Vous devrez voir si vous avez besoin d'ajuster les règles de routage et de filtrage de votre routeur.
Références
-
Consultez le site web OpenVPN pour plus d'informations.
-
En outre, OpenVPN: Building and Integrating Virtual Private Networks (en anglais) est une lecture conseillée.