<h2>But de ce document</h2>
<p class="spip">Ce document me sert de <strong class="spip">mémo</strong> pour mettre en place le système <strong class="spip">OpenVPN</strong> sur un serveur Debian ETCH et sur des clients Windows ou Linux Debian.</p>

<p class="spip">OpenVPN est un système permettant de relier des postes distants sur un réseau informatique en passant par Internet mais de manière sécurisée (Tunnel VPN).</p>

<h2>Pré-requis</h2>
<p class="spip">Avoir installé une Debian stable de base : 
<br /></p>
<li> <a href="http://www.coagul.org/article.php3?id_article=337" class="spip_out">http://www.coagul.org/article.php3 ?id_article=337</a>
<p class="spip"><strong class="spip">ATTENTION</strong> : Il est fortement conseillé de savoir ce qu’est un certificat et une clé de cryptage pour la configuration d’OpenSSL. Il est conseillé également de connaître le fonctionnement des tables de routage pour la configuration d’OpenVPN.</p>

<h2>Installation d’OpenVPN 2.01 sur une Debian Etch</h2>
<p class="spip">Paquet à installer :</p>

<p class="spip"><code class='spip_code' dir='ltr'># aptitude install openvpn</code></p>

<p class="spip">Remarques : 
<br /></p>
<li> Avec <strong class="spip">OpenVPN</strong>, il est possible de compresser les données passant dans le tunnel VPN pour limiter l’utilisation de la bande passante. C’est la paquet « liblzo2-2 » qui permet d’effectuer cette compression. Ce dernier est normalement installé par défaut.
<br /><li> Pour sécuriser le tunnel VPN avec des clés et des certificats, OpenVPN, utilise OpenSSL. Ce dernier est normalement installé par défaut. Si ce n’est pas le cas, vous pouvez l’installer avec cette commande :
<p class="spip"><code class='spip_code' dir='ltr'># aptitude install openssl</code></p>

<h2>Création du certificat de l’autorité de certification (CA) </h2>
<p class="spip">La partie la plus compliquée et la plus fastidieuse dans la mise en place d’un serveur OpenVPN concerne la génération des clés et des certificats. <strong class="spip">OpenVPN</strong> est livré avec plusieurs scripts permettant de générer plus facilement les clés et les certificats pour OpenSSL. Ces scripts sont enregistrés dans le dossier « <strong class="spip">easy-rsa</strong> » :</p>

<p class="spip"><code class='spip_code' dir='ltr'># cd /usr/share/doc/openvpn/examples/easy-rsa/</code></p>

<p class="spip">Avant d’utiliser les scripts, il faut éditer le fichier « <strong class="spip"> vars </strong> » pour initialiser les variables par défaut indiquées à la fin de ce fichier. Par exemple :
<br /></p>
<li> export KEY_COUNTRY=<strong class="spip">FR</strong>
<br /><li> export KEY_PROVINCE=<strong class="spip">France</strong>
<br /><li> export KEY_CITY=<strong class="spip">Dijon</strong>
<br /><li> export KEY_ORG=<strong class="spip">"MonEntreprise"</strong>
<br /><li> export KEY_EMAIL=<strong class="spip">"contact@monentreprise.fr"</strong>
<p class="spip">Une fois le fichier modifié, la ligne suivante permet d’initialiser les variables pour les scripts :</p>

<p class="spip"><code class='spip_code' dir='ltr'># . ./vars</code></p>

<p class="spip">Le script suivant, permet de créer ou de réinitialiser le sous-dossier « <strong class="spip"> keys </strong> » :</p>

<p class="spip"><code class='spip_code' dir='ltr'># ./clean-all</code></p>

<p class="spip">Le script suivant permet de créer dans « <strong class="spip"> keys </strong> » le certificat principal du serveur « <strong class="spip">ca.crt </strong> » et la clé correspondante « <strong class="spip">ca.key</strong> » :</p>

<p class="spip"><code class='spip_code' dir='ltr'># ./build-ca</code></p>

<p class="spip">Ce script doit afficher à l’écran quelque chose qui ressemble à ça :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># ./build-ca<br />
Generating a 1024 bit RSA private key<br />
.................................................................++++++<br />
......++++++<br />
writing new private key to 'ca.key'<br />
-----<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [FR]:<br />
State or Province Name (full name) [France]:<br />
Locality Name (eg, city) [Dijon]:<br />
Organization Name (eg, company) [MonEntreprise]:<br />
Organizational Unit Name (eg, section) []:<br />
Common Name (eg, your name or your server's hostname) []:MonServeur<br />
Email Address [[contact@monentreprise.fr->mailto:contact@monentreprise.fr]]:</code></div>
<p class="spip"><strong class="spip">ATTENTION</strong> : Pour les questions, la plupart des champs sont renseignés par défaut sauf le « <strong class="spip">Common</strong><strong class="spip"> </strong><strong class="spip">Name</strong> » qu’il faut renseigner manuellement. Exemple « <strong class="spip">MonServeur </strong> ».</p>

<h2>Création du certificat et de la clé pour le serveur OpenVPN</h2>
<p class="spip">Le script suivant permet de créer dans « <strong class="spip"> keys </strong> » le certificat « <strong class="spip">LeServeurVPN.crt</strong> » et la clé « <strong class="spip">LeServeurVPN.key</strong> » pour le serveur VPN nommé par exemple « <strong class="spip">LeServeurVPN</strong> » :</p>

<p class="spip"><code class='spip_code' dir='ltr'># ./build-key-server LeServeurVPN</code></p>

<p class="spip">Ce script doit afficher à l’écran quelque chose qui ressemble à ça :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># ./build-key-server MonServeur<br />
Generating a 1024 bit RSA private key<br />
......................................................................<br />
..+++++<br />
...++++++<br />
writing new private key to 'MonServeur.key'<br />
-----<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [FR]:<br />
State or Province Name (full name) [France]:<br />
Locality Name (eg, city) [Dijon]:<br />
Organization Name (eg, company) [MonEntreprise]:<br />
Organizational Unit Name (eg, section) []:<br />
Common Name (eg, your name or your server's hostname) []:LeServeurVPN<br />
Email Address [votremail@votredomaine.com]:<br />
<br />
Please enter the following 'extra' attributes<br />
to be sent with your certificate request<br />
A challenge password []:<br />
An optional company name []:<br />
Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/openssl.cnf<br />
Check that the request matches the signature<br />
Signature ok<br />
The Subject's Distinguished Name is as follows<br />
countryName           :PRINTABLE:'FR'<br />
stateOrProvinceName   :PRINTABLE:'France'<br />
localityName          :PRINTABLE:'Dijon'<br />
organizationName      :PRINTABLE:'MonEntreprise'<br />
commonName            :PRINTABLE:'MonServeurVPN'<br />
emailAddress          :IA5STRING:'contact@monentreprise.fr'<br />
Certificate is to be certified until Dec  7 13:41:02 2015 GMT (3650 days)<br />
Sign the certificate? [y/n]:y<br />
<br />
1 out of 1 certificate requests certified, commit? [y/n]y<br />
Write out database with 1 new entries<br />
Data Base Updated</code></div>
<p class="spip"><strong class="spip">ATTENTION</strong> : Pour les questions, tous les champs sont renseignés par défaut sauf le « <strong class="spip">Common</strong><strong class="spip"> </strong><strong class="spip">Name</strong> » qu’il faut renseigner manuellement. Exemple « <strong class="spip">MonServeurVPN</strong> ». Personnellement, je n’ai pas renseigné le champ « password »</p>

<h2>Création du certificat et de la clé pour un client OpenVPN</h2>
<p class="spip">Le script suivant permet de créer dans « <strong class="spip"> keys </strong> » le certificat « <strong class="spip">Client01.crt</strong> » et la clé « <strong class="spip">Client01.key</strong> » pour le client VPN nommé par exemple « <strong class="spip">Client01</strong> » :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># cd /usr/share/doc/openvpn/examples/easy-rsa/<br />
# . ./vars<br />
# ./build-key Client01</code></div>
<p class="spip">Ce script doit afficher à l’écran quelque chose qui ressemble à ça :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>pgdebian:/usr/share/doc/openvpn/examples/easy-rsa# ./build-key Client01<br />
Generating a 1024 bit RSA private key<br />
..++++++<br />
....................++++++<br />
writing new private key to 'Client01.key'<br />
-----<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [FR]:<br />
State or Province Name (full name) [France]:<br />
Locality Name (eg, city) [Dijon]:<br />
Organization Name (eg, company) [MonEntreprise]:<br />
Organizational Unit Name (eg, section) []:<br />
Common Name (eg, your name or your server's hostname) []:Client01<br />
Email Address [contact@monentreprise.fr]:<br />
Please enter the following 'extra' attributes<br />
to be sent with your certificate request<br />
A challenge password []:<br />
An optional company name []:<br />
Using configuration from /usr/share/doc/openvpn/examples/easy-sa/openssl.cnf<br />
DEBUG[load_index]: unique_subject = "yes"<br />
Check that the request matches the signature<br />
Signature ok<br />
The Subject's Distinguished Name is as follows<br />
countryName           :PRINTABLE:'FR'<br />
stateOrProvinceName   :PRINTABLE:'France'<br />
localityName          :PRINTABLE:'Dijon'<br />
organizationName      :PRINTABLE:'MonEntreprise'<br />
commonName            :PRINTABLE:'Client01'<br />
emailAddress          :IA5STRING:['contact@monentreprise.fr->mailto:'contact@monentreprise.fr]'<br />
Certificate is to be certified until Mar  4 09:19:09 2016 GMT (3650 days)<br />
Sign the certificate? [y/n]:y<br />
<br />
1 out of 1 certificate requests certified, commit? [y/n]y<br />
Write out database with 1 new entries<br />
Data Base Updated</code></div>
<p class="spip"><strong class="spip">ATTENTION</strong> : Il faudra renouveler cette opération pour chaque client. Pour les questions, tous les champs sont renseignés par défaut sauf le « <strong class="spip">Common</strong><strong class="spip"> </strong><strong class="spip">Name</strong> » qu’il faut renseigner manuellement. Exemple « <strong class="spip"> Client01 </strong> ». Chaque « <strong class="spip">Common Name</strong> » de chaque client doit être différent. Personnellement, je n’ai pas renseigné le champ « <strong class="spip"> password </strong> »</p>

<h2>Création du paramètre Diffie Hellman</h2>
<p class="spip">Le script suivant permet de créer dans « <strong class="spip"> keys </strong> » le fichier « <strong class="spip">dh1024.pem</strong> » :</p>

<p class="spip"><code class='spip_code' dir='ltr'># ./build-dh</code></p>

<p class="spip">Ce script doit afficher à l’écran quelque chose qui ressemble à ça :</p>

<p class="spip"><code class='spip_code' dir='ltr'># ./build-dh</code></p>

<p class="spip"><code class='spip_code' dir='ltr'>Generating DH parameters, 1024 bit long safe prime, generator 2</code></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>This is going to take a long time<br />
....................................................................<br />
....................................................................<br />
..............+......................................+..............<br />
.++*++*</code></div>
<h2>Résumé des certificats et clés créés précédemment dans « keys »</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Emplacement du fichier</strong></th><th scope='col'><strong class="spip">Type </strong></th><th scope='col'><strong class="spip">Nom </strong></th><th scope='col'><strong class="spip">Secret</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>Serveur de certification (CA) OpenSSL</td><td>Certificat</td><td>ca.crt</td><td>Non</td></tr>
<tr class="row_odd"><td>Serveur de certification (CA) OpenSSL</td><td>Clé</td><td>ca.key</td><td>Oui</td></tr>
<tr class="row_even"><td> </td><td> </td><td> </td><td> </td></tr>
<tr class="row_odd"><td>Serveur OpenVPN</td><td>Certificat</td><td>LeServeurVPN.crt</td><td>Non</td></tr>
<tr class="row_even"><td>Serveur OpenVPN</td><td>Clé</td><td>LeServeurVPN.key</td><td>Oui</td></tr>
<tr class="row_odd"><td> </td><td> </td><td> </td><td> </td></tr>
<tr class="row_even"><td>paramètre Diffie Hellman</td><td> </td><td>dh1024.pem</td><td>Non</td></tr>
<tr class="row_odd"><td> </td><td> </td><td> </td><td> </td></tr>
<tr class="row_even"><td>Client OpenVPN N°1</td><td>Certificat</td><td>Client01.crt</td><td>Non</td></tr>
<tr class="row_odd"><td>Client OpenVPN N°1</td><td>Clé</td><td>Client01.key</td><td>Oui</td></tr>
</tbody>
</table>
<h2>Mise en place des certificats et des clés</h2>
<p class="spip">concernant le serveur OpenVPN, le plus simple est de copier les 4 fichiers dans le dossier « /etc/openvpn » :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># cp ./keys/ca.crt /etc/openvpn/<br />
# cp ./keys/LeServeurVPN.crt /etc/openvpn/<br />
# cp ./keys/LeServeurVPN.key /etc/openvpn/<br />
# cp ./keys/dh1024.pem /etc/openvpn/</code></div>
<p class="spip">Pour le client, il faudra copier ses deux fichiers une fois que celui-ci sera installé.</p>

<h2>Création d’un utilisateur avec des droits limités pour OpenVPN</h2>
<p class="spip">Pour limiter les risques d’attaques sur OpenVPN, il est important que le processus d’OpenVPN fonctionne sur un utilisateur n’ayant aucun droit sur le système.</p>

<p class="spip">Souvent, l’utilisateur « <strong class="spip"> nobody </strong> » est utilisé par défaut, mais il est encore plus sécurisant de faire tourner chaque processus avec un utilisateur différent. Donc, pour le processus OpenVPN, nous allons créer l’utilisateur « <strong class="spip"> openvpn </strong> » :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># groupadd openvpn<br />
# useradd -d /dev/null -g openvpn -s /bin/false openvpn</code></div>
<h2>Configuration d’OpenVPN</h2>
<p class="spip">Par défaut OpenVPN est fourni avec plusieurs fichiers d’exemples enregistrés dans le dossier :
<br /></p>
<li> <strong class="spip">/usr/share/doc/openvpn/examples/sample-config-files</strong>/
<p class="spip">Pour configurer le serveur, je suis parti du fichier d’exemple « <strong class="spip">server.conf.gz</strong> », qu’il faut donc décompresser et mettre en place dans « <strong class="spip"> /etc/openvpn</strong> » :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># cd /usr/share/doc/openvpn/examples/sample-config-files/<br />
# gunzip server.conf.gz<br />
# cp server.conf /etc/openvpn/</code></div>
<p class="spip">Il suffit ensuite d’adapter ce fichier en fonction des besoins. Voici par exemple le fichier de configuration que j’utilise :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>;Port en écoute utilisé pour la connexion VPN<br />
;port 1194<br />
<br />
;Protocole utilisé (Le protocole udp est plus sécurisé que le tcp)<br />
proto udp<br />
<br />
;Type d'interface réseau virtuelle créée<br />
dev tun<br />
<br />
;Nom des fichiers servant à l'authentification des clients via OpenSSL<br />
ca ca.crt<br />
cert LeServeurVPN.crt<br />
key LeServeurVPN.key  <br />
dh dh1024.pem<br />
<br />
;Adresse du réseau virtuel (Le serveur aura l'adresse 10.8.0.1)<br />
server 10.8.0.0 255.255.255.0<br />
<br />
;Cette ligne ajoute sur le client la route du réseau du serveur<br />
push "route 192.168.0.0 255.255.255.0"<br />
<br />
;Ces lignes indiquent aux clients l'adresse des serveur DNS et WINS<br />
push "dhcp-option DNS 192.168.0.2"<br />
push "dhcp-option DOMAIN MonDomaine.com"<br />
push "dhcp-option WINS 192.168.0.3"<br />
<br />
# Cette ligne permet aux clients de voire les autres clients<br />
;client-to-client<br />
<br />
keepalive 10 120<br />
<br />
;Cette ligne active la compression<br />
comp-lzo<br />
<br />
;Ces lignes indiquent un user et un group particulier pour le processus<br />
user openvpn<br />
group openvpn<br />
<br />
;Ces lignes permettent de rendre persistante la connexion<br />
persist-key<br />
persist-tun<br />
<br />
status openvpn-status.log<br />
<br />
;Cette ligne permet d'indiquer le niveau de log souhaité (de 1 à 9)<br />
verb 1</code></div>
<h2>Démarrage du serveur OpenVPN</h2>
<p class="spip">La commande suivante permet de démarrer ou redémarrer le serveur :</p>

<p class="spip"><code class='spip_code' dir='ltr'># /etc/init.d/openvpn restart</code></p>

<p class="spip">Ne pas hésiter à regarder dans les logs que tout c’est bien passé :</p>

<p class="spip"><code class='spip_code' dir='ltr'># tail -100 /var/log/syslog</code></p>

<p class="spip">Bien vérifier également que le processus tourne sous l’utilisateur « openvpn »</p>

<p class="spip"><code class='spip_code' dir='ltr'># ps aux | grep openvpn</code></p>

<p class="spip">Pour finir, si tout c’est bien passé l’interface « tun0 » doit apparaître dans la configuration du réseau :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># ifconfig<br />
...<br />
tun0      Lien encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00<br />
          inet adr:10.8.0.1  P-t-P:10.8.0.2  Masque:255.255.255.255<br />
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1<br />
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0<br />
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0<br />
          collisions:0 lg file transmission:100<br />
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)</code></div>
<p class="spip">Et il doit être possible de la pinguer :</p>

<p class="spip"><code class='spip_code' dir='ltr'># ping 10.8.0.1</code></p>

<h2>Installation du Client Windows </h2>
<p class="spip">Avec OpenVPN, la notion de client et de serveur n’existe pas étant donné que c’est le même logiciel qui peut faire office de client ou de serveur. Dans mon cas, le serveur est installé sur une Debian Sarge et les clients sont sous Debian Testing ou Windows 2000/XP.</p>

<p class="spip">Pour Windows, il existe une version d’OpenVPN avec une installation simplifiée téléchargeable à cette adresse : 
<br /></p>
<li> <a href="http://openvpn.se/download.html" class="spip_out">http://openvpn.se/download.html</a>
<br /><li> <a href="http://openvpn.se/files/install_packages/openvpn-2.0.5-gui-1.0.3-install.exe" class="spip_out">http://openvpn.se/files/install_packages/openvpn-2.0.5-gui-1.0.3-install.exe</a>
<p class="spip">Lors de l’installation de ce programme, la carte réseau virtuelle « TAP-Win32 Adapter V8 » est installée. Une fois le programme installé, il est lancé automatiquement et à chaque démarrage de Windows. Un icône pour le configurer est disponible à coté de l’heure.</p>

<p class="spip">Ensuite, il est possible de franciser OpenVPN en remplaçant le binaire enregistré dans « <a href="file:///C:/Program" class="spip_out">C :\Program</a> Files\OpenVPN\bin\openvpn-gui.exe » par le binaire téléchargeable à l’adresse ci-dessous (Attention : Il faut le renommer après l’avoir téléchargé) :
<br /></p>
<li> <a href="http://openvpn.se/files/localized/binary/1.0.3/openvpn-gui-1.0.3-fr.exe" class="spip_out">http://openvpn.se/files/localized/binary/1.0.3/openvpn-gui-1.0.3-fr.exe</a>
<h2>Configuration du client Windows</h2>
<p class="spip">La première chose à faire est de copier dans le dossier « <a href="file:///C:/Program" class="spip_out">C :\Program</a> Files\OpenVPN\config » les fichiers servant à l’authentification du client via OpenSSL créés dans les chapitres précédents : 
<br /></p>
<li> ca.crt, Client01.crt et Client01.key
<p class="spip">Ensuite, il faut modifier le fichier de configuration pour l’adapter à votre cas. Pour éditer le fichier, il est possible de faire un clic droit sur l’icône « OpenVPN » situé à gauche de l’heure et de choisir l’option « Éditer la configuration ».</p>

<p class="spip">Voici un exemple de fichier que j’utilise pour mes clients :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>client<br />
dev tun<br />
proto udp<br />
<br />
remote 192.0.1.2 1194<br />
<br />
resolv-retry infinite<br />
nobind<br />
<br />
persist-key<br />
persist-tun<br />
<br />
ca ca.crt<br />
cert Client01.crt<br />
key Client01.key<br />
<br />
comp-lzo<br />
<br />
verb 1</code></div>
<p class="spip">Normalement, si vous utilisiez la même configuration que moi, vous n’aurez qu’à changer :
<br /></p>
<li> L’adresse IP du serveur OpenVPN sur la ligne « remote »
<br /><li> Le nom des fichiers : ca.crt, Client01.crt et Client01.key
<h2>Lancement du client Windows</h2>
<p class="spip">Pour lancer la connexion, il suffit de faire un clic droit sur l’icône « OpenVPN » situé à gauche de l’heure et de choisir l’option « Connecter ».</p>

<p class="spip">Si tout se passe bien, une fenêtre affichant les logs doit s’afficher et une fois la connexion effectuée, le réseau est opérationnel.</p>

<p class="spip">En cas de problème, et pour trouver l’origine de celui-ci il faut augmenter le niveau des logs en changeant le paramètre « <strong class="spip"> verb </strong> » du fichier de configuration : 
<br /></p>
<li> verb 3 -> Suffisamment de logs dans la plupart des cas.
<br /><li> verb 9 -> Énormément de logs.
<p class="spip">Une fois la connexion établie, il doit être possible de pinguer le serveur soit sur son adresse virtuelle (ex : 10.8.0.1 dans notre cas) soit sur son adresse réelle (ex : 192.168.0.1)</p>

<p class="spip"><strong class="spip">Remarque </strong> : Depuis le serveur, pour connaître les clients connecté, il faut consulter le fichier :
<br /></p>
<li> <strong class="spip">/etc/openvpn/openvpn-status.log</strong>
<h2>Installation Client Linux</h2>
<p class="spip">L’installation du client est identique à celle du serveur, car c’est le même logiciel qui fait office de serveur ou de client en fonction de sa configuration :</p>

<p class="spip"><code class='spip_code' dir='ltr'># apt-get install openvpn liblzo1</code></p>

<p class="spip">Le fichier de configuration et la gestion des clés est identique à celle du client Windows.</p>

<h2>Permettre aux clients VPN d’accéder à l’ensemble du réseau distants</h2>
<p class="spip">Avec la configuration précédente, les clients peuvent accéder au serveur OpenVPN, mais ils ne peuvent pas accéder au reste du réseau sur lequel est connecté le serveur OpenVPN.</p>

<p class="spip">Pour permettre aux clients d’accéder au reste du réseau, il faut effectuer deux opérations :</p>

<h3>1 - Autoriser le serveur Linux à transmettre les paquets au reste du réseau </h3>
<p class="spip">Pour cela, il faut activer le forwarding avec la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># echo 1 > /proc/sys/net/ipv4/ip_forward</code></p>

<p class="spip">La commande suivante, permet de vérifier que le forwarding est bien activé :</p>

<p class="spip"><code class='spip_code' dir='ltr'># cat /proc/sys/net/ipv4/ip_forward</code></p>

<h3>2 - Indiquer aux autres postes du réseau la route vers le serveur OpenVPN</h3>
<p class="spip">Si le serveur VPN est sur l’adresse 192.168.0.1, il faut ajouter une route manuellement sur chaque poste du réseau avec la commande suivante sous Windows :</p>

<p class="spip"><code class='spip_code' dir='ltr'>C:\>route add 10.8.0.0 mask 255.255.255.0 192.168.0.1</code></p>

<p class="spip">La commande suivante, permet d’avoir la liste des routes :</p>

<p class="spip"><code class='spip_code' dir='ltr'>C:\>route print</code></p>

<p class="spip">La commande suivante permet de supprimer une route :</p>

<p class="spip"><code class='spip_code' dir='ltr'>C:\>route delete 10.8.0.0 mask 255.255.255.0 192.168.0.1</code></p>

<p class="spip">Pour ajouter une route sous Linux, il faut utiliser la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.0.1                   </code></p>

<p class="spip">La commande suivante, permet d’avoir la liste des routes sous Linux :</p>

<p class="spip"><code class='spip_code' dir='ltr'># route </code></p>

<p class="spip">La commande suivante permet de supprimer une route sous Linux :</p>

<p class="spip"><code class='spip_code' dir='ltr'># route delete -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.0.1                   </code></p>

<p class="spip"><strong class="spip">Remarque</strong> : Pour éviter de devoir ajouter manuellement sur chaque poste du réseau une route, si c’est possible, il faut ajouter une route statique au niveau de la passerelle ou du routeur du réseau.</p>

<h2>Accéder aux autres postes connectés derrière un client VPN</h2>
<p class="spip">Avec la configuration précédente, le serveur OpenVPN peux accéder à l’adresse virtuelle du client, mais il ne peux pas accéder à l’adresse réelle et encore moins aux autres postes connectés derrière le client VPN.</p>

<p class="spip">Pour permettre au serveur d’accéder aux autres postes connectés derrière un client VPN, il faut ajouter des routes dans la configuration d’OpenVPN :</p>

<p class="spip">Dans le fichier de configuration du serveur OpenVPN, il faut ajouter ces lignes :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>client-config-dir ccd<br />
route 192.168.0.0 255.255.255.0</code></div>
<p class="spip">La première ligne permet d’indiquer le sous-dossier de /etc/openvpn qui contiendra la configuration spécifique de chaque client (Remarque : Il faut penser à créer ce dossier manuellement).</p>

<p class="spip">La deuxième ligne permet d’ajouter la configuration du réseau d’un client.</p>

<p class="spip">Ensuite, il faut créer un fichier dans le dossier « /etc/openvpn/ccd » ayant le même nom que le certificat du client (ex :  Client01) contrant la ligne suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'>iroute 192.168.0.0 255.255.255.0</code></p>

<p class="spip">Cette ligne permet d’indiquer le client connecté à ce réseau.</p>

<p class="spip">Pour finir, il faut redémarrer le serveur et le client pour que les routes soient correctement prises en compte.</p>

<p class="spip">A partir de ce moment, le serveur doit pouvoir accéder à tous les postes connectés au client VPN.</p>

<h2>Révocation d’un certificat client </h2>
<p class="spip">Si le certificat d’un client à été volé au si ce dernier n’est plus nécessaire, il est important de le révoquer pour qu’il ne puisse plus être utilisé.</p>

<p class="spip">Pour révoquer un certificat, il faut disposer de celui-ci. Normalement, le dossier « <strong class="spip">/usr/share/doc/openvpn/examples/easy-rsa/keys</strong> » contient tous les certificats créés.</p>

<p class="spip">La commande suivante permet de révoquer un certificat :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># cd /usr/share/doc/openvpn/examples/easy-rsa/<br />
# . ./vars<br />
# ./revoke-crt Client01.crt<br />
Using configuration from /usr/share/doc/openvpn/examples/easy-sa/openssl.cnf<br />
DEBUG[load_index]: unique_subject = "yes"<br />
Revoking Certificate 16.<br />
Data Base Updated</code></div>
<p class="spip">Cette commande permet également de révoquer un certificat et vérifie ensuite que cette révocation est effective :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># ./revoke-full Client01<br />
Using configuration from /usr/share/doc/openvpn/examples/easy-<br />
sa/openssl.cnf<br />
DEBUG[load_index]: unique_subject = "yes"<br />
Revoking Certificate 17.<br />
Data Base Updated<br />
Using configuration from /usr/share/doc/openvpn/examples/easy-sa/openssl.cnf<br />
DEBUG[load_index]: unique_subject = "yes"<br />
Client01.crt: /<br />
=FR/ST=France/O=Mondomaine/CN=Client01/emailAddress=tony@domaine.com<br />
error 23 at 0 depth lookup:certificate revoked</code></div>
<p class="spip"><strong class="spip">Remarque</strong> : Avec ce script, il ne faut pas mettre l’extension « <strong class="spip">.crt</strong> » du certificat.</p>

<p class="spip">A chaque révocation de certificat son numéro est ajouté dans le fichier « <strong class="spip">keys/crl.pem</strong> ». Ce fichier contient donc la liste des certificats révoqués. Après chaque révocation de certificat, il faut donc copier ce fichier dans « <strong class="spip">/etc/openvpn</strong> »</p>

<p class="spip">La commande suivante, permet de consulter la liste des certificats révoqués :</p>

<p class="spip"><code class='spip_code' dir='ltr'># openssl crl -in keys/crl.pem -text</code></p>

<p class="spip">Il faut également ajouter cette ligne dans « <strong class="spip">etc/openvpn/server.conf</strong> » du serveur OpenVPN :</p>

<p class="spip"><code class='spip_code' dir='ltr'>crl-verify crl.pem</code></p>

<p class="spip">Pour information, le fichier « <strong class="spip">keys/index.txt</strong> » contient la liste des certificats créés et révoqués</p>

<p class="spip">Pour finir et pour information, lors de la création d’un client, les fichiers suivants sont créés ou modifiés dans « <strong class="spip">keys/crl.pem</strong> » :</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Fichier</strong></th><th scope='col'><strong class="spip">Description</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>01.pem</td><td>Les deux premiers caractères de fichier correspond au numéro d’ordre sous forme hexadécimal du  certificat (01=Le premier certificat créé, 0A=Le dixième créé)</td></tr>
<tr class="row_odd"><td>serial</td><td>Contient le numéro du prochain certificat à créer</td></tr>
<tr class="row_even"><td>LaCle.crt</td><td>Certificat = Clé public du client signée par le certificat du serveur.Le certificat permet de s’authentifier sur le serveur.</td></tr>
<tr class="row_odd"><td>LaCle.csr  </td><td>Fichier temporaire utilisé pour la création du certificat. Ce fichier permet de générer des certificats (c’est une demande de certification ne nécessitant pas la clé privée)</td></tr>
<tr class="row_even"><td>LaCle.key</td><td>Clé privée du client. La clé permet de déchiffrer les données en provenance du serveur</td></tr>
<tr class="row_odd"><td>index.txt</td><td>Contient la liste des clés créées et révoquées</td></tr>
<tr class="row_even"><td>crl.pem</td><td>Contient la liste des certificats révoqués.</td></tr>
</tbody>
</table>
<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>09/12/05</td><td>Création par <a href="http://www.infosaone.com/" class="spip_out">Tony GALMICHE</a></td></tr>
<tr class="row_odd"><td>0.2</td><td>23/03/06</td><td>Mise à jour pour publication</td></tr>
<tr class="row_even"><td>0.3</td><td>28/08/06</td><td>Ajout « Accéder aux autres postes connectés derrière un client VPN »</td></tr>
<tr class="row_odd"><td>0.4</td><td>31/01/07</td><td>Ajout « Révocation d’un certificat client »</td></tr>
<tr class="row_even"><td>0.5</td><td>18/12/08</td><td>Installation sur un nouveau serveur sous Debian ETCH</td></tr>
</tbody>
</table>