J'avais déjà mis en place des VPNs avec OpenVPN, il y a quelques années, mais aujourd'hui, la procédure a quelque peu changé lorsque l'on parle d'OpenVPN 2.3.
En effet, à partir de cette version, easy-rsa n'est plus fourni avec OpenVPN, car il a évolué en version 3.
Voyons comment établir un VPN avec OpenVPN.
Note : ce qui suis a été effectué sous Debian Jessie.
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.
mkdir -p /root/openvpn
cd /root/openvpn
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
cp vars.example vars
Editez le fichier vars fraîchement copié en décommentant et customisant ces paramètres :
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"
Initialisez le PKI et construisez le CA.
./easyrsa init-pki
./easyrsa build-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.
./easyrsa init-pki
./easyrsa gen-req <nom-du-server> [nopass]
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 :
./easyrsa init-pki
./easyrsa gen-req <nom-du-client> [nopass]
Transférez ensuite chacuns des fichiers .req (générés dans pki/reqs/) sur le serveur CA.
Sur le CA, importez ces demandes.
./easyrsa import-req /chemin/vers/la.req SHORTNAME-UNIQUE
Puis, s'il s'agit d'un .req serveur, signez la demande avec :
./easyrsa sign server SHORTNAME-UNIQUE
S'il s'agit d'un client :
./easyrsa sign client SHORTNAME-UNIQUE
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 :
./easyrsa build-server-full <nom-du-serveur> [nopass]
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 :
./easyrsa build-client-full <nom-du-client> [nopass]
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 :
./easyrsa gen-dh
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 :
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip /etc/openvpn/server.conf.gz
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 :
echo 1 > /proc/sys/net/ipv4/ip_forward
Le rendre permanent : editez le fichier /etc/sysctl.conf
net.ipv4.ip_forward = 1
Puis, si eth0 est votre interface pour communiquer sur internet :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Activez la configuration que vous venez d'écrire :
systemctl enable openvpn@nom-du-serveur.service
Démarrez ensuite le serveur VPN.
systemctl start openvpn
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 :
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
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 :
service openvpn start
Vérifiez que tout est bon dans les logs (/var/log/syslog), que vous avez votre interface tun-0 up :
ifconfig -a
Enfin, vérifiez que vous pouvez pinguer votre serveur :
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