====== 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 :
{{ :wiki:service_vpn_openvpn_schema_reseau.jpg?750 | }}
====== 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
# 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
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 : [[http://wiki.bruno-tatu.com/doku.php?id=wiki:se_connecter_client_openvpn|Se connecter à un VPN avec le client OpenVPN]]