{{tag>VPN OpenVPN easy_rsa nouveau client certficat openSSL push-reset override ccd client_config_dir}} ====== Ajouter un nouveau client à notre serveur OpenVPN ====== Pour faire suite a l'article (qui n'existe pas encore ;-) )sur le serveur, voici comment ajouter un nouveau client. Prérequis : * un serveur OpenVPN correctement configuré (hébergé sur une debian wheezy, mais une distribution inférieure autre fera l'affaire aussi * un client dans mon cas sous linuxmint 17, mais la encore peu de choses vont changer dans la suite Coté client il existe 2 manières de faire : * Utiliser une configuration globale système (avec connexion automatique au VPN au démarrage) ce que nous allons faire * Utiliser une configuration plus orientée poste nomade avec une connexion VPN à la demande via network-manager Nous allons nous intéresser au premier cas Nous allons configurer une connexion VPN automatique sans mot de passe avec notre réseau. Ne faites pas ceci sur une machine susceptible de se faire voler ou d'être perdue. Sur ce type de machine il faudra préférer : * une clef avec passphrase * une connexion manuelle Et bien sur si le pire arrivait, notifier au plus vite votre administrateur système (ca tombe bien ca devrait être vous ;) ) et révoquer dans les plus brefs délais les certificats perdus/volés ===== Prérequis ===== ==== Poste client ==== * Sur notre poste client il nous faudra ... openvpn ;p :# apt-get install openvpn ==== Générer le certificat ==== Nous allons supposer ici que vous utilisez easy-rsa pour la gestion de votre PKI OpenVPN, ce qui est souvent le cas par défaut. Sinon vous devriez savoir adapter la suite. * Depuis le serveur : * importer votre configuration easy-rsa :# cd /etc/openvpn/easy-rsa # source ./vars * générer un certificat pour ce futur nouveau client que nous allons baptiser "nouveauClient" dans la suite (remplacer ce nom par le votre) :# ./pkitool nouveauClient ce qui devrait vous afficher quelque chose de similaire à :# ./pkitool nouveauClient Generating a 1024 bit RSA private key .....................++++++ ....................................++++++ writing new private key to 'nouveauClient.key' ----- Using configuration from /etc/openvpn/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'FR' stateOrProvinceName :PRINTABLE:'MaProvince' localityName :PRINTABLE:'MaVille' organizationName :T61STRING:'Chez_oam' commonName :PRINTABLE:'nouveauClient' emailAddress :IA5STRING:'root@mondomaine.com' Certificate is to be certified until Jan 11 10:29:19 2025 GMT (3650 days) Write out database with 1 new entries Data Base Updated * Le certificat est généré dans le sous répertoire "keys", pour s'en convaincre un petit ls : # ls /etc/openvpn/easy-rsa/keys/nouveauClient.* /etc/openvpn/easy-rsa/keys/nouveauClient.crt /etc/openvpn/easy-rsa/keys/nouveauClient.csr /etc/openvpn/easy-rsa/keys/nouveauClient.key ===== Configuration du client ===== * Transférer les fichiers suivants sur votre poste client en utilisant un moyen "sécurisé" : clef USB, scp, .... : * le certificat et sa clef (respectivement fichiers nouveauClient.crt et nouveauClient.key) * le certificat de votre serveur (pour savoir de quel fichier il s'agit, vous pouvez utiliser la commande # grep "^ca" /etc/openvpn/server.conf qui devrait vous donner quelque chose comme : # grep "^ca" /etc/openvpn/server.conf ca keys/ca.crt * Déposer ces fichiers dans le répertoire /etc/openvpn/, de telle sorte que vous devriez y trouver les fichiers suivants : # ls /etc/openvpn/ nouveauClient.crt nouveauClient.key ca.crt update-resolv-conf * Ecrire le fichier de configuration **/etc/openvpn/client.conf** qu'il faudra bien sur adapter a vos besoins : # cat << EOF > /etc/openvpn/client.conf client remote vpn.mondomaine.com 1194 proto udp nobind persist-key persist-tun dev-type tun dev vpn-chezoam user nobody group nogroup ca ca.crt cert nouveauClient.crt key nouveauClient.key comp-lzo verb 4 EOF Ceci est une configuration standard : * on définit le mode client, l'adresse/port/protocole du serveur (ici vpn.mondomaine.com en udp sur le port 1194 : vous devriez vouloir changer au moins le nom du serveur) * le mode de l'interface réseau utilisé : j'ai choisi tun. On peut aussi noter que j'aime bien nommer cette interface avec un nom explicite : "vpn-chezoam" * Il faut bien sur adapter les noms "nouveauClient.crt" et "nouveauClient.key" des directives **cert** et **key** à votre client * Enfin j'active la compression lzo (qui doit aussi être activée coté serveur) * Et un peu de verbosité parce que ça ne fait pas de mal C'en est fini de la configuration coté client : il ne reste plus qu'à configurer notre serveur pour ce nouveau client. ===== Configuration du serveur ===== Le serveur utilise un "client configuration directory" (aka ccd). Il faut donc ajouter un nouveau fichier dans ce répertoire pour notre nouveau client. C'est le moment d'assigner une IP à notre nouveau client avec la directive **ifconfig-push** Chaque paire d'adresse de ifconfig-push représente les adresses virtuelles du client et du serveur. Elles doivent être prises dans des sous réseaux /30 pour être compatibles avec les clients windows (et plus spécifiquement le driver TAP windows). Si la phrase ci dessus est du chinois, sachez juste qu'il faut prendre les couples d'adresses dans les couples suivants : [ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18] [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38] [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58] [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78] [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98] [101,102] [105,106] [109,110] [113,114] [117,118] [121,122] [125,126] [129,130] [133,134] [137,138] [141,142] [145,146] [149,150] [153,154] [157,158] [161,162] [165,166] [169,170] [173,174] [177,178] [181,182] [185,186] [189,190] [193,194] [197,198] [201,202] [205,206] [209,210] [213,214] [217,218] [221,222] [225,226] [229,230] [233,234] [237,238] [241,242] [245,246] [249,250] [253,254] Je vais donc choisir [13,14] (qui sont bien sur libres sur le réseau OpenVPN auquel je veux associer ce nouveauClient : 192.168.3.0/24) : # cat << EOF > /etc/openvpn/ccd/nouveauClient ifconfig-push 192.168.3.13 192.168.3.14 EOF Noter ici que l'on utilise le nom du client "nouveauClient" et donc qu'il ne faut pas mettre d'extension à ce fichier, mais le nommer en accord avec votre nom de client ===== Finalisation ===== Tout devrait maintenant être en place pour nous permettre de tenter une connexion. Pour ce faire, sur votre client : # service openvpn restart Vous pouvez vérifier les logs coté client et serveur (dans /var/log/syslog) pour découvrir pourquoi si jamais la connexion échoue ===== Un peu plus loin ===== ==== Utiliser le ccd pour passer moins de paramètres a certains clients ==== On peut utiliser le fichier ccd de chaque client pour lui ajouter des paramètres donnés par le serveur, mais on peut aussi dire au serveur de ne lui en donner que quelques-uns. Par exemple si sur un des clients vous ne voulez pas qu'il ait la route vers un sous réseau interne définie dans la conf générale de votre serveur. Il faut pour cela utiliser **push-reset** dans le fichier ccd qui flush ce qui va être envoyé du serveur vers ce client spécifique. Cete directive fait néanmoins un peu trop le ménage et il faut donc lui redonner la route vers le sous réseau du serveur openvpn lui meme (ici 192.168.3.0/24), comme par exemple dans l'exemple suivant : $ cat ccd/monClient push-reset push "route 192.168.3.0 255.255.255.0" ifconfig-push 192.168.3.201 192.168.3.202 ==== Relancer des services apres la connexion du client openvpn ==== Il peut être utile de (re)lancer un script et/ou des services une fois le client connecté, par exemple un service qui doit se binder sur l'ip VPN (monitoring nagios, munin, backup, ....) Pour se faire: * ajouter du contenu dans le fichier client.conf : # cat << EOF >> /etc/openvpn/client.conf # on ajoute un script de restart pour nrpe et munin-node script-security 2 # run /etc/openvpn/up.sh when the connection is set up up /etc/openvpn/up.sh EOF * créer notre script et le remplir, par exemple : # cat << EOF > /etc/openvpn/up.sh #!/bin/bash # # restart services so they can bind to VPN ip address # service munin-node restart service nagios-nrpe-server restart EOF * rendre ce script exécutable :# chmod +x /etc/openvpn/up.sh * Il ne reste plus qu'a relancer le client openvpn et attendre que la connexion s'établisse avant de regarder le resultat : # service openvpn restart Il va sans dire qu'il ne faut pas donner les droits de modifier ce script a n'importe qui étant donné qu'il sera lancé en root ;-) ===== Références ===== * http://openvpn.net/index.php/open-source/documentation/howto.html#policy * https://community.openvpn.net/openvpn/ticket/29