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 [2009/06/08 20:15] – édition externe 127.0.0.1 | informatique:logiciels:openvpn [2018/08/20 12:49] (current) – [Générer les certificats] pteu | ||
---|---|---|---|
Line 1: | Line 1: | ||
{{tag> | {{tag> | ||
- | |||
======OpenVPN====== | ======OpenVPN====== | ||
- | OpenVPN est un logiciel libre multi-plateforme permettant de créer un VPN. | ||
- | Ce mode opératoire décrit | + | {{: |
+ | |||
+ | [[https:// | ||
+ | |||
+ | **Ce mode opératoire décrit | ||
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é** | + | * tunnel **bridgé** = il obtient une adresse |
- | * tunnel **routé** on utilise une interface **tun** qui défini | + | * tunnel **routé** on utilise une interface **tun** qui définit |
- | 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' |
- | On peut spécifier un fichier | + | 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 |
- | =====Tunnel bridgé===== | + | =====Générer les certificats===== |
- | ====Générer | + | La première chose pour utiliser l' |
- | 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/ |
+ | <code bash> | ||
+ | aptitude install openvpn | ||
+ | </ | ||
- | ====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 **/ |
+ | <code bash> | ||
+ | mkdir / | ||
+ | cp -R / | ||
- | Créer l' | + | # alternative pour Debian 8 : |
- | | + | cp -a / |
- | L' | + | # puis dans tous les cas, aller dans le répertoire copié |
- | brctl addif br0 tap0 | + | cd / |
- | | + | </ |
- | 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 / | + | |
- | Ouvrir | + | Pour cela, éditer |
- | | + | <code bash> |
+ | export KEY_COUNTRY=" | ||
+ | export KEY_PROVINCE=" | ||
+ | export KEY_CITY=" | ||
+ | export KEY_ORG=" | ||
+ | export KEY_EMAIL=" | ||
+ | export KEY_OU=" | ||
- | Lancer le serveur | + | # X509 Subject Field |
- | / | + | export KEY_NAME=" |
+ | </code> | ||
- | ====Config client==== | + | Puis intégrer ces variables et supprimer les précédents éventuels certificats présents dans le répertoire '' |
+ | <code bash> | ||
+ | source vars | ||
+ | ./ | ||
+ | </ | ||
- | 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 '' | + | ====CA==== |
- | **client.ovpn** | + | Pour générer la paire de clé de la CA : |
- | | + | <code bash> |
- | port 1194 | + | ./build-ca |
- | dev tap | + | </ |
- | secret static.key | + | L' |
- | proto tcp-client | + | |
- | comp-lzo | + | |
+ | Par sécurité il vaut mieux saisir un " | ||
- | =====Tunnel routé===== | + | Si tout se passe bien, le répertoire '' |
- | ====Générer les certificats==== | + | ====Serveur et client==== |
- | La première chose pour utiliser l' | + | On procède presque |
+ | <code bash> | ||
+ | ./ | ||
+ | ./build-key client1 | ||
+ | </ | ||
- | Nous allons voir comment générer des certificats sous Ubuntu. Mais l'installation devrait ressembler sur les autres Linux, et même sous Windows. Les manips qui vont suivre se font en root. | + | A chaque clé un prompt vous demande s'il faut signer |
+ | <code bash> | ||
+ | Certificate is to be certified until Sep 2 15:10:41 2019 GMT (3650 days) | ||
+ | Sign the certificate? | ||
+ | |||
+ | 1 out of 1 certificate requests certified, commit? [y/n]y | ||
+ | Write out database with 1 new entries | ||
+ | Data Base Updated | ||
+ | </ | ||
- | OpenVPN contient des outils permettant de générer facilement des couples de clés. Ils sont situés dans le répertoire **/ | + | ====Diffie Hellman==== |
- | ### cp -R / | + | |
- | cd / | + | |
- | ===CA=== | + | Maintenant il faut générer |
- | Editer le fichier vars et remplir | + | <code bash> |
- | ./vars | + | ./ |
- | ./clean-all | + | |
- | ./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> |
- | | + | ls keys/ |
- | | + | 01.pem |
+ | 02.pem | ||
+ | ca.crt | ||
+ | </ | ||
- | .. 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 '' |
- | | + | |
- | | + | |
- | export KEY_SIZE=1024 | + | |
- | + | ||
- | export KEY_COUNTRY=FR | + | |
- | export KEY_PROVINCE=NA | + | |
- | export KEY_CITY=PARIS | + | |
- | export KEY_ORG=" | + | |
- | export KEY_EMAIL=" | + | |
- | Finalement si ça marche on obtient cette sortie : | ||
- | ./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) [pt3u corp]: | ||
- | Organizational Unit Name (eg, section) []: | ||
- | Common Name (eg, your name or your server' | ||
- | Email Address [me@myhost.mydomain]: | ||
- | .. suivi de prompt qui utiliseront les variables d' | + | =====Config serveur===== |
- | Les clés générées sont mise dans le dossier '' | + | Pour une machine Windows : se connecter en webUI |
+ | * dans Services | ||
+ | * pour chaque textarea il faut copier la clé comme suivant (c'est-à-dire coller le contenu de chaque fichier cité) : | ||
+ | * 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 | ||
- | ===Server et client=== | + | Pour une machine Linux on peut s' |
- | 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 | + | gunzip -c /usr/ |
- | | + | </code> |
- | A chaque | + | Le fichier de conf de base est très complet et contient des explication et des exemples pour chaque |
- | Certificate is to be certified until Mar 15 18:25:51 2018 GMT (3650 days) | + | <code bash> |
- | Sign the certificate? | + | # préciser où sont les certificats et DH |
- | + | ca /etc/ | |
- | + | cert / | |
- | 1 out of 1 certificate requests certified, commit? [y/n]y | + | key / |
+ | dh / | ||
- | Au final toutes les clés générées sont situées | + | # on modifie la passerelle du client pour faire passer tout son trafic |
- | * '' | + | push " |
- | * '' | + | # on modifie |
+ | push " | ||
+ | # on limite les risques en faisant tourner le deamon openvpn sous un utilisateur sans privilège | ||
+ | user nobody | ||
+ | group nogroup | ||
+ | </ | ||
- | ===Diffie Hellman=== | + | 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" | ||
- | Maintenant il faut générer | + | # le réseau utilisé pour les tunnels |
- | ./build-dh | + | # NB : OpenVPN utilise l' |
- | | + | # les /30 suivants sont pour chaque tunnel |
- | This is going to take a long time | + | # 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 |
+ | # spécification de l' | ||
+ | # pour lister tous les algos possibles : " | ||
+ | # (NB : '' | ||
+ | cipher AES-256-CBC | ||
- | ===Fichiers générés=== | + | # activer la communication entre les clients |
+ | client-to-client | ||
- | Les fichiers que l'on a générés : | + | # limiter le nombre max de client simultanés |
- | ls keys/ | + | # |
- | 01.pem | + | |
- | 02.pem | + | |
- | ca.crt | + | |
- | * les '' | + | # activer la compression (à placer dans les confs clientes également) |
- | * les '' | + | comp-lzo |
- | * '' | + | |
- | ====config serveur==== | + | # augmenter ou diminuer le niveau de verbosité (de 0 à 15) pour debugger si ça monte pas ! |
+ | #verb 4 | ||
+ | </ | ||
- | Créer l' | + | ====Partie réseau==== |
- | /tmp/myvpn --mktun --dev tun0 | + | |
- | ifconfig tun0 192.168.3.1 netmask 255.255.255.252 promisc up | + | |
- | Ouvrir le port tcp/1164 et activer le routage | + | Pour transformer notre serveur en routeur, on doit également : |
- | | + | * activer le routage |
- | | + | <code bash> |
- | iptables -I FORWARD -i tun0 -o br0 -j ACCEPT | + | echo " |
- | Le fichier de conf, par exemple ''/tmp/server.ovpn'' | + | # pour pérenniser ce paramètre après le prochain reboot, il faut l'écrire dans /etc/sysctl.conf : |
- | # | + | vi /etc/ |
- | # Partie commune aux tunnels Bridgés/routés | + | net.ipv4.ip_forward=1 |
- | # | + | </ |
- | dev tun0 | + | |
- | | + | <code bash> |
- | port 1194 | + | iptables |
- | proto tcp-server | + | </ |
- | verb 3 | + | |
- | | + | <code bash> |
- | # ping toutes | + | # connexions ouvertes |
- | | + | iptables -A FORWARD |
- | | + | # 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 |
- | # si on utilise une clé partagée | + | 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 | |
- | | + | </ |
- | # si on utilise des certificats | + | |
- | # | + | |
- | tls-server | + | |
- | ca / | + | |
- | dh / | + | |
- | cert / | + | |
- | key / | + | |
- | + | ||
- | server 192.168.3.0 255.255.255.0 | + | |
- | client-to-client | + | |
- | | + | |
- | Lancer | + | Pour pérenniser cette config, on peut utiliser |
- | / | + | <code bash> |
+ | aptitude install iptables-persistent | ||
+ | /etc/init.d/ | ||
+ | </ | ||
- | ====config | + | =====Config |
- | # IP/port du serveur distant | + | Dans un premier temps on doit installer le logiciel |
- | | + | |
- | remote < | + | |
- | 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 | + | |
- | | + | |
+ | Pour la configuration, | ||
+ | <code bash> | ||
+ | cp / | ||
+ | </ | ||
- | ====Conf avancée==== | + | Le fichier de conf est très similaire à celui du serveur ; voici un exemple de conf pour une tablette (l' |
+ | <code bash> | ||
+ | client | ||
+ | dev tun | ||
+ | proto udp | ||
+ | remote < | ||
+ | resolv-retry infinite | ||
+ | nobind | ||
+ | persist-key | ||
+ | persist-tun | ||
+ | ca / | ||
+ | cert / | ||
+ | key / | ||
+ | ns-cert-type server | ||
+ | comp-lzo | ||
+ | verb 3 | ||
+ | </ | ||
+ | NB : avec OpenVPN Connect, le fichier de conf doit avoir l' | ||
- | On peut spécifier une conf par certificat | + | ====Intégrer les certificats dans le fichier de configuration==== |
- | # indique ou sont situes les fichiers | + | |
- | client-config-dir / | + | Plutôt que de pointer vers des fichiers externes, openvpn permet d' |
- | # | + | <code bash> |
+ | #ca / | ||
+ | < | ||
+ | -----BEGIN CERTIFICATE----- | ||
+ | MIIEoTCCA4mgAwIBAgIJAKWLtfNAkVCcMA0GCSqGSIb3DQEBCwUAMIGRMQswCQYD | ||
+ | [blabla...] | ||
+ | +/ | ||
+ | 9KljFHVPKEAFhZzokOREYCG+8yVA5F6Uk2miMw6ZVGDgbrYvWA== | ||
+ | -----END CERTIFICATE----- | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Cela simplifie beaucoup la mise en œuvre, mais possède l' | ||
+ | =====Conf avancée===== | ||
+ | |||
+ | Sur le serveur, on peut spécifier une configuration dédiée à un seul client | ||
+ | <code bash> | ||
+ | # 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, | + | |
+ | =====Intégration système===== | ||
- | On peut couper la connexion si inactivité | + | On va s' |
+ | ====Démarrage automatique==== | ||
- | =====Conf qui marche===== | + | Pour lancer openvpn automatiquement au démarrage de la machine : |
+ | <code bash> | ||
+ | update-rc.d openvpn defaults | ||
+ | </ | ||
- | C'est un tunnel TLS routé. | + | ====syslog==== |
- | Les fichiers sont les suivants : | + | |
- | * exécutable (lien symbolique myvpn -> / | + | |
- | * fichier de conf du server : ''/ | + | |
- | * certificat de l' | + | |
- | * paramètres de chiffrement Diffie Hellman : ''/ | + | |
- | * certificat du serveur : ''/ | + | |
- | * clé privée du serveur : ''/ | + | |
- | * paramètres spéciaux pour l' | + | |
- | Le serveur écoute en tcp/1165 et accepte jusqu' | + | |
- | Les fichiers définissant paramètres particuliers sont dans ''/ | + | |
- | La plage d' | + | |
- | ====Serveur DD-WRT==== | + | Pour orienter les log du daemon openvpn, on peut définir l' |
+ | <code bash> | ||
+ | # Create a template for the vpn log location | ||
+ | $template OpenVPN,"/ | ||
- | **server.ovpn** | + | # Save log events where the programname starts with ovpn like ovpn-server |
- | mode server | + | # location mentioned in the template |
- | proto tcp-server | + | : |
- | port 1165 | + | |
- | dev tun0 | + | |
- | daemon | + | |
- | verb 3 | + | |
- | comp-lzo | + | |
- | + | ||
- | server 192.168.3.0 255.255.255.0 | + | |
- | + | ||
- | client-config-dir / | + | |
- | | + | |
- | | + | |
- | max-clients 3 | + | |
- | + | ||
- | keepalive 15 60 | + | |
- | persist-key | + | |
- | persist-tun | + | |
- | + | ||
- | # TLS | + | |
- | tls-server | + | |
- | ca / | + | |
- | dh / | + | |
- | cert / | + | |
- | key / | + | |
- | **/ | + | # Stop processing ovpn-* log events |
- | | + | : |
- | push "route 192.168.2.0 255.255.255.0" | + | </ |
- | ====Client Windows==== | + | Relancer ensuite le syslog : |
+ | <code bash> | ||
+ | systemctl restart rsyslog | ||
+ | </ | ||
- | **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 | + | |
- | '' | + | Une configuration classique, à déposer dans '' |
+ | <code bash> | ||
+ | / | ||
+ | { | ||
+ | rotate 12 | ||
+ | size 500M | ||
+ | monthly | ||
+ | missingok | ||
+ | notifempty | ||
+ | delaycompress | ||
+ | compress | ||
+ | copytruncate | ||
+ | } | ||
+ | </ | ||
+ | ====fail2ban==== | ||
- | =====Divers===== | + | On déclare le fichier à surveiller dans en créant un ''/ |
+ | <code bash> | ||
+ | [openvpn] | ||
+ | enabled | ||
+ | protocol | ||
+ | port | ||
+ | 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:// | ||
* 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:// | ||
+ | * 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.1244492135.txt.gz · Last modified: 2013/10/14 20:55 (external edit)