informatique:logiciels:openvpn
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| informatique:logiciels:openvpn [2013/04/26 18:24] – pteu | informatique: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). | + | {{: |
| - | **Ce mode opératoire décrit la mise en place d'un tunnel routé avec certificats entre un serveur | + | [[https:// |
| + | |||
| + | **Ce mode opératoire décrit la mise en place d'un tunnel routé avec certificats entre un serveur | ||
| 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 15: | ||
| ... et 2 types d' | ... et 2 types d' | ||
| * par **pre-shared key** (clé partagée) : ne permet qu'un seul client simultané, l' | * par **pre-shared key** (clé partagée) : ne permet qu'un seul client simultané, l' | ||
| - | * par **certificat** : plus long à mettre en place, l' | + | * par **certificat** : plus long à mettre en place, l' |
| - | 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 | + | 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. |
| =====Générer les certificats===== | =====Générer les certificats===== | ||
| - | La première chose pour utiliser l' | + | La première chose pour utiliser l' |
| - | Nous allons voir comment générer des certificats sous Ubuntu | + | Nous allons voir comment générer des certificats sous Linux (mais c'est aussi faisable sous Windows avec les mêmes |
| - | Installation du paquet Openvpn sous Ubuntu : | + | Installation du paquet Openvpn sous Debian/Ubuntu : |
| <code bash> | <code bash> | ||
| - | sudo su - | ||
| aptitude install openvpn | aptitude install openvpn | ||
| </ | </ | ||
| - | OpenVPN contient des outils permettant de générer facilement des couples de clés. Ils sont situés dans le répertoire **/ | + | **OpenVPN** contient des outils permettant de générer facilement des couples de clés. Ils sont situés dans le répertoire **/ |
| <code bash> | <code bash> | ||
| - | mkdir / | + | mkdir / |
| cp -R / | cp -R / | ||
| + | |||
| + | # alternative pour Debian 8 : | ||
| + | cp -a / | ||
| + | |||
| + | # puis dans tous les cas, aller dans le répertoire copié | ||
| cd / | cd / | ||
| </ | </ | ||
| - | ====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 | + | Pour cela, éditer |
| <code bash> | <code bash> | ||
| - | source | + | export KEY_COUNTRY=" |
| + | export KEY_PROVINCE=" | ||
| + | export KEY_CITY=" | ||
| + | export KEY_ORG=" | ||
| + | export KEY_EMAIL=" | ||
| + | export KEY_OU=" | ||
| + | |||
| + | # X509 Subject Field | ||
| + | export KEY_NAME=" | ||
| + | </code> | ||
| + | |||
| + | Puis intégrer ces variables et supprimer les précédents éventuels certificats présents dans le répertoire '' | ||
| + | <code bash> | ||
| + | source | ||
| ./clean-all | ./clean-all | ||
| - | ./build-ca | ||
| </ | </ | ||
| - | Finalement si ça marche on obtient cette sortie | + | ====CA==== |
| + | |||
| + | Pour générer la paire de clé de la CA : | ||
| <code bash> | <code bash> | ||
| ./build-ca | ./build-ca | ||
| - | Generating a 1024 bit RSA private key | ||
| - | ..................................++++++ | ||
| - | ...........++++++ | ||
| - | writing new private key to ' | ||
| - | ----- | ||
| - | 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 ' | ||
| - | ----- | ||
| - | Country Name (2 letter code) [FR]: | ||
| - | State or Province Name (full name) [NA]: | ||
| - | Locality Name (eg, city) [Paris]: | ||
| - | Organization Name (eg, company) [pt3uz_corp]: | ||
| - | Organizational Unit Name (eg, section) []: | ||
| - | Common Name (eg, your name or your server' | ||
| - | Email Address [me@myhost.mydomain]: | ||
| </ | </ | ||
| + | L' | ||
| + | |||
| + | Par sécurité il vaut mieux saisir un " | ||
| - | .. suivi de prompt qui utiliseront les variables d' | + | Si tout se passe bien, le répertoire |
| ====Serveur et client==== | ====Serveur et client==== | ||
| Line 79: | Line 83: | ||
| ./build-key client1 | ./build-key client1 | ||
| </ | </ | ||
| - | |||
| - | NB : Ne pas mettre de " | ||
| A chaque clé un prompt vous demande s'il faut signer les clés avec le CA ; il faut dire oui (" | A chaque clé un prompt vous demande s'il faut signer les clés avec le CA ; il faut dire oui (" | ||
| Line 91: | Line 93: | ||
| Data Base Updated | Data Base Updated | ||
| </ | </ | ||
| - | |||
| - | Au final toutes les clés générées sont situées dans le répertoire '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| ====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 |
| <code bash> | <code bash> | ||
| ./build-dh | ./build-dh | ||
| Line 108: | Line 105: | ||
| | | ||
| </ | </ | ||
| + | (NB : maintenant c'est plutôt 2048 bits) | ||
| ====Fichiers générés==== | ====Fichiers générés==== | ||
| Line 122: | Line 119: | ||
| * les '' | * les '' | ||
| * les '' | * les '' | ||
| - | * '' | + | * '' |
| =====Config serveur===== | =====Config serveur===== | ||
| - | Se connecter en webUI | + | Pour une machine Windows : se connecter en webUI |
| * dans Services / VPN, dans " | * dans Services / VPN, dans " | ||
| * pour chaque textarea il faut copier la clé comme suivant (c' | * pour chaque textarea il faut copier la clé comme suivant (c' | ||
| Line 138: | Line 135: | ||
| * 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' |
| <code bash> | <code bash> | ||
| - | # envoyer cette route aux clients | + | gunzip -c /usr/share/doc/ |
| - | push "route 192.168.3.0 255.255.255.0" | + | </ |
| - | # le réseau utilisé pour le tunnel | + | |
| - | # NB : OpenVPN utilise l'IP .1 du premier | + | |
| - | # les premières IPs des /30 suivants sont pour chaque client | + | |
| - | # ex : 192.168.3.5/30 pour le premier client, 192.168.3.9/30 pour le second, | + | |
| - | server 192.168.3.0 255.255.255.0 | + | |
| - | # tunnel tcp routé | + | 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 : |
| - | dev tun0 | + | <code bash> |
| - | proto tcp | + | # préciser où sont les certificats et DH |
| - | #port 1194 #si port différent du défaut | + | ca / |
| + | cert / | ||
| + | key / | ||
| + | dh / | ||
| - | # ping toutes les 10s ; considéré down au bout de 120s | + | # on modifie la passerelle du client pour faire passer tout son trafic dans le VPN |
| - | keepalive 10 120 | + | push " |
| + | # on modifie le DNS du client par celui du serveur | ||
| + | push " | ||
| - | # spécification des clés | + | # on limite les risques en faisant tourner le deamon |
| - | dh /tmp/openvpn/dh.pem | + | user nobody |
| - | ca / | + | group nogroup |
| - | cert / | + | </code> |
| - | key / | + | |
| - | # spécification de l'algo de chiffrement | + | D' |
| - | cipher AES-128-CBC | + | <code bash> |
| + | # 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" | ||
| + | |||
| + | # 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/ | ||
| + | server 192.168.3.0 255.255.255.0 | ||
| + | |||
| + | # spécification de l'algorithme | ||
| + | # pour lister tous les algos possibles : " | ||
| + | # (NB : '' | ||
| + | cipher AES-256-CBC | ||
| # activer la communication entre les clients | # activer la communication entre les clients | ||
| client-to-client | client-to-client | ||
| - | #verb 3 # | + | # limiter |
| - | + | ||
| - | #comp-lzo #activer la compression (à placer dans les confs clientes également) | + | |
| # | # | ||
| + | |||
| + | # activer la compression (à placer dans les confs clientes également) | ||
| + | comp-lzo | ||
| + | |||
| + | # augmenter ou diminuer le niveau de verbosité (de 0 à 15) pour debugger si ça monte pas ! | ||
| + | #verb 4 | ||
| + | </ | ||
| + | |||
| + | ====Partie réseau==== | ||
| + | |||
| + | Pour transformer notre serveur en routeur, on doit également : | ||
| + | * activer le routage | ||
| + | <code bash> | ||
| + | echo " | ||
| + | |||
| + | # pour pérenniser ce paramètre après le prochain reboot, il faut l' | ||
| + | vi / | ||
| + | net.ipv4.ip_forward=1 | ||
| + | </ | ||
| + | * activer le NAT pour le réseau du VPN (remplacer '' | ||
| + | <code bash> | ||
| + | iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE | ||
| + | </ | ||
| + | * 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, | ||
| + | # 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 | ||
| + | </ | ||
| + | |||
| + | Pour pérenniser cette config, on peut utiliser le paquet **iptables-persistent** : | ||
| + | <code bash> | ||
| + | aptitude install iptables-persistent | ||
| + | / | ||
| </ | </ | ||
| =====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, | ||
| + | <code bash> | ||
| + | cp / | ||
| + | </ | ||
| + | |||
| + | Le fichier de conf est très similaire à celui du serveur ; voici un exemple de conf pour une tablette (l' | ||
| <code bash> | <code bash> | ||
| client | client | ||
| dev tun | dev tun | ||
| - | + | proto udp | |
| - | proto tcp | + | remote |
| - | remote | + | resolv-retry infinite |
| - | + | ||
| - | # utiliser un port client specifique | + | |
| nobind | nobind | ||
| - | |||
| persist-key | persist-key | ||
| persist-tun | persist-tun | ||
| - | + | ca / | |
| - | # SSL/TLS parms. | + | cert / |
| - | ca ca.crt | + | 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 | ||
| </ | </ | ||
| + | NB : avec OpenVPN Connect, le fichier de conf doit avoir l' | ||
| + | ====Intégrer les certificats dans le fichier de configuration==== | ||
| + | |||
| + | Plutôt que de pointer vers des fichiers externes, openvpn permet d' | ||
| + | <code bash> | ||
| + | #ca / | ||
| + | <ca> | ||
| + | -----BEGIN CERTIFICATE----- | ||
| + | MIIEoTCCA4mgAwIBAgIJAKWLtfNAkVCcMA0GCSqGSIb3DQEBCwUAMIGRMQswCQYD | ||
| + | [blabla...] | ||
| + | +/ | ||
| + | 9KljFHVPKEAFhZzokOREYCG+8yVA5F6Uk2miMw6ZVGDgbrYvWA== | ||
| + | -----END CERTIFICATE----- | ||
| + | </ca> | ||
| + | </ | ||
| + | |||
| + | Cela simplifie beaucoup la mise en œuvre, mais possède l' | ||
| =====Conf avancée===== | =====Conf avancée===== | ||
| - | On peut spécifier une conf par certificat | + | Sur le serveur, on peut spécifier une configuration dédiée à un seul client |
| - | # indique ou sont situes les fichiers | + | <code bash> |
| - | client-config-dir / | + | # indique ou sont situes les fichiers |
| - | # | + | client-config-dir / |
| + | # interdit la connexion des clients qui n'ont pas de fichier dédié | ||
| + | # | ||
| + | </ | ||
| + | Ensuite place la config dédiée dans fichier portant le nom du client (le **Common Name** (CN) de son certificat). | ||
| * '' | * '' | ||
| + | <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 | + | # LAN pour que le serveur accède au réseau du client (via 192.168.3.10) |
| - | | + | iroute |
| + | # NB : on doit ajouter également dans la conf serveur : "route 192.168.100.0 255.255.255.0" | ||
| + | </ | ||
| - | De cette façon on attribue au client toto l'IP 192.168.3.10 ; sa gateway (l'autre bout du tunnel) sera 192.168.3.9 | + | **Le driver TAP sous Windows impose |
| - | * '' | + | On peut couper la connexion si inactivité du client avec l'option |
| - | **Le driver TAP sous Windows impose | + | |
| - | Sachant que DD-WRT ne permet par d'utiliser la première plage d'adresse, la 192.168.0.0/ | + | '' |
| + | '' | ||
| - | Explications : | + | '' |
| - | * créer une interco = un réseau /30 (255.255.255.252, | + | |
| - | On peut couper la connexion si inactivité du client avec l' | + | =====Intégration système===== |
| - | < | + | On va s' |
| - | '' | + | |
| - | '' | + | ====Démarrage automatique==== |
| + | |||
| + | Pour lancer openvpn automatiquement au démarrage de la machine : | ||
| + | < | ||
| + | update-rc.d openvpn defaults | ||
| </ | </ | ||
| + | ====syslog==== | ||
| - | =====Divers===== | + | Pour orienter les log du daemon openvpn, on peut définir l' |
| + | <code bash> | ||
| + | # Create a template for the vpn log location | ||
| + | $template OpenVPN,"/ | ||
| - | '' | + | # Save log events where the programname starts with ovpn like ovpn-server to the |
| - | '' | + | # location mentioned in the template |
| + | : | ||
| + | # Stop processing ovpn-* log events | ||
| + | : | ||
| + | </ | ||
| + | |||
| + | Relancer ensuite le syslog : | ||
| + | <code bash> | ||
| + | systemctl restart rsyslog | ||
| + | </ | ||
| + | |||
| + | ====logrotate==== | ||
| + | |||
| + | Une configuration classique, à déposer dans ''/ | ||
| + | <code bash> | ||
| + | / | ||
| + | { | ||
| + | rotate 12 | ||
| + | size 500M | ||
| + | monthly | ||
| + | missingok | ||
| + | notifempty | ||
| + | delaycompress | ||
| + | compress | ||
| + | copytruncate | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ====fail2ban==== | ||
| + | |||
| + | On déclare le fichier à surveiller dans en créant un ''/ | ||
| + | <code bash> | ||
| + | [openvpn] | ||
| + | enabled = true | ||
| + | protocol = udp | ||
| + | port = 5594 | ||
| + | filter | ||
| + | logpath = / | ||
| + | </ | ||
| + | |||
| + | Et on défini les filtres dans ''/ | ||
| + | <code bash> | ||
| + | [Definition] | ||
| + | failregex = < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | |||
| + | =====Divers===== | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| =====Liens===== | =====Liens===== | ||
| + | * Documentation officielle : [[https:// | ||
| * installation d' | * installation d' | ||
| * [[http:// | * [[http:// | ||
| * [[http:// | * [[http:// | ||
| * HOWTO du site officiel : http:// | * HOWTO du site officiel : http:// | ||
| + | * Miscellaneous : https:// | ||
| * OpenVPN 2 HOWTO français : http:// | * OpenVPN 2 HOWTO français : http:// | ||
| * tunnel routé sous Ubuntu : http:// | * tunnel routé sous Ubuntu : http:// | ||
| * [[http:// | * [[http:// | ||
| + | * Pour faire fonctionner le serveur OpenVPN de la Freebox Révolution avec le client OpenVPN : [[https:// | ||
| + | <code bash> | ||
| + | topology subnet | ||
| + | # copier/ | ||
| + | ifconfig 192.168.27.65 255.255.255.224 | ||
| + | # empêche d' | ||
| + | pull-filter ignore " | ||
| + | # ip de l' | ||
| + | route-gateway 192.168.27.94 | ||
| + | </ | ||
informatique/logiciels/openvpn.1367000668.txt.gz · Last modified: 2013/10/14 20:55 (external edit)