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 [2009/09/02 20:14] pteuinformatique:logiciels:openvpn [2018/08/20 12:49] (current) – [Générer les certificats] pteu
Line 1: Line 1:
 {{tag>sécurité VPN}} {{tag>sécurité VPN}}
- 
  
 ======OpenVPN====== ======OpenVPN======
-OpenVPN est un logiciel libre multi-plateforme permettant de créer un VPN. 
  
-Ce mode opératoire décrit l'installation d'OpenVPN qui permet de mettre en place un tunnel chiffré entre un client Windows et un serveur dd-wrt.+{{:informatique:logiciels:openvpn_logo.png |}} 
 + 
 +[[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 :
-  * tunnel **bridgé** à notre LAN = il obtient une adresse dans le réseau grâce à une interface **tap** (c'est un pont réseau). +  * tunnel **bridgé** = il obtient une adresse IP dans le réseau grâce à une interface **tap** (c'est un pont réseau). 
-  * tunnel **routé** on utilise une interface **tun** qui défini son réseau propre ; le lien entre notre LAN et le tunnel se fera en routant les paquets.+  * tunnel **routé** on utilise une interface **tun** qui définit son réseau propre ; le lien entre notre LAN et le tunnel se fera en routant les paquets (on obtient une IP dans un nouveau réseau).
  
-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 de la validité de ce dernier. On utilise un 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.
  
-On peut spécifier un fichier de conf avec l'option ''--config <fichier>''. Les paramètres du fichier de conf peuvent être fournis en ligne de commande en les préfixant par ''--''.+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.
  
  
-=====Tunnel bridgé=====+=====Générer les certificats=====
  
-====Générer la clé partagée====+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.
  
-Sur le serveur : +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.
-  openvpn --genkey --secret /tmp/static.key+
  
-Cette clé devra être communiquée au client.+Installation du paquet Openvpn sous Debian/Ubuntu : 
 +<code bash> 
 +aptitude install openvpn 
 +</code>
  
-====Config serveur====+**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> 
 +mkdir /etc/openvpn/easy-rsa 
 +cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
  
-Créer l'interface virtuelle,  +# alternative pour Debian 8 : 
-  openvpn --mktun --dev tap0+cp -a /usr/share/easy-rsa /etc/openvpn
  
-L'attacher au switch +# puis dans tous les cas, aller dans le répertoire copié 
-  brctl addif br0 tap0 +cd /etc/openvpn/easy-rsa 
-  ifconfig tap0 0.0.0.0 promisc up+</code>
  
-Créer un lien symbolique vers l'exécutable : +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).
-  ln -s /usr/sbin/openvpn /tmp/myvpn+
  
-Ouvrir le port tcp/1194 +Pour cela, éditer le fichier ''vars'' et remplir (au moins) les champs suivants, dans l'idée : 
-  iptables -I INPUT 1 -p tcp --dport 1194 -j ACCEPT+<code bash> 
 +export KEY_COUNTRY="FR" 
 +export KEY_PROVINCE="FR" 
 +export KEY_CITY="Paris" 
 +export KEY_ORG="pteuz-corp" 
 +export KEY_EMAIL="pteu@google.fr" 
 +export KEY_OU="DSI"
  
-Lancer le serveur +# X509 Subject Field 
-  /tmp/myvpn --dev tap0 --secret /tmp/static.key --comp-lzo --port 1194 --proto tcp-server --verb 3 --daemon+export KEY_NAME="pteu" 
 +</code>
  
-====Config client====+Puis intégrer ces variables et supprimer les précédents éventuels certificats présents dans le répertoire ''keys''
 +<code bash> 
 +source vars 
 +./clean-all 
 +</code>
  
-Mon client est sous Windows, le fichier de conf ainsi que la pre-shared key générée sur le serveur sont situés dans ''C:\Program Files\OpenVPN\config''.+====CA====
  
-**client.ovpn** +Pour générer la paire de clé de la CA : 
-  remote XXXX.dyndns.org +<code bash> 
-  port 1194 +./build-ca 
-  dev tap +</code> 
-  secret static.key +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.
-  proto tcp-client +
-  comp-lzo+
  
 +Par sécurité il vaut mieux saisir un "Challenge password" pour utiliser le certificat, mais ce n'est pas obligatoire.
  
-=====Tunnel routé=====+Si tout se passe bien, le répertoire ''keys'' est créé et contient les fichiers ca.crt, ca.key, index.txt et serial.
  
-====Générer les certificats====+====Serveur et client====
  
-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, ui aura donc une double casquette : serveur VPN + CA.+On procède presque de la même façon pour générer les certificats du serveur et des clients 
 +<code bash> 
 +./build-key-server server 
 +./build-key client1 
 +</code>
  
-Nous allons voir comment générer des certificats sous Ubuntu, puis nous les importerons sous DD-WRT. Les manips qui vont suivre se font en root.+A chaque clé un prompt vous demande s'il faut signer les clés avec le CA ; il faut dire oui ("y") ! 
 +<code bash> 
 +Certificate is to be certified until Sep  2 15:10:41 2019 GMT (3650 days) 
 +Sign the certificate? [y/n]:y 
 +   
 +1 out of 1 certificate requests certified, commit? [y/n]y 
 +Write out database with 1 new entries 
 +Data Base Updated 
 +</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** ; il est conseillé de le 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. +====Diffie Hellman====
-  cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/easy-rsa +
-  cd /etc/openvpn/easy-rsa+
  
-===CA=== +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 
-Editer le fichier ''vars'' et remplir les champs KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, et KEY_EMAIL (il parait qu'il vaut mieux éviter les espaces). Puis +<code bash> 
-  ./vars +./build-dh 
-  ./clean-all + Generating DH parameters, 1024 bit long safe prime, generator 2 
-  ./build-ca+ This is going to take a long time 
 + .......+......................................................+................. 
 + [...] 
 + .................+.........+.+....+...................+.++*++*++* 
 +</code> 
 +(NB : maintenant c'est plutôt 2048 bits)
  
-Si vars n'est pas exécutable : +====Fichiers générés====
-  chmod +x vars+
  
-Si vous obtenez cette sortie en lançant build-ca +Les fichiers que l'on a générés 
-  ./build-ca +<code bash> 
-  req [options] <infile >outfile +ls keys/ 
-  where options  are+01.pem  ca.key      dude.csr   index.txt.attr      serial      server.csr 
 +02.pem  dh1024.pem  dude.key   index.txt.attr.old  serial.old  server.key 
 +ca.crt  dude.crt    index.txt  index.txt.old       server.crt 
 +</code>
  
-.. c'est que les variables du fichier ''vars'' n'ont pas été ajoutées dans l'environnement ; dans ce cas il faut les renseigner et les passer à la main dans le terminal : +  * les ''.key'' sont les clés privées donc secrètes 
-  export KEY_CONFIG=/etc/openvpn/easy-rsa/openssl.cnf +  * les ''.crt'' sont les certificats, publics 
-  export KEY_DIR=/etc/openvpn/easy-rsa/keys +  * ''dh1024.pem'' (ou ''dh2048.pem''ce sont les paramètres Diffie-Hellman (échange de clé partagées lors de l'établissement du VPN)
-  export KEY_SIZE=1024 +
-   +
-  export KEY_COUNTRY=FR +
-  export KEY_PROVINCE=NA +
-  export KEY_CITY=PARIS +
-  export KEY_ORG="pt3us corp" +
-  export KEY_EMAIL="me@myhost.mydomain"+
  
-Finalement si ça marche on obtient cette sortie : 
-  ./build-ca 
-  Generating a 1024 bit RSA private key 
-  ..................................++++++ 
-  ...........++++++ 
-  writing new private key to 'ca.key' 
-  ----- 
-  You are about to be asked to enter information that will be incorporated 
-  into your certificate request. 
-  What you are about to enter is what is called a Distinguished Name or a DN. 
-  There are quite a few fields but you can leave some blank 
-  For some fields there will be a default value, 
-  If you enter '.', the field will be left blank. 
-  ----- 
-  Country Name (2 letter code) [FR]: 
-  State or Province Name (full name) [NA]: 
-  Locality Name (eg, city) [PARIS]: 
-  Organization Name (eg, company) [pt3u corp]: 
-  Organizational Unit Name (eg, section) []: 
-  Common Name (eg, your name or your server's hostname) []:odin 
-  Email Address [me@myhost.mydomain]: 
  
-.. suivi de prompt qui utiliseront les variables d'environnement précédemment enregistrées. Seul ''Common Name (eg, your name or your server's hostname) []:'' ne l'est pas **ET DOIT** être renseigné avec l'identifiant de la machine.+=====Config serveur=====
  
-===Serveur et client==+Pour une machine Windows : se connecter en webUI 
-On procède presque de la même façon pour générer les certificats du serveur et des clients : +  * dans Services / VPN, dans "OpenVPN Daemon" cocher "Start OpenVPN=enable" et "Start type=Wan Up" 
-  ./build-key-server server +  * pour chaque textarea il faut copier la clé comme suivant (c'est-à-dire coller le contenu de chaque fichier cité) : 
-  ./build-key client1+    * dans **Public Server Cert** mettre le certificat de la CA (**ca.crt**) 
 +    * laisser le champ **Certificate Revoke List** vide 
 +    * dans **Public Client Cert** copier la clé publique du serveur (**server.crt**) 
 +    * dans **Private Client Key** copier la clé privée du serveur (**server.key**) 
 +    * dans **DH PEM** copier les paramètres Diffie-Hellman (**dh1024.pem**) 
 +    * dans **OpenVPN Config** mettre la configuration OpenVPN du serveur (voir plus bas) 
 +    * laisser le champ **OpenVPN TLS Auth** vide
  
-A chaque clé un prompt vous demande s'il faut signer les clés avec le CA ; il faut dire oui ("y") ! +Pour une machine Linux on peut s'inspirer directement des modèles fournis par easy-rsa 
-  Certificate is to be certified until Mar 15 18:25:51 2018 GMT (3650 days) +<code bash> 
-  Sign the certificate? [y/n]:y +gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf 
-   +</code>
-   +
-  1 out of 1 certificate requests certified, commit? [y/n]y+
  
-Au final toutes les clés générées sont situées dans le répertoire ''keys/'' : +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 : 
-  * ''server.key'' est la clé privée du serveur +<code bash> 
-  * ''server.crt'' est le certificat (= public) du serveur+# 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"
  
-===Diffie Hellman===+# on limite les risques en faisant tourner le deamon openvpn sous un utilisateur sans privilège 
 +user nobody 
 +group nogroup 
 +</code>
  
-Maintenant il faut générer les paramètres Diffie Hellman +D'autres paramètres intéressants 
-  ./build-dh +<code bash> 
-   Generating DH parameters, 1024 bit long safe prime, generator 2 +# envoyer cette route aux clients (pour qu'ils puissent accéder au réseau de votre LAN) 
-   This is going to take a long time +push "route 192.168.2.0 255.255.255.0"
-   .......+......................................................+................. +
-   .................+.........+.+....+...................+.++*++*++*+
  
 +# le réseau utilisé pour les tunnels
 +# NB : OpenVPN utilise l'IP .1 du premier /30 pour lui
 +# 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...
 +server 192.168.3.0 255.255.255.0
  
-===Fichiers générés===+# spécification de l'algorithme de chiffrement 
 +# pour lister tous les algos possibles : "openvpn --show-ciphers" 
 +# (NB : ''openvpn --show-digests'' permet de lister les algo de hashage) 
 +cipher AES-256-CBC
  
-Les fichiers que l'on a générés : +# activer la communication entre les clients 
-  ls keys/ +client-to-client
-  01.pem  ca.key      dude.csr   index.txt.attr      serial      server.csr +
-  02.pem  dh1024.pem  dude.key   index.txt.attr.old  serial.old  server.key +
-  ca.crt  dude.crt    index.txt  index.txt.old       server.crt+
  
-  * les ''.key'' sont les clés privées donc secrètes +# limiter le nombre max de client simultanés 
-  * les ''.crt'' sont les certificats, publics +#max-clients 3
-  * ''dh1024.pem'' c'est les paramètres Diffie Hellman (algo de chiffrement)+
  
-====config serveur====+# activer la compression (à placer dans les confs clientes également) 
 +comp-lzo
  
-Créer l'interface tunnel +# augmenter ou diminuer le niveau de verbosité (de 0 à 15) pour debugger si ça monte pas ! 
-  /tmp/myvpn --mktun --dev tun0 +#verb 4 
-  ifconfig tun0 192.168.3.1 netmask 255.255.255.252 promisc up+</code>
  
-Ouvrir le port tcp/1194 et activer le routage entre ''br0'' et ''tun0'' +====Partie réseau====
-  iptables -I INPUT 1 -p tcp --dport 1194 -j ACCEPT +
-  iptables -I FORWARD -i br0 -o tun0 -j ACCEPT +
-  iptables -I FORWARD -i tun0 -o br0 -j ACCEPT+
  
-Le fichier de confpar exemple ''/tmp/server.ovpn'' +Pour transformer notre serveur en routeuron doit également 
-  # +  * activer le routage 
-  # Partie commune aux tunnels Bridgés/routés +<code bash> 
-  # +echo "1"/proc/sys/net/ipv4/ip_forward
-  dev tun0 +
-  comp-lzo +
-  port 1194 +
-  proto tcp-server +
-  verb 3 +
-  daemon +
-  # ping toutes les 15s ; considéré down au bout de 60s +
-  keepalive 15 60 +
-  persist-key +
-  persist-tun +
-   +
-  # +
-  # si on utilise une clé partagée +
-  # +
-  secret /tmp/static.key +
-   +
-  # +
-  # si on utilise des certificats +
-  # +
-  tls-server +
-  ca /tmp/openvpn/ca.crt +
-  dh /tmp/openvpn/dh1024.pem +
-  cert /tmp/openvpn/server.crt +
-  key /tmp/openvpn/server.key +
-   +
-  server 192.168.3.0 255.255.255.0 +
-  client-to-client +
-  max-clients 3+
  
-Lancer le serveur +# pour pérenniser ce paramètre après le prochain reboot, il faut l'écrire dans /etc/sysctl.conf : 
-  /tmp/myvpn --config /tmp/server.ovpn+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>
  
-====config client====+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>
  
-  # IP/port du serveur distant +=====Config client=====
-  client +
-  remote <IP_DU_SERVEUR> 1194 +
-  dev tun +
-  proto tcp-client +
-   +
-  # compression +
-  comp-lzo +
-  persist-key +
-  persist-tun +
-  pull +
-   +
-  # pre-shared key +
-  # secret static.key +
-   +
-  # TLS +
-  tls-client +
-  ca ca.crt +
-  cert dude.crt +
-  key dude.key+
  
 +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.
  
-====Conf avancée====+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>
  
-On peut spécifier une conf par certificat en modifiant ainsi la conf du serveur+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) : 
-  # indique ou sont situes les fichiers +<code bash> 
-  client-config-dir /tmp/openvpn/ccd +client 
-  #ccd-exclusive+dev tun 
 +proto udp 
 +remote <IP_DU_SERVER> 1194 
 +resolv-retry infinite 
 +nobind 
 +persist-key 
 +persist-tun 
 +ca /sdcard/Sync/Nexus9/openvpn/ca.crt 
 +cert /sdcard/Sync/Nexus9/openvpn/nexus9.crt 
 +key /sdcard/Sync/Nexus9/openvpn/nexus9.key 
 +ns-cert-type server 
 +comp-lzo 
 +verb 3 
 +</code> 
 +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===== 
 + 
 +Sur le serveur, on peut spécifier une configuration dédiée à un seul client en modifiant ainsi la conf : 
 +<code bash> 
 +# indique ou sont situes les fichiers dédiés 
 +client-config-dir /tmp/openvpn/ccd 
 +# interdit la connexion des clients qui n'ont pas de fichier dédié 
 +#ccd-exclusive 
 +</code> 
 +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>
 +# 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
 +# 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"
  
-  ifconfig-push 192.168.3.10 192.168.3.9 +# LAN pour que le serveur accède au réseau du client (via 192.168.3.10
-  push "route 192.168.2.0 255.255.255.0"+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>
  
-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 DD-WRT 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
  
 +''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) :
  
-Explications : +''mute 10'' permet de ne plus logguer les messages qui se répètent plus de 10 fois
-  * 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.+
  
 +=====Intégration système=====
  
-On peut couper la connexion si inactivité du client avec l'option ''--ping-restart <time>''+On va s'atteler à configurer les utilitaires du sytème pour une bonne intégration d'openvpn.
  
 +====Démarrage automatique====
  
-=====Conf qui marche=====+Pour lancer openvpn automatiquement au démarrage de la machine : 
 +<code bash> 
 +update-rc.d openvpn defaults 
 +</code>
  
-C'est un tunnel TLS routé. +====syslog====
-Les fichiers sont les suivants : +
-  * exécutable (lien symbolique myvpn -> /usr/sbin/openvpn) ''/tmp/openvpn/myvpn'' +
-  * fichier de conf du server : ''/tmp/openvpn/server.ovpn'' +
-  * certificat de l'autorité de certification : ''/tmp/openvpn/ca.crt'' +
-  * paramètres de chiffrement Diffie Hellman : ''/tmp/openvpn/dh1024.pem'' +
-  * certificat du serveur : ''/tmp/openvpn/server.crt'' +
-  * clé privée du serveur : ''/tmp/openvpn/server.key'' +
-  * paramètres spéciaux pour l'utilisateur dude : ''/tmp/openvpn/ccd/dude'' +
-Le serveur écoute en tcp/1165 et accepte jusqu'à 3 clients simultanés. +
-Les fichiers définissant paramètres particuliers sont dans ''/tmp/openvpn/ccd'' ; c'est le cas pour l'utilisateur dude. +
-La plage d'adresse du tunnel est 192.168.3.0/24 ; le serveur est le .1 ; dude est le .10.+
  
-====Serveur DD-WRT====+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"
  
-**server.ovpn** +# Save log events where the programname starts with ovpn like ovpn-server to the 
-  mode server +location mentioned in the template 
-  proto tcp-server +:programname, startswith, "ovpn--?OpenVPN
-  port 1165 +
-  dev tun0 +
-  daemon +
-  verb 3 +
-  comp-lzo +
-   +
-  server 192.168.3.0 255.255.255.0 +
-   +
-  client-config-dir /tmp/openvpn/ccd +
-  #ccd-exclusive +
-  client-to-client +
-  max-clients 3 +
-   +
-  keepalive 15 60 +
-  persist-key +
-  persist-tun +
-   +
-  # TLS +
-  tls-server +
-  ca /tmp/openvpn/ca.crt +
-  dh /tmp/openvpn/dh1024.pem +
-  cert /tmp/openvpn/server.crt +
-  key /tmp/openvpn/server.key+
  
-**/tmp/openvpn/ccd/dude** +# Stop processing ovpn-log events 
-  ifconfig-push 192.168.3.10 192.168.3.9 +:programname, startswith, "ovpn-" ~ 
-  push "route 192.168.2.0 255.255.255.0"+</code>
  
-====Client Windows====+Relancer ensuite le syslog : 
 +<code bash> 
 +systemctl restart rsyslog 
 +</code>
  
-**client.ovpn** +====logrotate====
-  client +
-  remote pteu.hd.free.fr 1165 +
-  dev tun +
-  proto tcp-client +
-   +
-  comp-lzo +
-  persist-key +
-  persist-tun +
-  pull +
-   +
-  # TLS +
-  tls-client +
-  ca ca.crt +
-  cert dude.crt +
-  key dude.key+
  
-''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.+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====
  
-=====Divers=====+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>
  
-''dev-node "nom_de_linterface_reseau"'' permet de spécifier quelle interface utiliser (elle doit être créée avec ''addtap''). +Et on défini les filtres dans ''/etc/fail2ban/filter.d/openvpn.conf'' 
-''crl-verify crl.pem'' pour spécifier une liste de révocation+<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>
  
 +
 +=====Divers=====
 +
 +  * ''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
 +  * ''status openvpn-status.log'' pour spécifier un fichier contenant la liste des clients connectés, mise à 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.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]] 
 +  * 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.1251922486.txt.gz · Last modified: 2013/10/14 20:55 (external edit)