OpenVPN

Updated 7 Février 2023

OpenVPN

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

Avis d'utilisateurs

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 :

./easyrsa init-pki
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.

Avis d'utilisateurs

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 :

./easyrsa build-ca
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.

Avis d'utilisateurs

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 :

./easyrsa build-server-full server nopass
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 :

./easyrsa build-client-full client nopass
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 :

./easyrsa gen-dh
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 :

OpenVPN Connect