OpenVPN
Updated 7 Février 2023
OpenVPN est une implémentation libre de la technologie de réseau privé virtuel (VPN) qui vise à créer des canaux chiffrés point à point ou serveur à client entre hôtes. Il permet d'établir des connexions entre des ordinateurs protégés par le NAT et le pare-feu, sans pour autant modifier leurs paramètres.
Important
A noter que, pour un fonctionnement correct, l'heure doit être la même sur tous les ordinateurs.
Créer des certificats PKI pour OpenVPN
Installation et configuration du paquet
Installez le logiciel nécessaire :
emerge easy-rsa
Une fois le paquet installé, le répertoire /usr/share/easy-rsa sera créé, contenant le script easyrsa
permettant de gérer les certificats. Les clés et les certificats y seront enregistrés également. Déplacez-le dans /var/calculate/easy-rsa et rendez-vous ensuite dans ce répertoire pour continuer :
cp -a /usr/share/easy-rsa /var/calculate
cd /var/calculate/easy-rsa
arborescence
. ├── easyrsa ├── openssl-1.0.cnf ├── vars.example └── x509-types ├── ca ├── client ├── COMMON └── server 1 directory, 7 files
Configurez le certificat. Commencez par faire une copie du fichier modèle :
cp vars.example vars
Modifier si besoin est :
vars
set_var EASYRSA_REQ_COUNTRY "GB" set_var EASYRSA_REQ_CITY "London" set_var EASYRSA_REQ_ORG "My Company" set_var EASYRSA_REQ_EMAIL "my@domain.org" ...
Créer une arborescence de certificats :
Note : en utilisant la configuration Easy-RSA à partir de : ./vars init-pki complet; vous pouvez maintenant créer une CA ou des requêtes. Votre répertoire PKI nouvellement créé est: /var/calculate/easy-rsa/pk
Une fois terminé, le répertoire /var/calculate/easy-rsa/pki sera créé pour stocker les clés et les certificats.
arborescence
. ├── easyrsa ├── openssl-1.0.cnf ├── pki │ ├── private │ └── reqs ├── vars ├── vars.example └── x509-types ├── ca ├── client ├── COMMON └── server 4 directories, 8 files
Certificat racine
Créez un certificat racine. Saisissez votre mot de passe à deux reprises et indiquez le nom du certificat :
Note: using Easy-RSA configuration from: /var/calculate/easy-rsa/vars Generating a 2048 bit RSA private key ....................................................+++ ......................................................................................................+++ writing new private key to '/var/calculate/easy-rsa/pki/private/ca.key.w3cG6vF0cv' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]:domain.org CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /var/calculate/easy-rsa/pki/ca.crt
Remplacez domain.org par un nom de certificat de votre choix ou indiquez votre domaine.
arborescence pki
pki ├── ca.crt ├── certs_by_serial ├── index.txt ├── issued ├── private │ └── ca.key ├── reqs └── serial 4 directories, 4 files
Auront donc été créés :
- ./pki/ca.crt , certificat d'autorité de certification racine
- ./pki/private/ca.key , clé privée de l'autorité de certification racine (c'est le fichier le plus important)
Certificat serveur
Créez un certificat pour le serveur OpenVPN. Pour ce faire :
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
.......+++
.......................+++
writing new private key to '/var/calculate/easy-rsa/pki/private/server.key.mfeee1imNK'
-----
Using configuration from /var/calculate/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /var/calculate/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Feb 20 20:00:53 2028 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
Vous serez invité à saisir le mot de passe du certificat racine. Remplacez server par votre certificat serveur. Par défaut, un certificat est valable 10 ans.
Une fois le script terminé, les fichiers suivants sont créés :
- ./pki/issued/server.crt qui est un certificat de serveur,
- ./pki/private/server.key qui est la clé privée du serveur.
Certificat client
Créez un certificat client, pareil au certificat OpenVPN du serveur. Pour ce faire :
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
..................................................+++
................................................................................+++
writing new private key to '/var/calculate/easy-rsa/pki/private/client.key.qfTovtcVDo'
-----
Using configuration from /var/calculate/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /var/calculate/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client'
Certificate is to be certified until Feb 20 20:34:40 2028 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
Vous serez invité à saisir le mot de passe du certificat racine. Remplacez client par votre certificat client. Par défaut, ce certificat est également valable 10 ans.
Une fois le script terminé, les fichiers suivants sont créés :
- ./pki/issued/client.crt est le certificat client
- ./pki/private/client.key est la clé privée
Clé Diffie-Hellman
Pour créer une clé Diffie-Hellman, exécutez :
Note: using Easy-RSA configuration from: ./vars Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ... DH parameters of size 2048 created at /var/calculate/easy-rsa/pki/dh.pem
Un fichier contenant la clé ./pki/dh.pem sera créé.
Une clé secrète supplémentaire
Créez une clé supplémentaire pour une meilleure protection :
openvpn --genkey --secret pki/ta.key
Un fichier contenant la clé ./pki/ta.key sera créé.
Configuration serveur
Installation
Commencez par installer OpenVPN :
emerge openvpn
Obtenir les clés et les certificats
Créez un répertoire dans lequel les certificats seront enregistrés :
mkdir /etc/openvpn/keys
Copiez les clés et les certificats PKI que vous avez créés. Si le serveur OpenVPN est sur le même ordinateur, exécutez la commande suivante :
cp /var/calculate/easy-rsa/pki/ca.crt /etc/openvpn/keys/
cp /var/calculate/easy-rsa/pki/dh.pem /etc/openvpn/keys/
cp /var/calculate/easy-rsa/pki/issued/server.crt /etc/openvpn/keys/
cp /var/calculate/easy-rsa/pki/private/server.key /etc/openvpn/keys/
cp /var/calculate/easy-rsa/pki/ta.key /etc/openvpn/keys/
Configuration serveur
Modifiez le fichier de configuration OpenVPN comme indiqué ci-dessous :
/etc/openvpn/openvpn.conf
# port, protocol, device, compression method port 1194 proto udp dev tun allow-compression no # keys and certificates ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh.pem tls-auth keys/ta.key 0 # allocated IP range, default route, DNS server 192.168.10.0 255.255.255.0 # network topology topology subnet push "redirect-gateway def1" push "dhcp-option DNS 8.8.8.8" # restart tunnel if necessary keepalive 10 120 # openvpn privileges user openvpn group openvpn # keep device and key files unchanged when restarting the tunnel persist-tun persist-key # info on current connections status /var/log/openvpn-status.log
En utilisant +redirect-gateway, les clients OpenVPN enverront des requêtes DNS via le VPN. Le serveur VPN doit donc savoir comment les traiter. Pour ce faire, l'adresse du serveur DNS est transmise aux clients qui se connectent, remplaçant ainsi leurs paramètres DNS habituels tant que le VPN reste actif. Dans l'exemple ci-dessus, cette opération est gérée par push "dhcp-option DNS 8.8.8.8", où 8.8.8.8 est l'adresse DNS de Google.
Important
Beaucoup d'hôtes connectés à l'internet via un client OpenVPN interagissent régulièrement avec le serveur DHCP pour reprendre leur bail IP. L'option redirect-gateway peut empêcher le client de contacter le serveur DHCP local (car les messages DHCP seront acheminés via le VPN), entraînant la perte du bail.
Redémarrez le serveur et ajoutez-le à la liste de démarrage automatique :
/etc/init.d/openvpn start
rc-update add openvpn
Configuration des transferts
Activez le transfert de paquets entre les interfaces réseau :
/etc/sysctl.conf
net.ipv4.ip_forward = 1
Validez :
sysctl -p /etc/sysctl.conf
Transférer redirect-gateway au client forcera tout le flux généré par la machine client à passer par le serveur OpenVPN. Le serveur doit être configuré pour gérer ce flux, par exemple pour le transférer via un NAT. Pour diriger les flux de données du client via NAT, exécutez la commande suivante :
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
Remplacez eth0 par l'interface réseau locale du serveur.
Enregistrez les règles de routage et ajoutez-les à la liste de démarrage automatique :
/etc/init.d/iptables save
rc-update add iptables
Configuration client
Installation
Installez un client OpenVPN :
emerge openvpn
Obtenir les clés et les certificats
Créez un répertoire dans lequel les certificats seront enregistrés :
mkdir /etc/openvpn/keys
Copiez les clés et les certificats PKI que vous avez créés. Si le serveur OpenVPN est installé sur l'hôte où les clés ont été créées, exécutez ceci :
cp /var/calculate/easy-rsa/pki/ca.crt /etc/openvpn/keys/
cp /var/calculate/easy-rsa/pki/issued/client.crt /etc/openvpn/keys/
cp /var/calculate/easy-rsa/pki/private/client.key /etc/openvpn/keys/
cp /var/calculate/easy-rsa/pki/ta.key /etc/openvpn/keys/
Configuration client
Modifiez le fichier de configuration client, comme montré ci-dessous :
/etc/openvpn/openvpn.conf
client
# protocol, device, compression method
proto udp
dev tun
allow-compression no
# remote server, port
remote vpn.domain.org 1194
# keep device and key files unchanged when restarting the tunnel
persist-tun
persist-key
remote-cert-tls server
# keys and certificates
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
tls-auth keys/ta.key 1
# log
status /var/log/openvpn-status.log
Remplacez vpn.domain.org
par le nom de réseau de votre serveur VPN.
Configuration client via un profil OVPN
Récupérer un fichier profil
Pour connecter certains clients OpenVPN, il est possible que vous deviez utiliser un profil de configuration. C'est mieux d'ailleurs, car vous ne devez plus saisir ni transférer des certificats et des clés. Il suffit de créer un fichier ovpn contenant votre profil de configuration.
Ce fichier est organisé de la manière suivante
client.ovpn
client
proto udp
dev tun
allow-compression no
remote vpn.domain.org 1194
persist-tun
persist-key
key-direction 1
remote-cert-tls server
Remplacez vpn.domain.org
par le nom de réseau de votre serveur VPN ou son adresse IP.
Déplacez ensuite tous les certificats et clés nécessaires dans le fichier profil. Mettez des balises autour :
echo '<ca>' >> client.ovpn cat /var/calculate/easy-rsa/pki/ca.crt >> client.ovpn echo '</ca>' >> client.ovpn echo '<cert>' >> client.ovpn cat /var/calculate/easy-rsa/pki/issued/client.crt >> client.ovpn echo '</cert>' >> client.ovpn echo '<key>' >> client.ovpn cat /var/calculate/easy-rsa/pki/private/client.key >> client.ovpn echo '</key>' >> client.ovpn echo '<tls-auth>' >> client.ovpn cat /var/calculate/easy-rsa/pki/ta.key >> client.ovpn echo '</tls-auth>' >> client.ovpn
Installer et configurer le client
Il existe plusieurs clients OpenVPN pour Android. Les plus populaires sont [OpenVPN pour Android] (https://play.google.com/store/apps/details?id=de.blinkt.openvpn), [OpenVPN Connect] (https://play.google.com/store/apps/details?id=net.openvpn.openvpn) et OpenVPN Settings. Le dernier de la liste requiert les droits d'accès root.
Pour connecter un client OpenVPN Android, téléchargez votre fichier profil sur votre appareil mobile (avec Google Drive ou n'importe quel autre service similaire). Ouvrez ensuite votre client OpenVPN et sélectionnez OVPN Profile :