Créer son serveur VPN sous Debian
Pour qui : un particulier ou une entreprise
Pour quoi faire : Mise en réseau de sites distants
Matériel minimum : Un serveur sous Debian GNU Linux, et un client sous Linux ou Windows ou MAC.
But : Mettre en place un moyen sécurisé et efficace qui permet d’interconnecter une machine distante dans un Intranet, avec le minimum de moyens possible.
Solution retenue : OpenVPN
Détail du travail : Configurer le PKI OpenSSL, configurer le serveur OpenVPN , puis configurer les clients.
Architecture réseau obtenue :
-
Présentation d’OpenVPN
OpenVPN est une solution libre permettant de créer un réseau privé virtuel communément appelé VPN (Virtual Private Network), sur le protocole SSL (Secure Socket Layer).
L’avantage principal d’OpenVPN est de pouvoir interconnecter plusieurs réseaux (ou plusieurs ordinateurs distants) entre eux via une technique de « tunnel », et cela de manière sécurisée à l’aide du protocole SSL. Il existe deux modes de fonctionnement d’OpenVPN :
-
le mode « bridge », qui permet d’interconnecter plusieurs réseaux distants.
-
le mode « routed », qui permet d’interconnecter des machines distantes, et donc d’appliquer un filtrage plus précis.
-
Installation des paquetages serveur
Avant de pouvoir installer les paquetages d’OpenVPN, il est nécessaire d’avoir installé :
-
les options du noyau par défaut
-
la librairie LZO
-
la librairie OpenSSL (ainsi que ses composants de développement)
Tous les paquetages nécessaires se trouvent dans les dépôts officiels.
Sur notre serveur Debian, la commande suivante installera les paquets :
apt-get install openssl libssl-dev liblzo1 liblzo-dev openvpn
Grâce à APT, le système de gestion de paquetages de la distribution Debian, les dépendances seront résolues, et l’application s’installe sans soucis.
-
Génération des clés
Pour mettre en place notre infrastructure à clés publiques (PKI), il va falloir générer :
-
une clé de pour le protocole d’échange diffie-hellman (dh1024.key)
-
une clé et un certificat pour l’autorité de certification (ca.crt, ca.key)
-
une clé et un certificat pour le serveur (srv-vpn1.key, srv-vpn1.crt)
-
une clé et un certificat pour chaque client (client1.crt, client1.key)
Pour cela, des scripts existent pour simplifier la tâche. Il suffit d’exécuter un terminal en root, et de se déplacer dans le répertoire suivant :
su – root
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
Création de l’autorité de certification :
Éditer le fichier « vars » afin de paramétrer la PKI :
vim vars
-
export KEY_COUNTRY=« FR »
-
export KEY_PROVINCE=« France »
-
export KEY_CITY= »Paris »
-
export KEY_ORG=« Organisation «
-
export KEY_EMAIL=« contact@organisation.fr »
Initialisation des variables :
. ./vars
Ensuite, création du répertoire qui contiendra les clés :
./clean-all
Génération du certificat principal du serveur (ca.crt) et la clé correspondante (ca.key):
./build-ca
Nous confirmons les paramètres en appuyant à chaque fois sur [Entrée], sauf pour le Common Name, où il faut renseigner le « hostname » du serveur (exemple : srv-vpn1).
Création du certificat et de la clé pour le serveur OpenVPN :
./build-key-server srv-vpn1
Nous confirmons les paramètres en appuyant à chaque fois sur [Entrée]. Ce n’est pas la peine de renseigner le paramètre « Challenge Password ».
La signature du certificat se fait en renseignant [Y]qu’il faudra confirmer toujours avec [Y].
Création du certificat et de la clé pour un client OpenVPN :
./build-key client1
Nous confirmons les paramètres en appuyant à chaque fois sur [Entrée]. Chaque Common Name doit être différent pour chaque client (ici, nous renseignerons « client1 »). Ce n’est pas la peine de renseigner le paramètre « Challenge Password ». La signature du certificat se fait en renseignant [Y] qu’il faudra confirmer toujours avec [Y]. Cette procédure est à faire pour chaque client.
Création du paramètre Diffie Hellman :
./build-dh
Mise en place des certificats et des clés :
Copie vers le répertoire du service OpenVPN :
mv ./keys/ca.crt /etc/openvpn/
mv ./keys/serveur.crt /etc/openvpn/
mv ./keys/serveur.key /etc/openvpn/
mv ./keys/dh1024.pem /etc/openvpn/
Création de l’utilisateur du processus OpenVPN :
Dans un soucis de sécurité toujours, nous allons créer le groupe « openvpn », puis l’utilisateur « openvpn » (sans shell, et sans répertoire de connexion) qui exécutera le processus OpenVPN :
groupadd openvpn
useradd -d /dev/null -g openvpn -s /bin/false openvpn
-
Configuration du service OpenVPN :
Nous allons partir de l’exemple fournis avec les paquetages :
cd /usr/share/doc/openvpn/examples/sample-config-files/
gunzip server.conf.gz
cp server.conf /etc/openvpn/vim /etc/openvpn/server.conf
Voici la configuration :
# Port en écoute (pris au hasard par mesure de sécurité) # Attention à bien configurer le NAT sur le routeur, pour pouvoir rediriger le port vers le serveur port 2829 # Utilisation du protocole UDP, plus sécurisé proto udp # Configuration de l'interface en mode "routed" dev tun # Définition des chemins des certificats/clés ca ca.crt cert srv-vpn1.crt key srv-vpn1.key # Paramètres Diffie hellman dh dh1024.pem # Adresse du réseau virtuel server 10.8.0.0 255.255.255.0 # Indique au client la route vers le réseau Intranet push "route 172.48.0.0 255.255.255.0" # Indique au client les informations DNS push "dhcp-option DOMAIN organisation.fr" # Ping tous les 10sec, si au bout de 120sec il n'y a pas de réponse alors déconnexion keepalive 10 120 # Compression comp-lzo # Restriction du processus à un utilisateur user openvpn group openvpn # Pour que la connexion persiste persist-key persist-tun # Fichier de sorties de logs status openvpn-status.log # Verbosité standard des logs verb 4 |
Redémarrage du service OpenVPN :
/etc/init.d/openvpn restart
Nous allons autoriser le serveur VPN à faire transiter des paquets vers un autre réseau :
echo 1 > /proc/sys/net/ipv4/ip_forward
Pour automatiser le dernier paramètre, il suffit de décommenter la ligne
net.ipv4.ip_forward=1
dans le fichier /etc/sysctl.conf.
-
Installation des paquetages client :
-
Sur un client Debian, la commande suivante installera les paquets nécessaires :
apt-get install openvpn liblzo1
-
Sur un client Microsoft Windows, nous utiliserons le logiciel OpenVPN-GUI (disponible à l’URL http://openvpn.se/download.html)
-
Configuration du client :
-
Si le client est sous Linux, il faut créer un fichier de configuration situé dans /etc/openvpn :
vim /etc/openvpn/server.conf
-
Si le client est sous Windows, il faudra éditer le fichier config situé dans C:\\Program Files\\OpenVPN\\
Voici la configuration :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | client dev tun proto udp # Adresse IP publique du serveur VPN, et son port d'écoute remote 220.0.0.1 2829 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key comp-lzo verb 4 # Rajouter ces 2 lignes pour un client Windows Vista # ou Seven : route-method exe route-delay 2 |
Pour lancer la connexion sur Windows, il suffit de faire un clic droit sur l’icône « OpenVPN » situé à gauche de l’horloge et de choisir l’option « Connecter ».
Sur Linux, un redémarrage du service OpenVPN sera suffisant.
Une fois connecté, le client distant est dans le réseau privé virtuel, qui connait la route vers le réseau Intranet. Le serveur VPN étant la passerelle, les machines de l’Intranet n’ont pas besoin de connaître la route vers le réseau privé.
Pour vérifier l’état de la connexion, ou pour détecter le moindre de soucis, un
tail -f /var/log/syslog
ou encore la lecture du fichier openvpn-status.log renseigne toutes les informations nécessaires.
Pour aller plus loin :
Installer un serveur Proxy dans l’Intranet peut permettre au client de surfer sur Internet comme s’il était dans l’Intranet. Très utile pour déjouer les filtrages réseaux appliqués par certains FAI, ou tout simplement lorsque l’on se trouve derrière un proxy. Les paquets HTTP seront encapsulés dans le tunnel VPN, et décapsulés en sortie, et vice-versa pour le retour.