Mettre en place son propre serveur VPN

Comme d'habitude, je n'expliquerais pas en détail le fonctionnement d'un VPN. Dans ce tutoriel nous allons créer une liaison VPN (Virtual Private Network) en mode “Road Warrior”. Il a pour but de créer une zone indépendante du réseau local. Pour se faire, le protocole va créer un réseau virtuel sécurisé dont les communications entre le client et le serveur seront chiffré.

Voici en image l'objectif que l'on souhaite obtenir :

Installation des programmes

Sur le serveur, nous avons besoin que de ces deux paquets :

apt-get install openvpn openssl easy-rsa

Mise en place des certificats (PKI)

On va utiliser les sources du paquet easy-rsa.

cp -R /usr/share/easy-rsa/ /etc/openvpn
cd /etc/openvpn/easy-rsa/

Par la suite, on nous demande de renseigner les informations relative à l'organisation qui va créer ces certificats. Vu que c'est pour un usage personnel, mettons ce que l'on veut.

. ./vars
./clean-all
./build-ca

Après avoir attendu quelques petites secondes, créons la paire de clés :

./build-key-server server
Generating a 2048 bit RSA private key
.+++..............................................................................................................................................................+++
writing new private key to 'server.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) [FR]:
   State or Province Name (full name) [FR]:
   Locality Name (eg, city) [Marseille]:
   Organization Name (eg, company) [France]:
   Organizational Unit Name (eg, section) [PC-Futé]:
   Common Name (eg, your name or your server's hostname) [server]:
   Name [EasyRSA]:
   Email Address [user@domain.com]:
   
   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/openssl-1.0.0.cnf
   Check that the request matches the signature
   Signature ok
   The Subject's Distinguished Name is as follows
   countryName           :PRINTABLE:'FR'
   stateOrProvinceName   :PRINTABLE:'FR'
   localityName          :PRINTABLE:'Marseille'
   organizationName      :PRINTABLE:'France'
   organizationalUnitName:T61STRING:'PC-Fut\0xFFFFFFC3\0xFFFFFFA9'
   commonName            :PRINTABLE:'server'
   name                  :PRINTABLE:'EasyRSA'
   emailAddress          :IA5STRING:'user@domain.com'
   Certificate is to be certified until Jan 31 07:53:22 2026 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

Il n'y a pas besoin de mot de passe dans notre cas et il est nécessaire de s'assurer que l'on réponde par oui (Y) lors des deux dernière questions.

On la clé pour un client :

./build-key client
 
 Generating a 2048 bit RSA private key
 .+++
 ............................................................................................+++
 writing new private key to 'client.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) [FR]:
 State or Province Name (full name) [FR]:
 Locality Name (eg, city) [Marseille]:
 Organization Name (eg, company) [France]:
 Organizational Unit Name (eg, section) [PC-Futé]:
 Common Name (eg, your name or your server's hostname) [client]:
 Name [EasyRSA]:
 Email Address [user@domain.com]:
 
 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/openssl-1.0.0.cnf
 Check that the request matches the signature
 Signature ok
 The Subject's Distinguished Name is as follows
 countryName           :PRINTABLE:'FR'
 stateOrProvinceName   :PRINTABLE:'FR'
 localityName          :PRINTABLE:'Marseille'
 organizationName      :PRINTABLE:'France'
 organizationalUnitName:T61STRING:'PC-Fut\0xFFFFFFC3\0xFFFFFFA9'
 commonName            :PRINTABLE:'client'
 name                  :PRINTABLE:'EasyRSA'
 emailAddress          :IA5STRING:'user@domain.com'
 Certificate is to be certified until Jan 31 08:00:10 2026 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

S'il y a d'autres clients à ajouter :

./build-key client2
Attention! Il faut prévoir à l'avance le nombres exact de clients car après avoir passé cette étape, il n'est plus possible de créer d'autres clés.

Génération du Generate Diffie Hellman parameters :

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

Ainsi, on se retrouve avec ces principaux fichiers :

vdir /etc/openvpn/easy-rsa/keys
Nom Utilisée par: Description Secret
ca.crt Serveur et tous les clients Certificat racine du serveur NON
ca.key Serveur seulement Clef du certificat racine du serveur OUI
dh2048.pem Serveur seulement Paramètres Diffie Hellman NON
client.crt Client1 seulement Certificat du client NON
client.key Client1 seulement Clef du certificat du client OUI
server.crt Serveur seulement Certificat du serveur NON
server.key Serveur seulement Clef du certificat du serveur OUI

Configuration du serveur

Crééons le fichier de configuration du serveur :

 nano /etc/openvpn/server.conf
server.conf
# Port protocole et interface
port 1194
proto udp
dev tun
 
# Chemin vers les fichiers ssl
ca easy-rsa/keys/ca.crt
cert easy-rsa/keys/server.crt
key easy-rsa/keys/server.key
dh easy-rsa/keys/dh2048.pem
 
# Réseau logique qui sera créer par le serveur
server 192.168.2.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
keepalive 10 120
comp-lzo
daemon
user nobody
group nogroup
persist-key
persist-tun
# Pour voir les autres clients :
client-to-client
status /var/log/openvpn-status.log
log /var/log/openvpn.log
verb 3
 
# On définit le serveur VPN comme passerelle par défaut pour les clients.
push "redirect-gateway def1"
#push "route 192.168.2.0 255.255.252.0"
# On définit le serveur VPN comme DNS par défaut
push "dhcp-option DNS 192.168.2.0"

Natter les requêtes envoyé sur le réseau publique :

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Activer le routage pour que le réseau VPN puisse comuniquer avec le réseau local :

echo 1 > /proc/sys/net/ipv4/ip_forward

Pour rendre permanent ce paramètre, il faut éditer le fichier suivant :

nano /etc/sysctl.conf

Et dé-commenter cette ligne :

net.ipv4.ip_forward=1

Enfin pour rendre ce service executable au démarrage du système :

systemctl enable openvpn@server.service

Configuration du client

Créer le fichier de configuration qui va être lu avec le logiciel openvpn téléchargeable à cette adresse : https://openvpn.net/index.php/open-source/downloads.html

Si l'on utilise un client GNU/Linux alors le fichier doit se créer à cette emplacement : /etc/openvpn/

Sinon sur windows c'est dans le dossier de configuration qui se trouve : C:\Program Files\OpenVPN\config

client.ovpn
client
dev tun
proto udp
remote IP-PUBLIQUE-DU-SERVEUR-DISTANT 1194
resolv-retry infinite
block-outside-dns
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 3
pull

Puis copier les fichiers ci-dessous qui ont été crées précédemment dans l'un des répertoires cité ci-dessus.

ca.crt, client.crt et client.key

Lancer la connexion

Depuis le serveur :

# openvpn /etc/openvpn/server.conf
  ...
  ...
  Wed Feb  3 16:14:01 2016 Initialization Sequence Completed

Depuis le client avec une machine fonctionnant sous GNU/LINUX :

# openvpn /etc/openvpn/client.ovpn
  ...
  ...
  Wed May 18 15:47:42 2011 Initialization Sequence Completed

Ou sinon avec une machine cliente qui fonctionne avec Windows. Je conseil donc de suivre ce tutoriel : Se connecter à un VPN avec le client OpenVPN