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.
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
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:
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
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:
mkdir /etc/openvpn/keys cp keys/ca.crt keys/severname.crt keys/servername.key keys/df2048.pem /etc/openvpn/keys
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:
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 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.
Lors de l'établissement de la liaison les logs mettent en avant:
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
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"
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