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=[email protected]

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.

  • http://[email protected] Christophe-Marie

    Super billet. Merci, je marque l’adresse.

  • http://www.colibrix.info nicodeme

    Merci beaucoup pour ce billet. L’explication est simple, il viendra remplir mes marques-pages.

  • admin

    Merci, n’hésitez pas à me contacter pour des questions ou remarques…

  • feilong74

    Excellent tuto. Simple, clair, précis, accessible.
    Très bon boulot.

    Quel avantage du VPN par rapport à un proxy socks avec serveur ssh ?

  • admin

    Ma réponse est simple, je préconise l’authentification par certificat.
    Après je ne connais pas plus le protocole socks, et son utilisation. Je sais juste qu’il ne gère pas les certificats.
    Le VPN est bien plus puissant, il permet même l’authentification via PAM, enfin bref, on peux faire tellement de choses avec… !

  • manu

    Merci beaucoup pour ce tuto complet!

  • ilham

    slt
    j’ai des prob avec la cration du vpn
    en fait je trouve pas le fichier keys

  • http://my1.fr ADMIN

    Le problème doit venir au niveau de l’installation de open-ssl,
    - est tu sous Debian?
    - as tu installer les paquets venant des depots ?
    - as tu regarder au bon endroit pour les fichiers ?

  • http://www.ng2s.com ATHIE

    Félicitation! pour votre serveur VPN sous Debian.
    Je prépare un mémoire sur le “Déploiement d’un serveur VPN sous LIUX”.
    Je dois soutenir vers le mois d’octobre si tout va bien.

    Quelle version de linux choisir?Puorquoi?
    Pour le matériel je dispose juste d’un PC chez moi si non j’ai un moyen d’accéder à l’internet à l’école pour mes recherches.
    Pouvez vous m’accompagnez afin qu je puisse atteindre l’objectif c’est à dire acceder à dister un client sous windows ou linux quelque soit l’endroit où je me trouve.

    Merci d’avance.
    Conseils et suggestions sont les bienvenus!

  • http://www.ng2s.com ATHIE

    Félicitation! pour votre serveur VPN sous Debian.
    Je prépare un mémoire sur le “Déploiement d’un serveur VPN sous LINUX”.
    Je dois soutenir vers le mois d’octobre si tout va bien.

    Quelle version de linux choisir?Puorquoi?Quels matériels?
    Pour le matériel je dispose juste d’un PC chez moi si non j’ai un moyen d’accéder à l’internet à l’école pour mes recherches.
    Pouvez vous m’accompagnez afin qu je puisse atteindre l’objectif c’est à dire acceder à distance un client sous windows ou linux quelque soit l’endroit où je me trouve. J’ai aussi accès dans une entreprise de 4 postes sous windowsXP?

    Merci d’avance.
    Conseils et suggestions sont les bienvenus!

  • http://www.eveha.fr Tuxy

    salut, bon, tuto, mais j’ai une question: j’ai moi même un openVPN opérationnel avec plusieurs clients, mais j’ai besoin de rajouter un client. Comment fait on? faut il recréer tout les certificats ? (laborieux quand même) ou existe il une méthode pour rajouter un client sans refaire tout les certificats (clients et serveur) ?

  • admin

    ben tu créer un autre certificat avec la même autorité de certification… ça va te prendre 1 minutes…

    Tu fais ca pour chaque client.

    Si un certificat est compromis, tu peux même le révoquer !!!

  • Elekaj

    Salut,
    Excellent tuto, je m’en suis servi comme base pour configurer mon serveur VPN.
    Tout vas bien quand chaque client est aussi OpenVPN.
    La question, est il possible de se connecter (sous Windows) par la création d’un VPN via le panneau de config ?

  • admin

    Non, par contre tu peux utiliser OpenVPN-GUI pour windows.

  • Atarakt

    Salut,

    Ton tuto est super clair bravo. Par contre la commande
    echo 1 > /proc/sys/net/ipv4/ip_forward

    ne va pas supporter un reboot :)

    Il faut mieux décommenter la ligne

    net.ipv4.ip_forward=1

    dans le fichier /etc/sysctl.conf.

    Je ne comprend pas trop tes règles de filtrage, elles me semble complexes.

    iptables -t -nat -A POSTROUTING -o eth0 -s 192.168.0.254 -j MASQUERADE
    et
    iptables –table nat –append POSTROUTING –out-interface eth0 -j MASQUERADE
    font pratiquement la même chose. tu peux tester :

    iptables -A FORWARD -i tun0 -j ACCEPT
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    Ça fonctionne chez moi, cela évite les formes longues =).

  • formdable

    bonjour et merci le tuto mais moi j ai eu openvpn en tar.zg j ai un probleme avec openvpn, je n arrive pas a demarrer le serveur car je n ai pas openvpn dans /etc/init.d/

  • rindra

    merci pour le tuto;

    je suis débutant en VPN et je voudrais savoir comment faire un VPN avec IPsec?

    Un bon tuto comme celui là me ferais vraiment plaisir.

  • williamsko

    C’est très cool ce que t’as fait là.Moi j’ai attencore une petite préoccupation.Est-ce possible de le faire sous UBUNTU?
    Si oui comment ?J’attends votre réponse avec impatience.

  • http://my1.fr Admin

    c’est exactement la même procédure… Ubuntu et Debian sont des distributions “soeurs”, elle utilisent le même système de paquetages, et les commandes sont les mêmes.
    Bon courage !

  • http://www.dkc-technologies.com Dominique

    Bonjour
    Excellent tuto. Comment puis-je le mettre en place dans le cadre de l’interconnexion de plusieurs sites repartis à travers plusieurs pays avec des clients windows XP sur chaque site.

    Bonne réception

  • judy

    Bonjour mon cher frere,
    Excuse moi de te demander de faire un petit travail, c’est en fait que je veux soutenir sur le theme “Deploiement d’un reseau VPN sous Linux” et je souhaite que de façon ordonée tu me donne un plan etape par etape et avec toutes les informations.
    Je sais compter ur votre bonne comprehension.
    Merci de m’envoyer ces informations afin que je soutienne le plus vite possible.
    Bien à toi.

  • Jalalabad

    tres bon tuto. Merci

  • Merwok

    Bonjour

    Merci pour cette bonne ressource.

    Concernant SSH et SOCKS, SSH permet de s’authentifier par certificat. VPN offre-t-il d’autres fonctionnalités qui justifient de le préférer ?

    Je suggère que ce tutoriel commence par une copie de /usr/share/doc/openvpn/examples/easy-rsa vers ~ ou /tmp, ce qui éviterait la mauvaise pratique de bidouiller dans /usr/share/doc.

    Détail : il me semble que « package » se traduit « paquet » ;)

    Cordialement, Merwok

  • boss

    merci beaucoup
    juste une question.es que je peut utiliser sa sur mon serveur distant pour l’utiliser comme proxy ?
    merci

  • nahindavyi Donat

    Bonjour,
    Vous avez fait un bon tuto,ma question est la suivante pour les iptables je vois que vous dites configurations du réseau au niveau du serveur et au niveau du client;la configuration du réseau se fait sur les deux ou seulement sur le srveur?

  • Mbacke

    salut, votre tuto est bonne mais j’ai un problème avec ma config. le client se connect avec des erreur tls. Et openVPN prend la couleur jaune. j’ai besoin d’aide

    merci

  • Pingback: TOBaa » Installer un serveur VPN sur Debian

  • olouka

    Merci du tutoriel donnant tous les details sur l’installation et configuration du vpn sous debian.J’ai juste parcouru,il a l’air très interressant et donc repondant au besoin.J’ai depuis lors chercher un document de ce type,merci une fois de plus de votre volonté et savoir-faire.

  • olouka

    J’aimerais aussi savoir comment attaquer le serveur depuis un poste client sous windows.Quelle config operée au niveau de la station cliente pour pouvoir se connecter au serveur.

  • Tansa

    Je suis tombé sur ce tutoriel, et je tiens à dire merci. Il est clair et bien illustré.

    Mais j’ai un petit problème au début, à l’initialisation des clés pour le certificat. Quand je fais “./build-ca” ou “../vars” ça me dit “you must define KEY_DIR”.
    Bon je dois définir une KEY_dir, mais où?

    Sa doit être un truc de noob! En tout cas merci pour la futur réponse ^^.

  • Tansa

    ahahah j’avais dit que c’était un problème de noob. En fait je faisais pas l’espace avant le point de ./vars
    merci encore.

  • mir0

    Bonjour,

    J’ai une petite question, est-il possible de se connecter sur ce vpn avec un client windows ?

    Si oui saurais tu expliquer la procedure stp ?

    Merci d’avance.

  • darkprince3

    Super tuto, toutefois quelqu’un sait comment procéder si le server est sous ubuntu server et le client sous windows 7?

  • yoyox

    Bonjour, merci pour le tutoriel mais je bloquer a openvpn.conf apparemment je ne possède pas le fichier ou avec le temps il a du être remplacé en revanche je possède un autre fichier update-resolv-conf si quelqu’un pourrais me guidez sa serais super sympa merci

  • jpdc91

    Bonjour,
    Pour commencer je te félicite pour ce tuto.
    J’aimerais savoir si cette fonction vpn permet également de masquer l’adresse ip lorsque on tape mon adresse dyndns lier à mon serveur ( comme avec un serveur proxy ),est-ce le cas stp?
    Merci pour ton boulot :)

  • yan

    si tu utilise debian tu aura dans /etc/openvpn/ les fichiers de conf clien et serveeur nomé:
    server.conf pour le server
    client.conf pour le client
    donc fait un vi /etc/openvpn/server.conf

  • http://nom2domaine.wordpress.com/ Lori Lombera

    Debian rules!!Je lis avec beaucoup d’intéret votre blog. Encore merci pour ce post de qualité. Cordialement.

  • rostand

    Rien a ajouter le fond et la forme y sont.

  • Pingback: Liens en vrac – 12 | Jérémy Verda's blog!

  • tom

    salut ;)

    super tuto, merci de partager tes connaissances et passion.
    est-il possible de se mettre en contact, j’ai 1 ou 2 incertitudes, j’ai très bien suivi l’ensemble mais 1 ou 2 petits détails m’échappe.

    @+

  • Tonton nkunda

    merci pour votre contribution à la connaissance

  • jonathan cohen

    bonjour je cherche a monter une infrastructure avec plusieurs vps pour des vpn internationnal pouvez vous m’aider?