OpenVPN

De DokuWikiExperience.

OpenVPN permet de créer un VPN rapide au moyens de SSL et des certificats. Nous verrons l'installation d'un serveur OpenVPN sous GNU/Linux et de clients sous Windows ainsi que GNU/Linux.


Sommaire

Installations du serveur

apt-get install openvpn

Génération des certificats

La phase la plus compliqué dans OpenVPN est la génération des certificats (une notion sur les certificats est un plus).

Pour bien comprendre l'utilité ainsi que le fonctionnement voici une petite explication :

Les pré-requis sont le Root CA ainsi que les clefs publique / privée du serveur et de ses clients. Le serveurs possède la clef publique du Root CA, sa propre clef privée / publique.

Les clients possèdent eux aussi la clef publique du Root CA et leurs propre clefs privée / publique (tout comme le serveur). La génération de ses clefs est effectué par le serveur (dans les règles de l'art chaque client génère sont propre certificat) possédant la clef privée du Root CA. c'est ce serveur qui 'signe' toute les clefs.

Création des clefs

On commence par copier les outils easy-rsa fournis avec openvpn, ce qui va nous faciliter la vie.

cd /etc/openvpn
# easy-rsa est copier à partir d'une debian lenny le chemin peux changer suivant le distribution
cp -R /usr/share/doc/openvpn/examples/easy-rsa .
cd easy-rsa/2.0

Si vous êtes "paranoïaque" ou que vous aimez pas trop <troll>hadopi</troll> changeons la taille de la clef :

sed -i 's/1024/2048/' vars
. ./vars

On initialise l'arbo et les fichiers de serial / index

./clean-all

La première étape est de créer le certificat root (certificat racine). Il faut faire très attention à ce qu'on rentre car il va être nécessaire d'entrer les mêmes informations (hors hostname) pour les certificats clients.

./build-ca 
Generating a 2048 bit RSA private key
........................+++
...........................................................................................................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:FR
State or Province Name (full name) [CA]:IDF
Locality Name (eg, city) [SanFrancisco]:Paris
Organization Name (eg, company) [Fort-Funston]:ismaya
Organizational Unit Name (eg, section) []:vpnteam
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:vpn.ismaya.fr
Email Address [me@myhost.mydomain]:vpn _@_ismaya point fr

Nous voici avec le certificat racine, il faut maintenant construire les certificats (serveur et clients).

./build-key-server vpn.ismaya.fr
Generating a 2048 bit RSA private key
...................+++
..............................................+++
writing new private key to 'vpn.ismaya.fr.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:FR
State or Province Name (full name) [CA]:IDF
Locality Name (eg, city) [SanFrancisco]:Paris
Organization Name (eg, company) [Fort-Funston]:ismaya
Organizational Unit Name (eg, section) []:vpnteam
Common Name (eg, your name or your server's hostname) [vpn.ismaya.fr]:
Email Address [me@myhost.mydomain]:vpn _@_ ismaya point fr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'FR'
stateOrProvinceName   :PRINTABLE:'IDF'
localityName          :PRINTABLE:'Paris'
organizationName      :PRINTABLE:'ismaya'
organizationalUnitName:PRINTABLE:'vpnteam'
commonName            :PRINTABLE:'vpn.ismaya.fr'
emailAddress          :IA5STRING:'vpn@ismaya.fr'
Certificate is to be certified until May 10 19:01:29 2019 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Je déconseille de définir un mot de passe pour le certificat serveur car cela veux dire qu'a chaque démarrage d'openVPN il faut fournir le mot de passe. Nous venons de signer avec le RootCA le certificat du serveur. Il faut faire de même avec les certificats client.

./build-key test.ismaya.fr
Generating a 2048 bit RSA private key
......................................................................................................................+++
..................................................................................+++
writing new private key to 'test.ismaya.fr.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:FR
State or Province Name (full name) [CA]:IDF
Locality Name (eg, city) [SanFrancisco]:Paris
Organization Name (eg, company) [Fort-Funston]:ismaya
Organizational Unit Name (eg, section) []:vpnteam
Common Name (eg, your name or your server's hostname) [test.ismaya.fr]:
Email Address [me@myhost.mydomain]:test@ismaya.fr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /tmp/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'FR'
stateOrProvinceName   :PRINTABLE:'IDF'
localityName          :PRINTABLE:'Paris'
organizationName      :PRINTABLE:'ismaya'
organizationalUnitName:PRINTABLE:'vpnteam'
commonName            :PRINTABLE:'test.ismaya.fr'
emailAddress          :IA5STRING:'test@ismaya.fr'
Certificate is to be certified until May 10 19:05:44 2019 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Ici un mot de passe n'est pas superflu ;) Répeter l'opération pour chaque certificat clients

Création de la clef Diffie-Helman

La clef DH (diffie-helman voir liens) est la clef permettant l'échange des données car le chiffrement est dit comme rapide car symétrique (à la différence des certificats) Continuons donc notre lancer sur le 2048, créons donc cette clef (oui c'est long voir très)

./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time


Création des clefs

./build-key <hostname>

Configuration

Serveur

Notre configuration d'exemple se fait en mode routé (tun) donc L3 et pas bridge (tap) L2. La différence majeurs est le niveau de la couche. Pour faire simple il faut voir le TAP comme un réseau local, alors que le tun ne transmet pas tout ce qui se passe dans le réseau (découverte automatique de service, broadcast, multicast, ...). Le cas pratique est le jeu en réseau ou la découverte automatique ne fonctionne pas en tun alors que tap oui.

routage

Nous voici connecté avec le concentrateur (serveur) et le client,

client ---------> concentrateur

Ceci conviens dans la majorité des cas. Mais plusieurs réseau peuvent être hébergé aussi bien sur le client que sur le concentrateur.

concentrateur

Le concentrateur VPN possède des réseau (typique dans une societé). Pour cela il faut PUSHER des routes sur le client. La solution la plus simple est de pusher la route par défaut via un :

push "redirect-gateway"

Si nous voulons faire du spécifique il faut ajouter manuellement chaque route (essayer de grouper).

push "route monsubnet netmask"

par exemple nous allons pusher le réseau 10.42.42.0/24 il faut faire :

push "route 10.42.42.0 255.255.255.0"
   (client)<-----------------> (concentrateur)
  192.168.1.10                  192.168.1.1
                                     |
                                     -> 10.42.42.0/24

et c'est tout.

client

Un peu plus éxotique, il faut utiliser les iroute


Il faut identifier sur quel client il y a les routes, openvpn utilise le common name (CN) du certificat pour ne pas avoir d'ambiguité. Pour préparer le futur nous allons activer la directive client-config-dir ccd.

dans la config du serveur nous activons le config dir

client-config-dir ccd
route 192.168.2.0 255.255.255.0
mkdir ccd && cd ccd
echo 'iroute 192.168.2.0 255.255.255.0' >> ccd/client

un reload et c'est bon. Un petit tour dans les logs pour vérifier :

MULTI: internal route 192.168.2.0/24 -> client/IP:PORT
MULTI: Learn: 192.168.2.0/24 -> client/IP:PORT

Voila openvpn a connaissance des routes ainsi que le système.

   (client)<-----------------> (concentrateur)
  192.168.1.10                  192.168.1.1
      |
      -> 192.168.2.0/24

Clients

GNU/Linux

On commence tout d'abord par copier l'exemple de configuration fournis :

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/


Windows

Liens

Outils personnels