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 :

?Download serveur.conf
# 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

  • 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 :

?Download client.conf
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.