Mise en place d'un VPN avec OpenVPN 2.3 et Easy-RSA 3
Publié : 04 août 2021, 07:15
Introduction
Petit rappel de ce qu'est un VPN est à quoi il sert. A l'origine, un VPN est ce qui permet de relier deux sous-réseaux distants de telle manière qu'ils se voient appartenir au même réseau. Cela permet d'établir un tunnel sécurisé entre ces deux réseaux, à travers un médium non sûr (tel qu'Internet).
Ce type de tunnel est de point-à-point. C'est à dire qu'il va s'établir entre uniquement deux point de terminaison (principe de L2TP ou PPTP). Si l'on veut relier plus de deux points, il faut établir une architecture de type one-to-many, ou chaque point sera relié par un tunnel à chacun des autres. Ou, on peut établir une architecture en étoile, où un point sera connecté à tous les autres, et, pour communiquer, les points seront obligés de passer par le point central. C'est ce type d'architecture qu'utilise OpenVPN.
OpenVPN est basé sur TLS/SSL pour sa sécurisation. Pour établir un système, il nous faut :
Une autorité de certification (totalement lié à SSL)
Un serveur (centre de l'étoile)
Un (ou plusieurs) clients.
L'autorité de certification
Pour des raisons pratiques, l'autorité de certification (CA) sera établie sur le serveur.
Comme dit plus haut, désormais, Easy-RSA n'est plus fourni en bundle avec OpenVPN, il doit être récupéré depuis un dépôt Git.
Editez le fichier vars fraîchement copié en décommentant et customisant ces paramètres :
Initialisez le PKI et construisez le CA.
Cela génèrera entre autre le fichier pki/ca.crt.
Ensuite, il y a deux méthodes. La méthode feignant et la méthode classique.
La méthode classique
Pour faire propre, créer des certificats doit se faire en plusieurs étapes, et n'ont pas besoin d'être toutes effectuées sur le serveur qui héberge le CA.
Sur le serveur, installez également easy-rsa3, puis initialisez le pki. Générez ensuite une requête de certificat et une paire de clés.
Utilisez l'option nopass pour ne pas être prompté pour une passphrase (option recommandée pour le serveur, mais déconseillée pour les clients).
Faite de même sur chacun des clients :
Transférez ensuite chacuns des fichiers .req (générés dans pki/reqs/) sur le serveur CA.
Sur le CA, importez ces demandes.
Puis, s'il s'agit d'un .req serveur, signez la demande avec :
S'il s'agit d'un client :
La méthode feignant
Dans cette méthode on va générer et automatiquement signer les certificats clients et serveur. Et cela se fait très facilement.
Créer un certificat serveur :
Cela va générer les fichiers :
pki/private/nom-du-server.key
pki/issued/nom-du-server.crt
pki/reqs/nom-du-server.req
Créer un certificat client :
Cela va générer les fichiers :
pki/private/nom-du-client.key
pki/issued/nom-du-client.crt
pki/reqs/nom-du-client.req
Sur le serveur
Transférez sur le serveur les fichiers :
pki/private/nom-du-server.key
pki/issued/nom-du-server.crt
pki/reqs/nom-du-server.req
Et placez-les dans /etc/openvpn/.
Retournez dans votre dossier easy-rsa et générez les paramètres Diffie-Hellman :
Cela produira le fichier pki/dh.pem, que vous placerez également dans /etc/openvpn.
Créer le fichier de configuration serveur
Copiez le fichier example de configuration serveur dans /etc :
Vous allez paramétrer quelques options :
port : Numéro du port sur lequel écoutera OpenVPN
ca : Indiquez ici le nom du certificat du CA (ca.crt)
cert : Le certificat serveur (server.crt)
key : La clé privée du serveur (server.key)
dh : Le nom du fichier des paramètres Diffie-Hellman (dh.pem)
push "redirect-gateway def1 bypass-dhcp" : Décommenter pour que les clients utilisent le serveur VPN en tant que passerelle par défaut
push "dhcp-option DNS 208.67.222.222" et push "dhcp-option DNS 208.67.220.220" : Pour la configuration DNS si vous utilisez l'option précédente
client-to-client : A ajouter si vous vouslez autoriser vos clients à communiquer entre eux.
Si vous voulez que vos clients utilisent Internet par le serveur, activez la redirection sur le serveur :
Le rendre permanent : editez le fichier /etc/sysctl.conf
Puis, si eth0 est votre interface pour communiquer sur internet :
Activez la configuration que vous venez d'écrire :
Démarrez ensuite le serveur VPN.
Vérifiez que tout se passe bien dans /var/log/syslog
Sur le client
Transférez sur les clients les fichiers (en supposant que le shortname ait été "client1") :
ca.crt
client1.key
client1.crt
Et placez-les dans /etc/openvpn/.
Créer le fichier de configuration client
Copiez le fichier example de configuration serveur dans /etc :
Vous allez paramétrer quelques options :
remote : Adresse du serveur OpenVPN suivi d'un espace, puis son port (remote my-server-1 1194)
ca : Indiquez ici le nom du certificat du CA (ca.crt)
cert : Le certificat client (client1.crt)
key : La clé privée du client (client1.key)
Démarrez OpenVPN :
Vérifiez que tout est bon dans les logs (/var/log/syslog), que vous avez votre interface tun-0 up :
Enfin, vérifiez que vous pouvez pinguer votre serveur :
Petit rappel de ce qu'est un VPN est à quoi il sert. A l'origine, un VPN est ce qui permet de relier deux sous-réseaux distants de telle manière qu'ils se voient appartenir au même réseau. Cela permet d'établir un tunnel sécurisé entre ces deux réseaux, à travers un médium non sûr (tel qu'Internet).
Ce type de tunnel est de point-à-point. C'est à dire qu'il va s'établir entre uniquement deux point de terminaison (principe de L2TP ou PPTP). Si l'on veut relier plus de deux points, il faut établir une architecture de type one-to-many, ou chaque point sera relié par un tunnel à chacun des autres. Ou, on peut établir une architecture en étoile, où un point sera connecté à tous les autres, et, pour communiquer, les points seront obligés de passer par le point central. C'est ce type d'architecture qu'utilise OpenVPN.
OpenVPN est basé sur TLS/SSL pour sa sécurisation. Pour établir un système, il nous faut :
Une autorité de certification (totalement lié à SSL)
Un serveur (centre de l'étoile)
Un (ou plusieurs) clients.
L'autorité de certification
Pour des raisons pratiques, l'autorité de certification (CA) sera établie sur le serveur.
Comme dit plus haut, désormais, Easy-RSA n'est plus fourni en bundle avec OpenVPN, il doit être récupéré depuis un dépôt Git.
Code : Tout sélectionner
mkdir -p /root/openvpn
cd /root/openvpn
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
cp vars.example varsCode : Tout sélectionner
set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "California"
set_var EASYRSA_REQ_CITY "San Francisco"
set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
set_var EASYRSA_REQ_EMAIL "me@example.net"
set_var EASYRSA_REQ_OU "My Organizational Unit"Code : Tout sélectionner
./easyrsa init-pki
./easyrsa build-caEnsuite, il y a deux méthodes. La méthode feignant et la méthode classique.
La méthode classique
Pour faire propre, créer des certificats doit se faire en plusieurs étapes, et n'ont pas besoin d'être toutes effectuées sur le serveur qui héberge le CA.
Sur le serveur, installez également easy-rsa3, puis initialisez le pki. Générez ensuite une requête de certificat et une paire de clés.
Code : Tout sélectionner
./easyrsa init-pki
./easyrsa gen-req <nom-du-server> [nopass]Faite de même sur chacun des clients :
Code : Tout sélectionner
./easyrsa init-pki
./easyrsa gen-req <nom-du-client> [nopass]Sur le CA, importez ces demandes.
Code : Tout sélectionner
./easyrsa import-req /chemin/vers/la.req SHORTNAME-UNIQUECode : Tout sélectionner
./easyrsa sign server SHORTNAME-UNIQUECode : Tout sélectionner
./easyrsa sign client SHORTNAME-UNIQUEDans cette méthode on va générer et automatiquement signer les certificats clients et serveur. Et cela se fait très facilement.
Créer un certificat serveur :
Code : Tout sélectionner
./easyrsa build-server-full <nom-du-serveur> [nopass]pki/private/nom-du-server.key
pki/issued/nom-du-server.crt
pki/reqs/nom-du-server.req
Créer un certificat client :
Code : Tout sélectionner
./easyrsa build-client-full <nom-du-client> [nopass]pki/private/nom-du-client.key
pki/issued/nom-du-client.crt
pki/reqs/nom-du-client.req
Sur le serveur
Transférez sur le serveur les fichiers :
pki/private/nom-du-server.key
pki/issued/nom-du-server.crt
pki/reqs/nom-du-server.req
Et placez-les dans /etc/openvpn/.
Retournez dans votre dossier easy-rsa et générez les paramètres Diffie-Hellman :
Code : Tout sélectionner
./easyrsa gen-dhCréer le fichier de configuration serveur
Copiez le fichier example de configuration serveur dans /etc :
Code : Tout sélectionner
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip /etc/openvpn/server.conf.gzport : Numéro du port sur lequel écoutera OpenVPN
ca : Indiquez ici le nom du certificat du CA (ca.crt)
cert : Le certificat serveur (server.crt)
key : La clé privée du serveur (server.key)
dh : Le nom du fichier des paramètres Diffie-Hellman (dh.pem)
push "redirect-gateway def1 bypass-dhcp" : Décommenter pour que les clients utilisent le serveur VPN en tant que passerelle par défaut
push "dhcp-option DNS 208.67.222.222" et push "dhcp-option DNS 208.67.220.220" : Pour la configuration DNS si vous utilisez l'option précédente
client-to-client : A ajouter si vous vouslez autoriser vos clients à communiquer entre eux.
Si vous voulez que vos clients utilisent Internet par le serveur, activez la redirection sur le serveur :
Code : Tout sélectionner
echo 1 > /proc/sys/net/ipv4/ip_forwardCode : Tout sélectionner
net.ipv4.ip_forward = 1Code : Tout sélectionner
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADECode : Tout sélectionner
systemctl enable openvpn@nom-du-serveur.serviceCode : Tout sélectionner
systemctl start openvpnSur le client
Transférez sur les clients les fichiers (en supposant que le shortname ait été "client1") :
ca.crt
client1.key
client1.crt
Et placez-les dans /etc/openvpn/.
Créer le fichier de configuration client
Copiez le fichier example de configuration serveur dans /etc :
Code : Tout sélectionner
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/remote : Adresse du serveur OpenVPN suivi d'un espace, puis son port (remote my-server-1 1194)
ca : Indiquez ici le nom du certificat du CA (ca.crt)
cert : Le certificat client (client1.crt)
key : La clé privée du client (client1.key)
Démarrez OpenVPN :
Code : Tout sélectionner
service openvpn start
Code : Tout sélectionner
ifconfig -aCode : Tout sélectionner
root@ns3342330:~/easy-rsa/easyrsa3# ping -c 1 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=0.039 ms
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.039/0.039/0.039/0.000 ms