La configuration d’un VPN est souvent d’une très grande utilité pour la sécurité de vos équipements mais aussi pour une facilité d’accès accrue. Cet article va vous présenter comment mettre en place un serveur VPN en utilisant OpenVPN, ainsi que la configuration d'un clients.

Installation du serveur (cette méthode fonctionne aussi avec openvpn version 2.1_rc15) :

Télécharger la dernière version openvpn ici

cd /opt/SOURCES/
wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
tar -xvzf openvpn-2.0.9.tar.gz
cd openvpn-2.0.9
mkdir /opt/openvpn

Compilation :

Avec OpenVPN, on peut compresser les données avec un algrothme de compression sans perte : LZO.

apt-get install liblzo1 ou yum install liblzo1-devel

liblzo et openssl sont les seul dépendances obligatoire.

Aidez vous des documentations du site officiel et du fichier INSTALL qui se trouve dans les sources.

./configure --prefix=/opt/openvpn --enable-strict --with-ssl-headers=/usr/include/openssl --with-ssl-lib=/lib64 --with-lzo-headers=/usr/include/lzo --with-lzo-lib=/usr/lib64
make
make check
make install

Si vous êtes sous redhat, moins drôle ! il faut la compiler j'ai fais un article à ce sujet ici

Création du certificat de l’autorité de certification CA :

cd /opt/SOURCES/openvpn-2.0.9/easy-rsa/

Dans ce répertoire se trouvent quantité de petits scripts très utiles pour la génération de clé et de certificats.

Dans un premier temps, on va éditer le fichier vars qui va contenir des variables par défaut pour les scripts. Cette étape n’est pas indispensable mais elle va vous faire gagner beaucoup de temps.

vi vars
export KEY_COUNTRY=FR
export KEY_PROVINCE=France
export KEY_CITY=Lyon
export KEY_ORG="system-linux.eu"
export KEY_EMAIL="gangan@mon-domaine.org"

On prépare les variables que l’on vient de définir et on nettoie le répertoire des clefs :

. ./vars ou source ./vars
./clean-all

On va utiliser un fichier de configuration par défaut pour openssl : openssl.cnf

Ensuite on a créer dans le répertoire "keys/" le certificat principal du serveur "ca.crt" :

./build-ca

Une série de question va vous être posé, tout est déjà rempli grâce au fichier "vars", mais vous devez impérativement choisir un "Common Name" pour le server (son hostname c'est bien).

On a créé l’autorité de certification !

Création du certificat et de la clé pour le serveur :

./build-key-server hostname-vpn

Le script "build-key-server" demande un mot de passe, moi je n'ai rien mis.

Ceci créé dans "keys/" le certificat "hostname-vpn.crt" et la clé "hostname-vpn.key".

Création de certification & clé pour un client (en lieu et place de client1 préférez le hostname du client) :

./build-key client1

Attention, le Common Name doit être différent pour chaque entité, sinon vous aurez l’erreur suivante :

failed to update database
TXT_DB error number 2

Création du paramètre Diffie Hellman :

./build-dh

Ceci créé dans "keys/" un fichier "dh1024.pem". C’est une opération relativement longue selon la puissance de votre machine.

Mise en place des fichiers serveurs :

On va copier les fichiers nécessaire au fonctionnement du serveur dans /opt/openvpn/etc/ :

mkdir /opt/openvpn/etc
cp ./keys/{ca.crt,ca.key,MonServeurVPN.crt,MonServeurVPN.key,dh1024.pem} /opt/openvpn/etc/

Configuration du démon openvpn :

Création d’un utilisateur :

Par défaut, l’utilisateur "nobody" est utilisé, ce qui n’est pas très clean :).

groupadd openvpn
useradd -d /dev/null -g openvpn -s /bin/false openvpn

Edition du fichier de configuration :

On va se baser sur le fichier server.conf de configuration proposé par openvpn :

cd /opt/SOURCES/openvpn-2.0.9/sample-config-files/
cp server.conf /opt/openvpn/etc/

On l'édite "/opt/openvpn/etc/server.conf" :

On modifie les noms des certificats/clés et le nom de l'utilisateur/groupe pour le démon openvpn qui se trouve ici /opt/openvpn/sbin :

ca /opt/openvpn/etc/ca.crt
cert /opt/openvpn/etc/hostname-vpn.crt
key /opt/openvpn/etc/hostname-vpn.key  # This file should be kept secret

dh /opt/openvpn/etc/dh1024.pem

user openvpn
group openvpn

log /var/log/openvpn.log
verb 5

Démarrage du serveur :

cd /opt/openvpn/sbin/
./openvpn --config ../etc/server.conf

On s’assure que le démon tourne bien et on va surveiller les messages du démon : $ ps -ef | grep openvpn openvpn 20483 1972 0 11:59 pts/1 00:00:00 ./openvpn --config ../etc/server.conf

Pour débuger :

$ tail -f /var/log/openvpn.log

On peut déjà remarquer qu’un "ifconfig" nous montre une nouvelle interface.

$ ifconfig
tun0      Lien encap:UNSPEC  HWaddr xx-xx
         inet adr:10.8.0.1  P-t-P:10.8.0.2  Masque:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
         RX packets:487260 errors:0 dropped:0 overruns:0 frame:0
         TX packets:302913 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:100
         RX bytes:40797602 (38.9 MiB)  TX bytes:99006324 (94.4 MiB)

Configuration d’un client Linux sous debian :

apt-get install openvpn

Il faut bien sûr créer un nouveau couple (certificat/clef) pour ce client. On les copiera ainsi que l’autorité de certification "ca.crt" dans /etc/openvpn.

Copie des fichiers du serveur vers le client1 :

Il faut copier dans /etc/openvpn du client les fichiers que l’on a précédemment créé sur le serveur : "ca.crt", "client1.crt" et "client1.key". On utilise ensuite le fichier de configuration d’exemple situé dans /opt/SOURCES/openvpn-2.0.9/sample-config : client.conf. On le copie dans le répertoire "/etc/openvpn" et on fait quelques modifications :

Sur le serveur :

cd /opt/SOURCES/openvpn-2.0.9/easy-rsa/keys/
scp -P 22 client1.* root@ip-client1:/etc/openvpn/

Modifications à faire dans le fichier /etc/openvpn/client.conf

remote 91.56.78.XX 1194   ;  IP du serveur VPN

ca /etc/openvpn/ca.crt
cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key

Débug client :

Pour débuger, on peut logguer séparément les messages d’openvpn, comme pour le serveur:

log        /var/log/openvpn.log

On peut modifier le niveau de verbosité des logs :

verb 5

Enfin, on peut activer un accès en local pour des commande direct sur le démon :

management localhost 7505

Ajouter un client :

La procédure est exactement la même que lors de l’installation, vous devez faire :

cd /opt/SOURCES/openvpn-2.0.9/easy-rsa/ source ./vars cd keys ../build-key clientX

Ce qui va vous créer un clientX.crt et clientX.key, que vous copierez sur votre nouveau client. Il vous faudra également paramétrer son fichier de configuration client.conf comme plus haut.

Attention :

Une erreur à ne pas faire est de réexecuter le script clean-all dans le répertorie /opt/SOURCES/openvpn-2.0.9/easy-rsa/. Cette commande vous supprimerai toutes vos clefs et certificats clients... Il faut conserver les certificats pour pouvoir les révoquer si besoin.

Information sur les différents fichiers :

/opt/SOURCES/openvpn-2.0.9/easy-rsa/ - serial : contient le numéro à affecter au prochain client - index.txt : liste de tous les clients créés - *.crt : les certificats - *.key : les clefs privées - *.csr : les demandes de certificats, qui devront être signés pour créer le certificat

/opt/openvpn/etc/ - ipp.txt : garde une association entre IP et client

Liste des fichiers créés :

  • ca.crt : c'est le certificat du Master CA. Il doit être installé sur chaque clients et sur le serveur.
  • ca.key : c'est la clef du Master CA. Elle doit rester secrète et être sur chaque machine qui doit générer des clefs, dans note cas : le serveur.
  • dh1024.pem : c'est les paramètres Diffie Hellman. Il doit rester sur le serveur.
  • hostname-du-serveur.crt : c'est le certificat du serveur et doit être sur le serveur.
  • hostname-du-serveur.key : c'est la clef de votre serveur, doit être sur le serveur et rester secrète.
  • client1.crt : c'est le certificat d'un de vos clients, à mettre sur le client.
  • client1.key : c'est les clefs d'un de vos clients, à mettre sur le client et rester secret.
  • Les .key doivent être secret. Vous devez donc les garder en sécurité.
  • ca.crt doit être installé sur chaque client ainsi que sur le serveur
  • client1(.crt|.key) est a installer sur le client1.
  • hostname-du-serveur(.crt|.key) est a installer sur le serveur.

Si vous utilisez iptables :

Règles iptables sur le serveur.

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -d ! 10.8.0.1 -j SNAT --to-source IP_SERVEUR_VPN
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -A OUTPUT -p tcp --dport 1194 -j ACCEPT   
iptables -A INPUT -p tcp --dport 1194 -j ACCEPT
iptables -L

Vous devez changer IP_SERVEUR_VPN par l'IP de votre serveur et eth0 par l'interface réseau que vous utilisez.

Autoriser le forward IPv4 :

Deux méthode.

vi /etc/sysctl.conf et vous mettez ceci à 1 : net.ipv4.ip_forward = 1
ou alors
echo 1 > /proc/sys/net/ipv4/ip_forward 

Petit plus d'openvpn : des clients graphiques de connexion et d'administration :

ici

Voila j'espère que cela vous aura aidé :)