{{tag>netadmin openvpn vpn}}
====== Mise en place d'une config test openvpn ======
On cherche à connecter un poste client au travers d'un réseau non sécurisé au serveur. Dans cet exemple simple on crée un VPN entre deux VMs appartenant au même réseau.
===== Serveur =====
Ajout temporaire d'une IP sur l'interface loopback
$ sudo ip addr add
Installer les paquets openvpn easy-rsa
$ sudo apt-get install openvpn easy-rsa
===== Configuration du serveur =====
==== Génération des clés ====
easy-rsa contient un ensemble de scripts assistant la génération des certificats racine, serveur et clients.
On commence par mettre a jour le fichier contenant les variables: ''./vars'':
$ cd /user/share/easy-rsa
# Configuration
$ sudo vim vars
...
# sourcer le fichier exportant les variables
source ./vars
# par précaution supprimer les fichiers temporaires
./clean-all
# construire clés et certificat pour le CA ou Autorité de Certification racine
./build-ca
Après validation, les fichiers suivants ont été créés dans le répertoire **./keys**:
* **ca.key**: la clé privée de l'autorité de certification racine.
* **ca.crt**: le certificat de l'autorité de certification racine.
* **index.rxt** la liste des certificats OpenSSL
* **serial** identifiant du dernier certificat émis
Le certificat de l'autorité de certification racine existant, on peut générer les clés et certificats pour le serveur et les clients:
Pour le serveur:
./build-key-server servername
Pour chaque client on générera un clé:
./build-key client-name
Chaque client doit avoir un **Common Name** unique permettant de l'identifier auprès du serveur OpenVPN.
Génération du fichier **dhparam** pour l'échange de clés. Basé sur l'algorithme Diffie-Hellman, la génération peut prendre un certain temps.
./build-dh
Créer le dossier **/etc/openvpn/keys** et y copier:
* Le certificat de l'autorité de certification racine.
* Le certificat serveur.
* La clé privée du serveur.
* Le fichier dh2048.pem.
mkdir /etc/openvpn/keys
cp keys/ca.crt keys/severname.crt keys/servername.key keys/df2048.pem /etc/openvpn/keys
==== Configuration du service ====
Créer le fichier de configuration du serveur **/etc/openvpn/server.conf** avec le contenu suivant:
mode server
proto udp
dev tun
topology subnet
ca keys/ca.crt
cert keys/ovpngw.crt
key keys/ovpngw.key
dh keys/dh2048.pem
server 10.50.0.0 255.255.255.0
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3
A propos des directives du fichier ci-dessus:
* **dev tun** Création d'un tunnel au niveau 3 OSI (encapsulation du protocole au niveau du routage IP).
Pour de l'encapsulation de protocoles de niveau 2 tels que IPX/SPX ou NetBIOS il faudrait créer un device **tap**
* **topology subnet** la topologie par défaut **net30** est inutile ici. Beaucoup plus complexe, **net30** offre de la rétrocompatibilité avec les machines Windows.
* **server 10.50.0.0. 255.255.255.0** cette seule directive aura pour conséquences:
* De passer en mode sécurisé TLS
* De fournir automatiquement la topologie définie plus haut aux clients
* Initialiser automatiquement les paramètres réseau serveur et clients ici les adresses du réseau **10.50.0/24** seront utilisées.
* **keepalive 10 120** renvoi un ping après 10 secondes d'inactivité et relancer la connexion après 120 secondes sans activité.
* **persist-key** pas de renégociation après redémarrage de connexion.
* **persist-tun** pas de fermeture/réouverture du device tun à chaque redémarrage de connexion.
Vérifier que la machine agira bien en passerelle en transmettant les paquets entre ces différentes interfaces. Vérifier la configuration du noyau:
cat /proc/sys/net/ipv4/ip_forward
1
Si la valeur 1 n'est pas retournée, modifier le fichier /etc/sysctl.conf. Confère wiki
Démarrage manuel du serveur:
cd /etc/openvpn
openvpn --config server.conf
Le fonctionnement normal du serveur retournera sur la console:
... Initialization Sequence Completed
===== Client =====
client
dev tun
proto udp
remote 192.168.1.99 1194
nobind
persist-key
persist-tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client-name1.crt
key /etc/openvpn/keys/client-name1.key
comp-lzo
verb 3
Lancement manuel du client de la même façon que coté serveur:
cd /etc/openvpn
openvpn --config client.conf
A ce stade, la connexion est fonctionnelle.
===== Modifications de la configuration minimale =====
Lors de l'établissement de la liaison les logs mettent en avant:
* Que méthode de chiffrement (cipher BF-CBC 128 bits) est relativement faible et peut être améliorée.
* Que l'algorithme d'authentification SHA-1 peut être modifié car considéré peu fiable à ce jour.
* Le warning "No server certificate verification method has been enabled" indique que le client n' a fait qu'une vérification partielle du certificat fournit par le serveur pouvant conduire a une attaque man in the middle. Pour une vérification en profondeur, ajouter la directive **remote-cert-tls server** dans la configuration client.
==== Ajouter les routes ====
Avec la configuration minimale, le tunnel est fonctionnel mais coté client les routes n'ont pas été mises a jour. Pour que le réseau soit accessible au client, il faut déclarer au serveur lesquelles de ses routes on souhaite qu'il mette à jour sur le client pour que celui-ci puisse accéder au sous réseau (directive **push**).
Il est possible de changer le protocole et le port d’écoute du serveur avec les directives **proto** et **port**:
proto tcp
port 26356
Le fichier périphérique de l'interface peut être renommé. Cela peut améliorer la clarté ou facilité la création de règles iptables:
dev vpn
dev-type tun
===== Fichiers de configuration finalisés =====
==== Serveur ====
Sur le serveur le fichier de configuration du service openvpn a maintenant la forme suivante:
# Configuration du serveur openvpn
mode server
proto tcp
port 31100
dev vpn
dev-type tun
topology subnet
ca keys/ca.crt
cert keys/poseidon.crt
key keys/poseidon.key
dh keys/dh2048.pem
# Adresse de réseau à exploiter.
# Définit le pool d'adresses à fournir aux clients
server 10.50.0.0 255.255.255.0
keepalive 10 120
# Chemin des fichiers de configuration clients
# permet de redefinir la config générale par client
client-config-dir ./client-cfg
# Décommenter la directive pour autoriser les communications
# entre clients
#client-to-client
# Limiter le nombre de conexions au serveur
#max-clients 10
# Renforcement de la securité par defaut
#tls-version-min 1.2
# Méthode de chiffrement du canal de controle
tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA
#tls-cipher TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA
#tls-cipher TLS-RSA-WITH-AES-256-CBC-SHA
#tls-cipher TLS-RSA-WITH-CAMELLIA-256-CBC-SHA
#tls-cipher TLS-RSA-WITH-3DES-EDE-CBC-SHA
#tls-cipher TLS-DHE-RSA-WITH-AES-128-CBC-SHA
#tls-cipher TLS-DHE-RSA-WITH-SEED-CBC-SHA
#tls-cipher TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA
#tls-cipher TLS-RSA-WITH-AES-128-CBC-SHA
#tls-cipher TLS-RSA-WITH-SEED-CBC-SHA
#tls-cipher TLS-RSA-WITH-CAMELLIA-128-CBC-SHA
#tls-cipher TLS-RSA-WITH-RC4-128-SHA
#tls-cipher TLS-RSA-WITH-RC4-128-MD5
#tls-cipher TLS-RSA-WITH-DES-CBC-SHA
# Méthode de chiffrement du canal de données
cipher AES-256-CBC
# hachage via SHA-256
auth SHA256
comp-lzo
persist-key
persist-tun
# Paramétrages des logs
log /var/log/openvpn.log
verb 3
# Condense la répétition de memes entrées dans les logs
mute 20
# Fichier listant les connexions actives
status /var/log/openvpn-client-list.txt
Il utilise les certificats présents dans le sous dossier **./keys/** et des fichier de configuration propres au clientsdans le dossier **./client-cfg/** si l'on souhaite redéfinir le paramétrages par défaut. Pour exemple, un fichier vm01.lan redefinit les paramétrage du client CN=vm01.lan
# Fichier de redefinition de la configuration du client vm01.lan
# Ne tient pas compte de la configuration générale
push-reset
# Redéfinition de la configuration pour le client
ifconfig-push 10.50.0.33 255.255.255.0
# Pousse les routes sur le client
# NB: ces routes doivent exister sur le serveur
push "route 10.50.0.0 255.255.255.0"
push "route 172.16.3.0 255.255.255.0"
==== Client ====
Le fichier de configuration finalisé coté client a la forme suivante:
# Configuration du client
client
proto tcp
remote serveur.lan 31100
remote-cert-tls server
dev vpn
dev-type tun
nobind
tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA
#tls-cipher TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA
#tls-cipher TLS-RSA-WITH-AES-256-CBC-SHA
#tls-cipher TLS-RSA-WITH-CAMELLIA-256-CBC-SHA
#tls-cipher TLS-RSA-WITH-3DES-EDE-CBC-SHA
#tls-cipher TLS-DHE-RSA-WITH-AES-128-CBC-SHA
#tls-cipher TLS-DHE-RSA-WITH-SEED-CBC-SHA
#tls-cipher TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA
#tls-cipher TLS-RSA-WITH-AES-128-CBC-SHA
#tls-cipher TLS-RSA-WITH-SEED-CBC-SHA
#tls-cipher TLS-RSA-WITH-CAMELLIA-128-CBC-SHA
#tls-cipher TLS-RSA-WITH-RC4-128-SHA
#tls-cipher TLS-RSA-WITH-RC4-128-MD5
#tls-cipher TLS-RSA-WITH-DES-CBC-SHA
cipher AES-256-CBC
auth SHA256
persist-key
persist-tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vm01.lan.crt
key /etc/openvpn/keys/vm01.lan.key
comp-lzo
verb 3
===== Références =====
* GNU/Linux Magasine HS n°92, VPN
* https://unix.stackexchange.com/questions/195569/changing-openvpn-device-name#196796