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/10/14 20:45] – modification externe 127.0.0.1 | 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' | ||
- | .. suivi de prompt qui utiliseront les variables d'environnement précédemment enregistrées. Seul '' | + | Par sécurité il vaut mieux saisir un " |
+ | |||
+ | 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 (réseau de votre LAN) | + | gunzip -c / |
+ | </ | ||
+ | |||
+ | 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 / | ||
+ | cert / | ||
+ | key / | ||
+ | dh / | ||
+ | |||
+ | # on modifie la passerelle du client pour faire passer tout son trafic dans le VPN | ||
+ | push " | ||
+ | # on modifie le DNS du client par celui du serveur | ||
+ | push " | ||
+ | |||
+ | # on limite les risques en faisant tourner le deamon openvpn sous un utilisateur sans privilège | ||
+ | user nobody | ||
+ | group nogroup | ||
+ | </ | ||
+ | |||
+ | D' | ||
+ | <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" | 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/ | # ex : 192.168.3.4/ | ||
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 / | ||
- | ca / | ||
- | cert / | ||
- | key / | ||
# spécification de l' | # spécification de l' | ||
- | cipher AES-128-CBC | + | # pour lister tous les algos possibles : " |
+ | # (NB : '' | ||
+ | cipher AES-256-CBC | ||
# activer la communication entre les clients | # activer la communication entre les clients | ||
Line 176: | Line 183: | ||
comp-lzo | comp-lzo | ||
- | # activer | + | # augmenter ou diminuer |
#verb 4 | #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 aléatoire | + | |
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' | ||
- | # au besoin... | + | ====Intégrer les certificats dans le fichier de configuration==== |
- | #verb 4 | + | |
+ | Plutôt que de pointer vers des fichiers externes, openvpn permet d' | ||
+ | <code bash> | ||
+ | #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 |
<code bash> | <code bash> | ||
- | # indique ou sont situes les fichiers | + | # indique ou sont situes les fichiers |
client-config-dir / | 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> | <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" | ||
</ | </ | ||
- | 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.1381783502.txt.gz · Last modified: 2016/04/16 21:51 (external edit)