{{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