Installation du serveur VPN OpenVPN
Dernière mise à jour de l'article : 17/12/2014.
Un service de Virtual Private Network (VPN), ou réseau privé virtuel, permet à un utilisateur itinérant à l'extérieur de son réseau local de disposer des mêmes fonctionnalités que s'il était réellement connecté localement, quel que soit le terminal client utilisé (ordinateur portable, smartphone...). Cela peut concerner l'accès à des serveurs locaux ainsi que toutes autres ressources partagées (imprimantes, scanners... mais aussi la connexion Internet, par exemple).
Idéalement, la communication est intégralement chiffrée, maximisant la sécurité et la confidentialité des échanges.
Les serveurs VPN sont nombreux et utilisent rarement des protocoles compatibles entre eux. Cet article décrit l'installation de OpenVPN sur une distribution Debian GNU/Linux. OpenVPN est un logiciel libre très répandu basé sur OpenSSL. Il est également inclut dans la liste des logiciels conseillés par le site web Prism Break (à la rubrique des serveurs VPN) pour tenter d'échapper aux programmes de surveillance globale des services secrets internationaux.
Informations techniques
Nom du programme : OpenVPN
Version utilisée : 2.2.1
Licence : GNU GPL v2
Éditeur : OpenVPN Technologies, Inc.
Localisation : Californie (USA)
Site web : www.openvpn.net
Distribution utilisée : Debian GNU/Linux 7.7 « Wheezy »
Article Wikipédia : https://fr.wikipedia.org/wiki/OpenVPN
VPN (article Wikipédia) : https://fr.wikipedia.org/wiki/Réseau_privé_virtuel
OpenSSL (article Wikipédia) : https://fr.wikipedia.org/wiki/OpenSSL
Préalable à l'installation
En ce qui me concerne, l'installation va s'opérer sur un conteneur OpenVZ présent sur le réseau local et protégé par un pare-feu. Afin de pouvoir déployer l'interface réseau virtuelle utilisée par OpenVPN, il est nécessaire de configurer le serveur hébergeant le conteneur OpenVZ. De plus, afin d'être accessible de « l'extérieur », il est également nécessaire de configurer le pare-feu. Disposer d'une adresse IP fixe est aussi requis, à moins de tenir à jour son adresse dynamique.
Par ailleurs, si l'on dispose d'un nom de domaine et que l'on a la faculté de configurer le serveur DNS correspondant, il pourrait s'avérer pratique d'attribuer un enregistrement spécifique au service proposé. Cette étape est facultative.
Configuration du serveur hébergeant le conteneur OpenVZ
Il est nécessaire d'activer des fonctionnalités indispensables à OpenVPN dans le fichier de configuration du conteneur, ainsi que dans le conteneur lui-même. Cette opération s'effectue en ligne de commande, sur le serveur hébergeant le conteneur OpenVZ. Pour ce faire, il faut commencer par s'y connecter. Les étapes suivantes sont énoncées ci-dessous.
Se connecter en super-utilisateur :
su -
S'assurer que le conteneur visé est bien arrêté :
vzctl stop ID_CONTENEUR
Activer certaines fonctionnalités utiles à OpenVPN dans le fichier de configuration du conteneur :
vzctl set ID_CONTENEUR --devices c:10:200:rw --save vzctl set ID_CONTENEUR --capability net_admin:on --save vzctl set ID_CONTENEUR --devnodes net/tun:rw --save
Démarrer le conteneur :
vzctl start ID_CONTENEUR
Créer la carte réseau virtuelle utile à OpenVPN dans le conteneur :
vzctl exec ID_CONTENEUR mkdir -p /dev/net vzctl exec ID_CONTENEUR chmod 600 /dev/net/tun
Configuration du pare-feu
Il est nécessaire d'ouvrir et rediriger le port TCP 1194 depuis le routeur vers la machine hébergeant le service VPN. Ce port est utile aux communications client/serveur.
Configuration du serveur DNS (facultatif)
Il peut s'avérer commode de créer un enregistrement DNS pointant vers l'adresse IP publique de la machine. Chez moi, ça ressemble à ceci :
vpn 86400 A IP.IP.IP.IP
Installation du serveur VPN
Une fois le conteneur, le pare-feu et le serveur DNS configurés, reste à installer le serveur VPN. Pour ce faire, il faut commencer par se connecter à la machine sur laquelle installer le service. Les étapes suivantes sont énoncées ci-dessous.
Se connecter en super-utilisateur :
su -
Installer le programme :
aptitude install openvpn
Création des clefs de chiffrements
OpenVPN reposant sur OpenSSL et TLS pour chiffrer les communications, il est nécessaire de créer un ensemble de clefs permettant aux clients et au serveur de s'authentifier et échanger des données en toute confidentialité.
Copier le répertoire utile à la création des clefs de chiffrement dans /etc/openvpn et s'y rendre :
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa cd /etc/openvpn/easy-rsa
Éditer les variables générales à sa convenance :
vim vars
Par exemple, en fin de fichier :
export KEY_COUNTRY="FR" export KEY_PROVINCE="75" export KEY_CITY="Paris" export KEY_ORG="My Wonderful Organization" export KEY_EMAIL="myself@email.com"
Puis les charger en mémoire :
source vars
Si besoin, effacer toutes traces de clefs antérieures (attention de bien les sauvegarder si on souhaite les conserver !) :
./clean-all
Générer les paramètres de Diffie-Hellman :
./build-dh
Générer le certificat d'autorité de certification et la clef privée correspondante :
./pkitool --initca
Générer le certificat et la clef privée du serveur :
./pkitool --server server
Créer une clef tierce pour éviter toute usurpation (facultatif) :
openvpn --genkey --secret keys/ta.key
Copier les clefs dans le dossier de configuration de OpenVPN :
cp keys/ca.crt keys/ta.key keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/
Configuration de OpenVPN
Créer le répertoire dans lequel OpenVPN sera chrooté, pour une plus grande sécurité (facultatif) :
mkdir /etc/openvpn/chroot
Décompresser le fichier de configuration de OpenVPN donné en exemple :
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
Puis l'éditer :
vim /etc/openvpn/server.conf
Par exemple :
port 1194 proto tcp dev tun ca ca.crt cert server.crt key server.key dh dh1024.pem server 192.168.3.48 255.255.255.248 push "route 192.168.3.0 255.255.255.0" client-config-dir ccd # Facultatif push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 192.168.3.33" client-to-client keepalive 10 120 tls-auth ta.key 0 # Facultatif cipher AES-128-CBC comp-lzo max-clients 10 user nobody group nogroup persist-key persist-tun status openvpn-status.log log-append /var/log/openvpn.log verb 3 chroot /etc/openvpn/chroot # Facultatif
Redémarrer le service OpenVPN :
service openvpn restart
Trafic Internet (facultatif)
Afin de permettre aux clients de bénéficier du trafic Internet, il faut activer la fonctionnalité de routage des paquets IP de la machine hébergeant le service VPN, ainsi que la translation d'adresses NAT des paquets clients.
La première opération s'effectue — temporairement — par la commande suivante :
echo 1 > /proc/sys/net/ipv4/ip_forward
Afin de rendre l'opération persistante, il faut modifier le fichier /etc/sysctl.conf :
sed -i s/"#net.ipv4.ip_forward=1"/"net.ipv4.ip_forward=1"/ /etc/sysctl.conf
La seconde opération s'effectue — temporairement — par la commande suivante :
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.3.48/29 -j SNAT --to-source IP_DE_LA_MACHINE
Afin de rendre l'opération persistante, il existe de nombreuses méthodes. Si vous n'êtes pas familier avec cela, le plus simple est d'installer le paquet iptables-persistent et de répondre par l'affirmative à la première question posée :
aptitude install iptables-persistent
Création d'une configuration cliente
Créer le répertoire des configurations clientes :
mkdir /etc/openvpn/clients
Créer le répertoire des configurations clientes particulières (facultatif) :
mkdir /etc/openvpn/chroot/ccd
Générer un certificat et une clef cliente :
source vars && ./pkitool NOM_CLIENT
Créer et éditer le fichier de configuration particulière du client (facultatif) :
vim /etc/openvpn/chroot/ccd/NOM_CLIENT
Lui attribuer une adresse IP fixe, en y collant ceci (facultatif) :
ifconfig-push 192.168.3.51 192.168.3.52
Créer le répertoire dédié à ce nouveau client :
mkdir /etc/openvpn/clients/NOM_CLIENT
Copier les fichiers du client dans son répertoire :
cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/NOM_CLIENT.crt keys/NOM_CLIENT.key /etc/openvpn/clients/NOM_CLIENT/
Se déplacer dans le répertoire du client :
cd /etc/openvpn/clients/NOM_CLIENT
Copier le fichier de configuration donné en exemple :
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
Puis l'éditer :
vim client.conf
Par exemple :
client dev tun proto tcp remote vpn.FQDN.TLD 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca ca.crt cert NOM_CLIENT.crt key NOM_CLIENT.key ns-cert-type server tls-auth ta.key 1 # Facultatif cipher AES-128-CBC comp-lzo verb 3
Archiver et compresser les fichiers clients :
tar jcvf NOM_CLIENT.tar.bz2 ../NOM_CLIENT
Configuration d'un accès client
Maintenant que le serveur est configuré et qu'une configuration cliente à été créée, il ne reste plus qu'à l'importer dans son système d'exploitation favoris pour se connecter au service VPN. Il existe de nombreux programmes clients, avec ou sans interface graphique. Sous Debian GNU/Linux et l'environnement de bureau Gnome, on peut, par exemple, installer le paquet network-manager-openvpn-gnome :
sudo aptitude install network-manager-openvpn-gnome
Depuis le terminal client, il faut récupérer l'archive compressée contenant la configuration cliente. Par exemple :
scp USER@FQDN.TLD:/etc/openvpn/clients/NOM_CLIENT/NOM_CLIENT.tar.bz2 .
Toujours depuis le terminal client, et une fois l'archive décompressée, on peut importer le fichier de configuration client.conf dans nm-connection-editor, à l'onglet dédié aux connexions VPN :
nm-connection-editor
Une fois à « l'extérieur » de son réseau local, il devrait désormais être possible de se connecter au service VPN depuis la barre des tâches, en cliquant sur l'applet du gestionnaire de connexion réseau, à la rubrique « Connexions par VPN ».
Article sous licence Creative Commons BY-SA 3.0 France.