informatique:logiciels:openvpn
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
informatique:logiciels:openvpn [2009/09/02 20:14] – pteu | informatique:logiciels:openvpn [2018/03/25 20:56] – [Divers] mauvais nsCertType 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-server server | ||
+ | ./build-key client1 | ||
+ | </ | ||
- | 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 |
+ | <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 |
- | Editer le fichier '' | + | <code bash> |
- | | + | ./build-dh |
- | ./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 | + | * les '' |
- | export KEY_CONFIG=/ | + | * les '' |
- | export KEY_DIR=/ | + | * '' |
- | 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===== |
- | ===Serveur | + | Pour une machine Windows : se connecter en webUI |
- | On procède presque | + | * dans Services / VPN, dans " |
- | ./build-key-server server | + | * pour chaque textarea il faut copier la clé comme suivant (c' |
- | | + | * dans **Public Server Cert** mettre le certificat |
+ | * laisser le champ **Certificate Revoke List** vide | ||
+ | * dans **Public Client Cert** copier la clé publique | ||
+ | * 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 | + | 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? | + | gunzip -c / |
- | + | </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 '' | + | 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 " | ||
- | ===Diffie Hellman=== | + | # on limite les risques en faisant tourner le deamon openvpn sous un utilisateur sans privilège |
+ | user nobody | ||
+ | group nogroup | ||
+ | </ | ||
- | Maintenant il faut générer les paramètres | + | D' |
- | | + | <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/ | ||
+ | server 192.168.3.0 255.255.255.0 | ||
- | ===Fichiers générés=== | + | # spécification de l' |
+ | # pour lister tous les algos possibles : " | ||
+ | # (NB : '' | ||
+ | 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 | + | |
- | 02.pem | + | |
- | ca.crt | + | |
- | * les '' | + | # limiter le nombre max de client simultanés |
- | * les '' | + | # |
- | * '' | + | |
- | ====config serveur==== | + | # activer la compression (à placer dans les confs clientes également) |
+ | comp-lzo | ||
- | Créer l' | + | # 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 '' | + | ====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 conf, par exemple ''/ | + | Pour transformer notre serveur en routeur, on doit également |
- | | + | |
- | # Partie commune aux tunnels Bridgés/ | + | <code bash> |
- | # | + | echo " |
- | 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 | + | |
- | + | ||
- | # | + | |
- | # si on utilise des certificats | + | |
- | # | + | |
- | tls-server | + | |
- | ca /tmp/openvpn/ca.crt | + | |
- | dh / | + | |
- | cert / | + | |
- | key / | + | |
- | + | ||
- | server 192.168.3.0 255.255.255.0 | + | |
- | client-to-client | + | |
- | max-clients 3 | + | |
- | Lancer | + | # pour pérenniser ce paramètre après |
- | /tmp/myvpn --config | + | vi /etc/sysctl.conf |
+ | net.ipv4.ip_forward=1 | ||
+ | </ | ||
+ | * activer le NAT pour le réseau du VPN (remplacer '' | ||
+ | <code bash> | ||
+ | iptables | ||
+ | </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, | ||
+ | # 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 | ||
+ | </ | ||
- | ====config | + | Pour pérenniser cette config, on peut utiliser le paquet **iptables-persistent** : |
+ | <code bash> | ||
+ | aptitude install iptables-persistent | ||
+ | / | ||
+ | </ | ||
- | # IP/port du serveur distant | + | =====Config |
- | | + | |
- | | + | Dans un premier temps on doit installer le logiciel |
- | 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 en modifiant ainsi la conf du serveur: | + | ====Intégrer |
- | # indique ou sont situes | + | |
- | client-config-dir / | + | |
- | # | + | |
- | * '' | + | 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 |
+ | <code bash> | ||
+ | #ca /sdcard/Sync/Nexus9/openvpn/ca.crt | ||
+ | < | ||
+ | -----BEGIN CERTIFICATE----- | ||
+ | MIIEoTCCA4mgAwIBAgIJAKWLtfNAkVCcMA0GCSqGSIb3DQEBCwUAMIGRMQswCQYD | ||
+ | [blabla...] | ||
+ | +/ | ||
+ | 9KljFHVPKEAFhZzokOREYCG+8yVA5F6Uk2miMw6ZVGDgbrYvWA== | ||
+ | -----END CERTIFICATE----- | ||
+ | </ | ||
+ | </ | ||
- | ifconfig-push 192.168.3.10 192.168.3.9 | + | Cela simplifie beaucoup la mise en œuvre, mais possède l' |
- | push "route 192.168.2.0 255.255.255.0" | + | =====Conf avancée===== |
- | De cette façon | + | Sur le serveur, |
+ | <code bash> | ||
+ | # indique ou sont situes les fichiers dédiés | ||
+ | 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 | ||
+ | ifconfig-push 192.168.3.10 | ||
+ | # une route pour que le client puisse avoir accès à un réseau | ||
+ | # sa passerelle sera l'IP du tunnel du serveur (.9) | ||
+ | push " | ||
+ | |||
+ | # LAN pour que le serveur accède au réseau | ||
+ | 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" | ||
+ | </ | ||
- | * '' | ||
**Le driver TAP sous Windows impose l' | **Le driver TAP sous Windows impose l' | ||
- | Sachant que DD-WRT ne permet par d'utiliser la première plage d'adresse, la 192.168.0.0/ | + | On peut couper la connexion si inactivité du client avec l' |
+ | '' | ||
- | Explications : | + | '' |
- | * créer | + | |
+ | '' | ||
- | On peut couper la connexion si inactivité du client avec l' | + | =====Intégration système===== |
+ | On va s' | ||
- | =====Conf qui marche===== | + | ====Démarrage automatique==== |
- | C'est un tunnel TLS routé. | + | Pour lancer |
- | Les fichiers sont les suivants : | + | <code bash> |
- | * exécutable (lien symbolique myvpn -> /usr/sbin/openvpn) ''/ | + | update-rc.d openvpn |
- | * fichier | + | </code> |
- | * 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==== | + | ====syslog==== |
- | **server.ovpn** | + | Pour orienter les log du daemon |
- | mode server | + | <code bash> |
- | proto tcp-server | + | # Create a template for the vpn log location |
- | port 1165 | + | $template OpenVPN," |
- | dev tun0 | + | |
- | | + | |
- | verb 3 | + | |
- | comp-lzo | + | |
- | + | ||
- | server 192.168.3.0 255.255.255.0 | + | |
- | + | ||
- | client-config-dir | + | |
- | # | + | |
- | client-to-client | + | |
- | max-clients 3 | + | |
- | + | ||
- | keepalive 15 60 | + | |
- | persist-key | + | |
- | persist-tun | + | |
- | | + | |
- | # TLS | + | |
- | | + | |
- | ca /tmp/openvpn/ | + | |
- | dh /tmp/openvpn/dh1024.pem | + | |
- | cert / | + | |
- | key / | + | |
- | **/ | + | # Save log events where the programname starts with ovpn like ovpn-server to the |
- | ifconfig-push 192.168.3.10 192.168.3.9 | + | # location mentioned in the template |
- | | + | : |
- | ====Client Windows==== | + | # Stop processing ovpn-* log events |
+ | : | ||
+ | </ | ||
- | **client.ovpn** | + | Relancer ensuite le syslog : |
- | | + | <code bash> |
- | | + | systemctl restart rsyslog |
- | dev tun | + | </ |
- | proto tcp-client | + | |
- | + | ====logrotate==== | |
- | 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.txt · Last modified: 2018/08/20 12:49 by pteu