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 :
Sur le serveur, nous avons besoin que de ces deux paquets :
apt-get install openvpn openssl easy-rsa
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
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 |
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
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
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