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/09/04 16:17] – pteu | 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-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 | ||
+ | </ | ||
- | Installation du paquet openvpn sous Ubuntu : | + | ====Diffie Hellman==== |
- | sudo bash | + | |
- | echo "je sais c'est mal." | + | |
- | aptitude install openvpn | + | |
- | OpenVPN contient des outils permettant de générer | + | Maintenant il faut générer |
- | mkdir / | + | <code bash> |
- | cp -R / | + | ./build-dh |
- | | + | |
+ | This is going to take a long time | ||
+ | .......+......................................................+................. | ||
+ | | ||
+ | | ||
+ | </code> | ||
+ | (NB : maintenant c'est plutôt 2048 bits) | ||
- | ===CA=== | + | ====Fichiers générés==== |
- | Editer le fichier '' | + | |
- | source ./vars | + | |
- | ./ | + | |
- | ./build-ca | + | |
- | Finalement si ça marche | + | Les fichiers que l'on a générés |
- | ./build-ca | + | <code bash> |
- | | + | ls keys/ |
- | | + | 01.pem |
- | ...........++++++ | + | 02.pem dh1024.pem dude.key index.txt.attr.old serial.old server.key |
- | writing new private key to 'ca.key' | + | ca.crt dude.crt index.txt |
- | | + | </code> |
- | 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 | + | |
- | 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]: | + | |
- | .. suivi de prompt qui utiliseront | + | * les '' |
+ | * les '' | ||
+ | * ''dh1024.pem'' | ||
- | ===Serveur et client=== | ||
- | On procède presque de la même façon pour générer les certificats du serveur et des clients : | ||
- | ./ | ||
- | ./build-key client1 | ||
- | NB : Ne pas mettre de " | + | =====Config serveur===== |
- | A chaque | + | Pour une machine Windows : se connecter en webUI |
- | Certificate | + | * dans Services / VPN, dans " |
- | Sign the certificate? | + | * pour chaque |
- | + | * dans **Public Server Cert** mettre le certificat de la CA (**ca.crt**) | |
- | 1 out of 1 certificate requests certified, commit? [y/n]y | + | * laisser le champ **Certificate |
- | Write out database with 1 new entries | + | * dans **Public Client Cert** copier la clé publique du serveur |
- | Data Base Updated | + | * 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 | ||
- | Au final toutes les clés générées sont situées dans le répertoire '' | + | Pour une machine Linux on peut s'inspirer directement des modèles fournis par easy-rsa |
- | * '' | + | <code bash> |
- | * '' | + | 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 / | ||
- | ===Diffie Hellman=== | + | # 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 " | ||
- | Maintenant il faut générer | + | # on limite |
- | | + | user nobody |
- | Generating DH parameters, 1024 bit long safe prime, generator 2 | + | group nogroup |
- | This is going to take a long time | + | </ |
- | | + | |
- | | + | |
- | | + | |
+ | 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" | ||
- | ===Fichiers générés=== | + | # 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 | ||
- | Les fichiers que l'on a générés | + | # spécification de l'algorithme de chiffrement |
- | ls keys/ | + | # pour lister tous les algos possibles |
- | 01.pem | + | # (NB : '' |
- | 02.pem | + | cipher AES-256-CBC |
- | | + | |
- | * les '' | + | # activer la communication entre les clients |
- | * les '' | + | client-to-client |
- | * '' | + | |
- | ====config serveur==== | + | # limiter le nombre max de client simultanés |
+ | # | ||
- | Créer l' | + | # activer la compression (à placer dans les confs clientes également) |
- | / | + | comp-lzo |
- | ifconfig tun0 192.168.3.1 netmask 255.255.255.252 promisc up | + | |
- | Ouvrir | + | # augmenter ou diminuer |
- | | + | #verb 4 |
- | | + | </ |
- | iptables -I FORWARD -i tun0 -o br0 -j ACCEPT | + | |
- | Le fichier de conf, par exemple ''/ | + | ====Partie |
- | # | + | |
- | # Partie | + | |
- | # | + | |
- | 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 / | + | |
- | dh / | + | |
- | cert / | + | |
- | key / | + | |
- | + | ||
- | server 192.168.3.0 255.255.255.0 | + | |
- | client-to-client | + | |
- | max-clients 3 | + | |
- | Lancer le serveur | + | Pour transformer notre serveur |
- | /tmp/myvpn --config | + | |
+ | <code bash> | ||
+ | echo " | ||
- | ====config client==== | + | # 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 | ||
+ | </ | ||
- | # IP/port du serveur distant | + | Pour pérenniser cette config, on peut utiliser le paquet **iptables-persistent** : |
- | | + | <code bash> |
- | remote | + | aptitude install iptables-persistent |
- | dev tun | + | /etc/init.d/netfilter-persistent save |
- | 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 | + | |
+ | =====Config client===== | ||
- | ====Conf avancée==== | + | 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. |
- | On peut spécifier une conf par certificat en modifiant ainsi la conf du serveur: | + | Pour la configuration, |
- | # indique ou sont situes les fichiers | + | <code bash> |
- | | + | cp / |
- | # | + | </ |
- | * '' | + | Le fichier |
+ | <code bash> | ||
+ | client | ||
+ | dev tun | ||
+ | proto udp | ||
+ | remote < | ||
+ | resolv-retry infinite | ||
+ | nobind | ||
+ | persist-key | ||
+ | persist-tun | ||
+ | ca /sdcard/ | ||
+ | cert /sdcard/ | ||
+ | key / | ||
+ | ns-cert-type server | ||
+ | comp-lzo | ||
+ | verb 3 | ||
+ | </ | ||
+ | NB : avec OpenVPN Connect, le fichier de conf doit avoir l'extension **.ovpn**, il n' | ||
- | ifconfig-push 192.168.3.10 192.168.3.9 | + | ====Intégrer les certificats dans le fichier de configuration==== |
- | push "route 192.168.2.0 255.255.255.0" | + | |
- | De cette façon on attribue au client toto l'IP 192.168.3.10 | + | 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 / | ||
+ | < | ||
+ | -----BEGIN CERTIFICATE----- | ||
+ | MIIEoTCCA4mgAwIBAgIJAKWLtfNAkVCcMA0GCSqGSIb3DQEBCwUAMIGRMQswCQYD | ||
+ | [blabla...] | ||
+ | +/ | ||
+ | 9KljFHVPKEAFhZzokOREYCG+8yVA5F6Uk2miMw6ZVGDgbrYvWA== | ||
+ | -----END CERTIFICATE----- | ||
+ | </ | ||
+ | </ | ||
- | * '' | + | 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 |
- | **Le driver TAP sous Windows impose l' | + | =====Conf avancée===== |
- | Sachant que DD-WRT ne permet par d' | + | 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 / | ||
+ | # interdit | ||
+ | # | ||
+ | </code> | ||
+ | Ensuite place la config dédiée dans fichier portant le nom du client | ||
+ | * '' | ||
+ | <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" | ||
- | Explications : | + | # LAN pour que le serveur accède au réseau |
- | * créer une interco = un réseau | + | iroute 192.168.100.0 |
+ | # NB : on doit ajouter également dans la conf serveur | ||
+ | </ | ||
+ | **Le driver TAP sous Windows impose l' | ||
On peut couper la connexion si inactivité du client avec l' | On peut couper la connexion si inactivité du client avec l' | ||
+ | '' | ||
- | =====Conf qui marche===== | + | '' |
- | C'est un tunnel TLS routé. | + | '' |
- | Les fichiers sont les suivants : | + | |
- | * exécutable (lien symbolique myvpn -> / | + | |
- | * fichier | + | |
- | * certificat | + | |
- | * 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==== | + | =====Intégration système===== |
- | **server.ovpn** | + | On va s' |
- | mode server | + | |
- | proto tcp-server | + | |
- | port 1165 | + | |
- | dev tun0 | + | |
- | daemon | + | |
- | 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 | + | |
- | tls-server | + | |
- | ca / | + | |
- | dh / | + | |
- | cert / | + | |
- | key /tmp/openvpn/server.key | + | |
- | **/ | + | ====Démarrage automatique==== |
- | ifconfig-push 192.168.3.10 192.168.3.9 | + | |
- | push "route 192.168.2.0 255.255.255.0" | + | |
- | ====Client Windows==== | + | Pour lancer openvpn automatiquement au démarrage de la machine : |
+ | <code bash> | ||
+ | update-rc.d openvpn defaults | ||
+ | </ | ||
- | **client.ovpn** | + | ====syslog==== |
- | | + | |
- | | + | Pour orienter les log du daemon openvpn, on peut définir l' |
- | dev tun | + | <code bash> |
- | proto tcp-client | + | # Create a template for the vpn log location |
- | + | $template OpenVPN,"/ | |
- | comp-lzo | + | |
- | | + | # Save log events where the programname starts with ovpn like ovpn-server to the |
- | | + | # location mentioned in the template |
- | pull | + | : |
- | + | ||
- | # TLS | + | # Stop processing ovpn-* log events |
- | | + | : |
- | ca ca.crt | + | </ |
- | cert dude.crt | + | |
- | key dude.key | + | 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==== | ||
- | =====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.1252081028.txt.gz · Last modified: 2013/10/14 20:55 (external edit)