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
Next revisionBoth sides next revision
informatique:logiciels:openvpn [2016/04/16 21:51] – actualisation pour Debian 8 pteuinformatique:logiciels:openvpn [2017/10/24 16:30] – [Liens] configuration OpenVPN avec la Freebox révolution pteu
Line 5: Line 5:
 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). 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).
  
-**Ce mode opératoire décrit la mise en place d'un tunnel routé avec certificats entre un serveur sous DD-WRT et 2 clients : un sous Windows 7 et l'autre sous Debian 6.0.7 (Squeeze).**+**Ce mode opératoire décrit la mise en place d'un tunnel routé avec certificats entre un serveur Linux (Ubuntu ou Debian 8plusieurs 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 13: Line 13:
 ... et 2 types d'authentification : ... et 2 types d'authentification :
   * par **pre-shared key** (clé partagée) : ne permet qu'un seul client simultané, l'unique clé est connue à l'avance par le client et le serveur.   * par **pre-shared key** (clé partagée) : ne permet qu'un seul client simultané, l'unique clé est connue à l'avance par le client et le serveur.
-  * 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 caschacun (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 sous Windows 7 (il jouera le rôle de CA) pour signer toutes les clés ; puis on installera copiera ces clés sur chaque machine.+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.
  
  
 =====Générer les certificats===== =====Générer les certificats=====
  
-La première chose pour utiliser l'authentification par certificat est de générer la paire de clés de l'autorité de certification. Ces clés seront utilisées pour certifier l'authenticité (signer) des clés publiques du serveur et des clients. Dans notre cas nous allons auto-signer les certificats sur le serveur, qui aura donc une double casquette : serveur VPN + CA.+La première chose pour utiliser l'authentification par certificat est de générer la paire de clés de l'autorité de certification (CA). Ces clés seront utilisées pour certifier l'authenticité (signer) les clés publiques du serveur et des clients. Dans notre cas nous allons auto-signer les certificats sur le serveur, qui aura donc une double casquette (donc une double paire de clés) : serveur VPN + CA.
  
-Nous allons voir comment générer des certificats sous Ubuntu (mais c'est aussi faisable sous Windows avec les même commandes), puis nous les importerons sous DD-WRT. Les manips qui vont suivre se font en root.+Nous allons voir comment générer des certificats sous Linux (mais c'est aussi faisable sous Windows avec les mêmes commandes), puis nous les importerons sur les clients. Les manips qui vont suivre se font en root.
  
 Installation du paquet Openvpn sous Debian/Ubuntu : Installation du paquet Openvpn sous Debian/Ubuntu :
Line 29: Line 29:
 </code> </code>
  
-**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 future 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/eay-rsa
Line 37: Line 37:
 cp -a /usr/share/eay-rsa /etc/openvpn cp -a /usr/share/eay-rsa /etc/openvpn
  
-# puis dans tous les cas aller dans le répertoire copié+# puis dans tous les casaller dans le répertoire copié
 cd /etc/openvpn/easy-rsa cd /etc/openvpn/easy-rsa
 </code> </code>
  
-====CA====+Pour facilité notre travail, on va configurer des variables qui seront partagées par tous les certificats (et quo'n n'aura pas à ressaisir à chaque fois).
  
-Éditer le fichier ''vars'' et remplir (au moins) les champs suivants, dans l'idée :+Pour cela, éditer le fichier ''vars'' et remplir (au moins) les champs suivants, dans l'idée :
 <code bash> <code bash>
 export KEY_COUNTRY="FR" export KEY_COUNTRY="FR"
Line 56: Line 56:
 </code> </code>
  
-Puis générer la CA :+Puis intégrer ces variables et supprimer les précédents éventuels certificats présents dans le répertoire ''keys'' :
 <code bash> <code bash>
 source vars source vars
 ./clean-all ./clean-all
 +</code>
  
 +====CA====
 +
 +Pour générer la paire de clé de la CA :
 +<code bash>
 ./build-ca ./build-ca
 </code> </code>
 +L'ensemble des paramètres demandés sera déjà rempli avec les variables saisie à l'étape précédente ; seul le ''Common Name'' est spécifique et doit être renseigné avec le nom de la machine.
  
-Si ça se passe bien, le répertoire ''keys'' est créé et contient les fichiers ca.crt, ca.key, index.txt et serial+Par sécurité il vaut mieux saisir un "Challenge password" pour utiliser le certificat, mais ce n'est pas obligatoire. 
-Seul le ''Common Name'' est obligatoire : il **DOIT** être renseigné avec le nom de la machine.+ 
 +Si tout se passe bien, le répertoire ''keys'' est créé et contient les fichiers ca.crt, ca.key, index.txt et serial.
  
 ====Serveur et client==== ====Serveur et client====
Line 74: Line 81:
 ./build-key client1 ./build-key client1
 </code> </code>
- 
-NB : Par sécurité il vaut mieux saisir un "Challenge password" pour utiliser le certificat, mais ce n'est pas obligatoire. 
  
 A chaque clé un prompt vous demande s'il faut signer les clés avec le CA ; il faut dire oui ("y") ! A chaque clé un prompt vous demande s'il faut signer les clés avec le CA ; il faut dire oui ("y") !
Line 86: Line 91:
 Data Base Updated Data Base Updated
 </code> </code>
- 
-Au final toutes les clés générées sont situées dans le répertoire ''keys/'' : 
-  * ''server.key'' est la clé privée du serveur 
-  * ''server.crt'' est le certificat (= public) du serveur 
- 
  
 ====Diffie Hellman==== ====Diffie Hellman====
  
-Maintenant il faut générer les paramètres Diffie Hellman :+Maintenant il faut générer les paramètres Diffie Hellman qui permet l'échange de clés sécurisé lors de l'établissement du VPN :
 <code bash> <code bash>
 ./build-dh ./build-dh
Line 117: Line 117:
   * les ''.key'' sont les clés privées donc secrètes   * les ''.key'' sont les clés privées donc secrètes
   * les ''.crt'' sont les certificats, publics   * les ''.crt'' sont les certificats, publics
-  * ''dh1024.pem'' c'est les paramètres Diffie Hellman (algo de chiffrement)+  * ''dh1024.pem'' (ou ''dh2048.pem'') ce sont les paramètres Diffie-Hellman (échange de clé partagées lors de l'établissement du VPN)
  
  
 =====Config serveur===== =====Config serveur=====
  
-Se connecter en webUI+Pour une machine Windows : se connecter en webUI
   * dans Services / VPN, dans "OpenVPN Daemon" cocher "Start OpenVPN=enable" et "Start type=Wan Up"   * dans Services / VPN, dans "OpenVPN Daemon" cocher "Start OpenVPN=enable" et "Start type=Wan Up"
   * pour chaque textarea il faut copier la clé comme suivant (c'est-à-dire coller le contenu de chaque fichier cité) :   * pour chaque textarea il faut copier la clé comme suivant (c'est-à-dire coller le contenu de chaque fichier cité) :
Line 133: Line 133:
     * laisser le champ **OpenVPN TLS Auth** vide     * laisser le champ **OpenVPN TLS Auth** vide
  
-Mon fichier de conf contient ça :+Pour une machine Linux on peut s'inspirer directement des modèles fournis par easy-rsa : 
 +<code bash> 
 +gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf 
 +</code> 
 + 
 +Le fichier de conf de base est très complet et contient des explication et des exemples pour chaque option ; je vous encourage à le parcourir. Les paramètres minimaux à retoucher sont : 
 +<code bash> 
 +# préciser où sont les certificats et DH 
 +ca /etc/openvpn/easy-rsa/keys/ca.crt 
 +cert /etc/openvpn/easy-rsa/keys/server-cert.crt 
 +key /etc/openvpn/easy-rsa/keys/server-cert.key 
 +dh /etc/openvpn/easy-rsa/keys/dh2048.pem 
 + 
 +# on modifie la passerelle du client pour faire passer tout son trafic dans le VPN 
 +push "redirect-gateway def1 bypass-dhcp" 
 +# on modifie le DNS du client par celui du serveur 
 +push "dhcp-option DNS 8.8.8.8" 
 + 
 +# on limite les risques en faisant tourner le deamon openvpn sous un utilisateur sans privilège 
 +user nobody 
 +group nogroup 
 +</code> 
 + 
 +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 (réseau de votre LAN)
Line 143: Line 166:
 # 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...
 server 192.168.3.0 255.255.255.0 server 192.168.3.0 255.255.255.0
- 
-# tunnel tcp routé 
-dev tun0 
-proto tcp 
-# si port différent du défaut 
-#port 1194 
- 
-# ping toutes les 10s ; considéré down au bout de 120s 
-keepalive 10 120 
- 
-# spécification des clés 
-dh /tmp/openvpn/dh.pem 
-ca /tmp/openvpn/ca.crt 
-cert /tmp/openvpn/cert.pem 
-key /tmp/openvpn/key.pem 
  
 # spécification de l'algorithme de chiffrement # spécification de l'algorithme de chiffrement
Line 171: Line 179:
 comp-lzo comp-lzo
  
-activer le verbose (de 0 à 15) si ça monte pas ! à commenter sinon+augmenter ou diminuer le niveau de verbosité (de 0 à 15) pour debugger si ça monte pas !
 #verb 4 #verb 4
 +</code>
 +
 +====Partie réseau====
 +
 +Pour transformer notre serveur en routeur, on doit également :
 +  * activer le routage
 +<code bash>
 +echo "1" > /proc/sys/net/ipv4/ip_forward
 +
 +# pour pérenniser ce paramètre après le prochain reboot, il faut l'écrire dans /etc/sysctl.conf :
 +vi /etc/sysctl.conf
 +net.ipv4.ip_forward=1
 +</code>
 +  * activer le NAT pour le réseau du VPN (remplacer ''eth0'' par l'interface réseau utilisée sur votre serveur)
 +<code bash>
 +iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
 +</code>
 +  * si vous avez bidouiller iptables, penser à activer les règles de FORWARD qui vont bien ; dans mon cas :
 +<code bash>
 +# connexions ouvertes
 +iptables -A FORWARD -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
 +# web
 +iptables -A FORWARD -p tcp --sport 1024:65535 --dport 80 -j ACCEPT
 +iptables -A FORWARD -p tcp --sport 1024:65535 --dport 443 -j ACCEPT
 +# DNS
 +iptables -A FORWARD -p udp --sport 1024:65535 --dport 53 -j ACCEPT
 +iptables -A FORWARD -p udp --sport 53 --dport 1024:65535 -j ACCEPT
 +#icmp
 +iptables -A FORWARD -p icmp -j ACCEPT
 +</code>
 +
 +Pour pérenniser cette config, on peut utiliser le paquet **iptables-persistent** :
 +<code bash>
 +aptitude install iptables-persistent
 +/etc/init.d/netfilter-persistent save
 </code> </code>
  
 =====Config client===== =====Config client=====
  
 +Dans un premier temps on doit installer le logiciel client openvpn, qui va dépendre de la plateforme. Puis on devra importer les certificats : ca.crt, client.crt et client.key.
 +
 +Pour la configuration, là encore on va s'inspirer du modèle fourni par easy-rsa :
 +<code bash>
 +cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
 +</code>
 +
 +Le fichier de conf est très similaire à celui du serveur ; voici un exemple de conf pour une tablette (l'application client que j'utilise est **OpenVPN Connect**, à télécharger sur le Play Store) :
 <code bash> <code bash>
 client client
 dev tun dev tun
- +proto udp 
-proto tcp +remote <IP_DU_SERVER> 1194 
-remote 82.xx.yy.zz 1194 +resolv-retry infinite
- +
-# utiliser un port client aléatoire+
 nobind nobind
- 
 persist-key persist-key
 persist-tun persist-tun
- +ca /sdcard/Sync/Nexus9/openvpn/ca.crt 
-# SSL/TLS parms. +cert /sdcard/Sync/Nexus9/openvpn/nexus9.crt 
-ca ca.crt +key /sdcard/Sync/Nexus9/openvpn/nexus9.key
-cert client.crt +
-key client.key +
 ns-cert-type server ns-cert-type server
-cipher AES-128-CBC 
 comp-lzo comp-lzo
- +verb 3
-# au besoin... +
-#verb 4+
 </code> </code>
 +NB : avec OpenVPN Connect, le fichier de conf doit être renommé pour avoir l'extension **.ovpn**, il n'accepte pas les **.conf** :/.
  
 =====Conf avancée===== =====Conf avancée=====
  
-On peut spécifier une conf par certificat en modifiant ainsi la conf du serveur:+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+# indique ou sont situes les fichiers dedies
 client-config-dir /tmp/openvpn/ccd client-config-dir /tmp/openvpn/ccd
 #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).
  
   * ''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 :
Line 223: Line 267:
 **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... **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 DD-WRT ne permet par d'utiliser la première plage d'adresse, la 192.168.0.0/30 (de .0 à .3).** +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).**
  
 Explications : Explications :
Line 231: Line 274:
 On peut couper la connexion si inactivité du client avec l'option ''--ping-restart <time>'' On peut couper la connexion si inactivité du client avec l'option ''--ping-restart <time>''
  
-<code> +''route'' controls the routing from the kernel to the OpenVPN server (via the TUN interface) while ''iroute'' controls the routing from the OpenVPN server to the remote clients. 
-''route'' controls the routing from the kernel to the OpenVPN server (via the TUN interface) while  + 
-''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> </code>
  
Line 239: Line 348:
 =====Divers===== =====Divers=====
  
-''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 disponibles, alors que ''openvpn --show-digests'' permet de lister les empreintes/hachages disponibles.
  
  
 =====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+]]
   * [[http://www.howtogeek.com/64433/how-to-install-and-configure-openvpn-on-your-dd-wrt-router/|How To Install and Configure OpenVPN On Your DD-WRT Router]] sur Howtogeek   * [[http://www.howtogeek.com/64433/how-to-install-and-configure-openvpn-on-your-dd-wrt-router/|How To Install and Configure OpenVPN On Your DD-WRT Router]] sur Howtogeek
   * HOWTO du site officiel : http://openvpn.net/index.php/documentation/howto.html#pki   * HOWTO du site officiel : http://openvpn.net/index.php/documentation/howto.html#pki
 +    * Miscellaneous : https://openvpn.net/index.php/open-source/documentation/miscellaneous/88-1xhowto.html
   * OpenVPN 2 HOWTO français : http://www.nbs-system.com/dossiers/howto-openvpn2.html   * OpenVPN 2 HOWTO français : http://www.nbs-system.com/dossiers/howto-openvpn2.html
   * 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.txt · Last modified: 2018/08/20 12:49 by pteu