User Tools

Site Tools


informatique:logiciels:openvpn

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
informatique:logiciels:openvpn [2016/10/15 16:39] – [Partie réseau] pteuinformatique:logiciels:openvpn [2018/08/20 12:49] (current) – [Générer les certificats] pteu
Line 3: Line 3:
 ======OpenVPN====== ======OpenVPN======
  
-OpenVPN est un logiciel libre multiplateforme permettant de créer un tunnel VPN chiffré TLS ce qui signifie qu'il utilise TCP ou UDP (niveau 4).+{{:informatique:logiciels:openvpn_logo.png |}}
  
-**Ce mode opératoire décrit la mise en place d'un tunnel routé avec certificats entre un serveur Linux (Ubuntu ou Debian 8) plusieurs clients, peu importe leur système d'exploitation.**+[[https://openvpn.net/index.php/open-source/documentation/manuals/65-openvpn-20x-manpage.html|OpenVPN]] est un logiciel libre multiplateforme utilisant OpenSSL pour créer un tunnel VPN SSL/TLS chiffré. 
 + 
 +**Ce mode opératoire décrit la mise en place d'un tunnel routé avec certificats entre un serveur Linux (Ubuntu ou Debian 8) et plusieurs clients, peu importe leur système d'exploitation.**
  
 Avant de commencer il faut savoir qu'il existe 2 types de tunnels : Avant de commencer il faut savoir qu'il existe 2 types de tunnels :
Line 15: Line 17:
   * par **certificat** : plus long à mettre en place, l'authentification se fait par échange de certificat + vérification mutuelle. On utilise une CA (autorité de certification) pour valider les certificats des protagonistes. Dans ce cas, chacun (le CA, le serveur et chaque client) doit avoir une paire de c.. clés : une publique et une privée.   * par **certificat** : plus long à mettre en place, l'authentification se fait par échange de certificat + vérification mutuelle. On utilise une CA (autorité de certification) pour valider les certificats des protagonistes. Dans ce cas, chacun (le CA, le serveur et chaque client) doit avoir une paire de c.. clés : une publique et une privée.
  
-La méthode consiste à générer toutes les clés sur le serveur Linux (il jouera le rôle de CA) pour signer toutes les clés ; puis on installera ces clés sur chaque machine.+Si comme la plupart des gens no ne possède pas de CA, la méthode consiste à générer toutes les clés sur le serveur Linux (il jouera le rôle de CA) pour signer toutes les clés ; puis on installera ces clés sur chaque machine.
  
  
Line 31: Line 33:
 **OpenVPN** contient des outils permettant de générer facilement des couples de clés. Ils sont situés dans le répertoire **/usr/share/doc/openvpn/examples/easy-rsa/** (ou ''/usr/share/easy-rsa'' sous Debian 8 (jessie)) ; il est conseillé de les copier dans un autre endroit, **/etc/openvpn/easy-rsa** par exemple, afin qu'une éventuelle mise à jour du paquet n'efface pas tout ce que nous allons faire. **OpenVPN** contient des outils permettant de générer facilement des couples de clés. Ils sont situés dans le répertoire **/usr/share/doc/openvpn/examples/easy-rsa/** (ou ''/usr/share/easy-rsa'' sous Debian 8 (jessie)) ; il est conseillé de les copier dans un autre endroit, **/etc/openvpn/easy-rsa** par exemple, afin qu'une éventuelle mise à jour du paquet n'efface pas tout ce que nous allons faire.
 <code bash> <code bash>
-mkdir /etc/openvpn/eay-rsa+mkdir /etc/openvpn/easy-rsa
 cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
  
 # alternative pour Debian 8 : # alternative pour Debian 8 :
-cp -a /usr/share/eay-rsa /etc/openvpn+cp -a /usr/share/easy-rsa /etc/openvpn
  
 # puis dans tous les cas, aller dans le répertoire copié # puis dans tous les cas, aller dans le répertoire copié
Line 158: Line 160:
 D'autres paramètres intéressants : D'autres paramètres intéressants :
 <code bash> <code bash>
-# envoyer cette route aux clients (réseau de votre LAN)+# envoyer cette route aux clients (pour qu'ils puissent accéder au réseau de votre LAN)
 push "route 192.168.2.0 255.255.255.0" push "route 192.168.2.0 255.255.255.0"
  
 # le réseau utilisé pour les tunnels # le réseau utilisé pour les tunnels
-# NB : OpenVPN utilise l'IP .1 du premier /30 pour son IP à lui+# NB : OpenVPN utilise l'IP .1 du premier /30 pour lui
 # les /30 suivants sont pour chaque tunnel # les /30 suivants sont pour chaque tunnel
 # ex : 192.168.3.4/30 pour le premier client, 192.168.3.8/30 pour le second, etc... # ex : 192.168.3.4/30 pour le premier client, 192.168.3.8/30 pour le second, etc...
Line 168: Line 170:
  
 # spécification de l'algorithme de chiffrement # spécification de l'algorithme de chiffrement
-cipher AES-128-CBC+# pour lister tous les algos possibles : "openvpn --show-ciphers" 
 +# (NB : ''openvpn --show-digests'' permet de lister les algo de hashage) 
 +cipher AES-256-CBC
  
 # activer la communication entre les clients # activer la communication entre les clients
Line 244: Line 248:
 verb 3 verb 3
 </code> </code>
-NB : avec OpenVPN Connect, le fichier de conf doit être renommé pour avoir l'extension **.ovpn**, il n'accepte pas les **.conf** :/.+NB : avec OpenVPN Connect, le fichier de conf doit avoir l'extension **.ovpn**, il n'accepte pas les **.conf** :/.
  
 +====Intégrer les certificats dans le fichier de configuration====
 +
 +Plutôt que de pointer vers des fichiers externes, openvpn permet d'intégrer les certificats dans le fichier de configuration ovpn ; c'est le cas pour les options ''ca'', ''cert'', ''key'', ''dh'' ([[https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage#lbAV|et d'autres]]). Il faut alors remplacer l'include du fichier et copier/coller son contenu entre les balises ''<option></option>''. Par exemple pour le certificat de la CA :
 +<code bash>
 +#ca /sdcard/Sync/Nexus9/openvpn/ca.crt
 +<ca>
 +-----BEGIN CERTIFICATE-----
 +MIIEoTCCA4mgAwIBAgIJAKWLtfNAkVCcMA0GCSqGSIb3DQEBCwUAMIGRMQswCQYD
 +[blabla...]
 ++/WEiArZqzcmW4tQBnmBIgfGjYfJ+5MK3an2TVlnqoMy34ZD4AJDIrzU0aZwI75w
 +9KljFHVPKEAFhZzokOREYCG+8yVA5F6Uk2miMw6ZVGDgbrYvWA==
 +-----END CERTIFICATE-----
 +</ca>
 +</code>
 +
 +Cela simplifie beaucoup la mise en œuvre, mais possède l'inconvénient de laisser la clé privée du client lisible par tous les utilisateurs pouvant lire le fichier de conf.
 =====Conf avancée===== =====Conf avancée=====
  
 Sur le serveur, on peut spécifier une configuration dédiée à un seul client en modifiant ainsi la conf : Sur le serveur, on peut spécifier une configuration dédiée à un seul client en modifiant ainsi la conf :
 <code bash> <code bash>
-# indique ou sont situes les fichiers dedies+# indique ou sont situes les fichiers dédiés
 client-config-dir /tmp/openvpn/ccd client-config-dir /tmp/openvpn/ccd
 +# interdit la connexion des clients qui n'ont pas de fichier dédié
 #ccd-exclusive #ccd-exclusive
 </code> </code>
-Ensuite place la config dédiée dans fichier portant le nom du client (le Common Name de son certificat).+Ensuite place la config dédiée dans fichier portant le nom du client (le **Common Name** (CN) de son certificat).
  
   * ''client-config-dir'' indique le répertoire contenant les fichiers nommés ''<common name>'' : le serveur utilisera le fichier idoine en récupérant ce champ dans le certificat du client. Par exemple pour configurer le client **toto** on créera un fichier ''/tmp/openvpn/ccd/toto''. Ce dernier pourra contenir, par exemple :   * ''client-config-dir'' indique le répertoire contenant les fichiers nommés ''<common name>'' : le serveur utilisera le fichier idoine en récupérant ce champ dans le certificat du client. Par exemple pour configurer le client **toto** on créera un fichier ''/tmp/openvpn/ccd/toto''. Ce dernier pourra contenir, par exemple :
 <code bash> <code bash>
 +# son IP réservée 192.168.3.10 ainsi que l'IP du tunnel côté serveur : .9
 ifconfig-push 192.168.3.10 192.168.3.9 ifconfig-push 192.168.3.10 192.168.3.9
 +# une route pour que le client puisse avoir accès à un réseau connecté au serveur
 +# sa passerelle sera l'IP du tunnel du serveur (.9)
 push "route 192.168.2.0 255.255.255.0" push "route 192.168.2.0 255.255.255.0"
 +
 +# LAN pour que le serveur accède au réseau du client (via 192.168.3.10)
 +iroute 192.168.100.0 255.255.255.0
 +# NB : on doit ajouter également dans la conf serveur : "route 192.168.100.0 255.255.255.0"
 </code> </code>
  
-De cette façon on attribue au client toto l'IP 192.168.3.10 ; sa gateway (l'autre bout du tunnelsera 192.168.3.9 (réseau 192.168.2.8/30) ; et on lui annoncera le réseau 192.168.2.0/24atteingnable par VPN.+**Le driver TAP sous Windows impose l'utilisation d'un adressage en /30 (255.255.255.252) car c'est du point-à-point (2 IPs utilisables). Ainsi on ne peut utiliser les couples d'IPs suivantes (serveur/client) : (192.168.0.5,192.168.0.6)(9,10), (13,14), (17,18), etc...**
  
-  * ''ccd-exclusive'' refuse les clients qui n'ont pas de fichier à leur nom dans le répertoire ''/tmp/openvpn/ccd''+On peut couper la connexion si inactivité du client avec l'option ''--ping-restart <time>''
-**Le driver TAP sous Windows impose l'utilisation d'un adressage en /30 (255.255.255.252) car c'est du point-à-point (2 IPs utilisables). Ainsi on ne peut utiliser les couples d'IPs suivantes (serveur/client) : (192.168.0.5,192.168.0.6), (9,10), (13,14), (17,18), etc...+
  
-Sachant que, dans le cas d'un serveur sous DD-WRT, ce dernier ne permet par d'utiliser la première plage d'adresse, la 192.168.0.0/30 (de .0 à .3).**+''route'' permet d'ajouter une route statique dans le kernel Linux
  
-Explications : +''iroute'' permet de déclarer une route vers un client (à définir dans un fichier client dans le ''client-config-dir'')Pour être ajoutée par le kernel elle doit être également déclarée dans la conf principale du serveur ovpn avec une directive ''route'', voir exemple ci-dessus) :
-  * créer une interco = un réseau /30 (255.255.255.252, 2 IPs possibles) avec une IP pour le serveur et une pour le client car le tunnel est point à point.+
  
-On peut couper la connexion si inactivité du client avec l'option ''--ping-restart <time>''+''mute 10'' permet de ne plus logguer les messages qui se répètent plus de 10 fois
  
-''route'' controls the routing from the kernel to the OpenVPN server (via the TUN interfacewhile ''iroute'' controls the routing from the OpenVPN server to the remote clients.+=====Intégration système===== 
 + 
 +On va s'atteler à configurer les utilitaires du sytème pour une bonne intégration d'openvpn. 
 + 
 +====Démarrage automatique==== 
 + 
 +Pour lancer openvpn automatiquement au démarrage de la machine : 
 +<code bash> 
 +update-rc.d openvpn defaults 
 +</code> 
 + 
 +====syslog==== 
 + 
 +Pour orienter les log du daemon openvpn, on peut définir l'option idoine (''log-append openvpn.log'') dans la conf openvpn, mais je préfère les faire traiter par le syslog du système, c'est plus propre (et ça tombe bien, c'est la configuration par défaut d'openvpn !). On configurera le démon (r)syslog, en créant un fichier .conf du genre ''/etc/rsyslog/openvpn.conf'' 
 +<code bash> 
 +# Create a template for the vpn log location 
 +$template OpenVPN,"/var/log/openvpn/ovpn.log" 
 + 
 +# Save log events where the programname starts with ovpn like ovpn-server to the 
 +# location mentioned in the template 
 +:programname, startswith, "ovpn-" -?OpenVPN 
 + 
 +# Stop processing ovpn-* log events 
 +:programname, startswith, "ovpn-"
 +</code> 
 + 
 +Relancer ensuite le syslog : 
 +<code bash> 
 +systemctl restart rsyslog 
 +</code> 
 + 
 +====logrotate==== 
 + 
 +Une configuration classique, à déposer dans ''/etc/logrotate.d/openvpn''
 +<code bash> 
 +/var/log/openvpn/*.log 
 +
 +        rotate 12 
 +        size 500M 
 +        monthly 
 +        missingok 
 +        notifempty 
 +        delaycompress 
 +        compress 
 +        copytruncate    # pour ne pas interrompre les logs du daemon openvpn 
 +
 +</code> 
 + 
 +====fail2ban==== 
 + 
 +On déclare le fichier à surveiller dans en créant un ''/etc/fail2ban/jail.d/openvpn.conf''
 +<code bash> 
 +[openvpn] 
 +enabled = true 
 +protocol = udp 
 +port    = 5594 
 +filter    = openvpn 
 +logpath = /var/log/openvpn/ovpn.log 
 +</code> 
 + 
 +Et on défini les filtres dans ''/etc/fail2ban/filter.d/openvpn.conf''
 +<code bash> 
 +[Definition] 
 +failregex = <HOST>:\\d{1,5} TLS Auth Error 
 +    <HOST>:\\d{1,5} VERIFY ERROR: 
 +    <HOST>:\\d{1,5} TLS Error: TLS handshake failed 
 +</code>
  
  
Line 281: Line 373:
   * ''dev-node "nom_de_linterface_reseau"'' permet de spécifier quelle interface utiliser (elle doit être créée avec ''addtap'').   * ''dev-node "nom_de_linterface_reseau"'' permet de spécifier quelle interface utiliser (elle doit être créée avec ''addtap'').
   * ''crl-verify crl.pem'' pour spécifier une liste de révocation   * ''crl-verify crl.pem'' pour spécifier une liste de révocation
-  * la commande ''openvpn --show-ciphers'' permet de lister les algorithmes de chiffrement disponiblesalors que ''openvpn --show-digests'' permet de lister les empreintes/hachages disponibles.+  * ''status openvpn-status.log'' pour spécifier un fichier contenant la liste des clients connectésmise à jour chaque minute 
 +  * ''error=unsupported certificate purpose'' : typiquement cette erreur apparait quand on utilise un certificat "serveur" sur un client ou l'inverse (un certificat client sur un serveur). Openvpn vérifie le champ **nsCertType** du certificat, et il doit correspondre à l'utilisation qu'on en fait (serveur ou client). Pour résoudre ce problème, avec easy-rsa, générer le certificat d'un serveur openvpn avec ''build-key-server'' et ceux des clients avec ''build-key''. 
 =====Liens===== =====Liens=====
  
 +  * Documentation officielle : [[https://openvpn.net/index.php/open-source/documentation/manuals/]]
   * installation d'OpenVPN sous DD-WRT : http://www.dd-wrt.com/wiki/index.php/OpenVPN   * installation d'OpenVPN sous DD-WRT : http://www.dd-wrt.com/wiki/index.php/OpenVPN
   * [[http://www.dd-wrt.com/wiki/index.php/VPN_%28the_easy_way%29_v24%2B|VPN (the easy way) v24+]]   * [[http://www.dd-wrt.com/wiki/index.php/VPN_%28the_easy_way%29_v24%2B|VPN (the easy way) v24+]]
Line 292: Line 387:
   * tunnel routé sous Ubuntu : http://blog.sionib.net/post/2007/06/28/Openvpn-Ubuntu-mode-routed   * tunnel routé sous Ubuntu : http://blog.sionib.net/post/2007/06/28/Openvpn-Ubuntu-mode-routed
   * [[http://www.dd-wrt.com/phpBB2/viewtopic.php?t=35689|OpenVPN config docs for v24 SP1]]   * [[http://www.dd-wrt.com/phpBB2/viewtopic.php?t=35689|OpenVPN config docs for v24 SP1]]
 +  * Pour faire fonctionner le serveur OpenVPN de la Freebox Révolution avec le client OpenVPN : [[https://forum.freenews.fr/index.php?topic=117463.0|[TUTO] Connexion à la Freebox en OpenVPN (Bridgé et Routé) depuis Windows 10]]. Spoil : ajouter ces lignes dans le fichier .ovpn généré par votre Freebox :
 +<code bash>
 +topology subnet
 +# copier/coller de l'IP attribuée par la Freebox à notre client
 +ifconfig 192.168.27.65 255.255.255.224
 +# empêche d'accepter la configuration du serveur
 +pull-filter ignore "ifconfig"
 +# ip de l'interface tunnel de la Freebox
 +route-gateway 192.168.27.94
 +</code>
informatique/logiciels/openvpn.1476549572.txt.gz · Last modified: 2016/10/15 16:39 by pteu