OpenVPN, c’est quoi, ça sert à quoi ?
OpenVPN est un système de réseau privé virtuel développé par James Yonan (jim@yonan.net) sur le protocole SSL et non sur le protocole IPSEC comme la plupart des VPN.
VPN est l’acronyme de Virtual Private Network. Il s’agit d’un tube virtuel qui crée un réseau privé au travers d’un réseau public.Openvpn est utilisé pour relier deux ordinateurs (ou deux réseaux) de façon sécurisée au travers d’un tunnel crypté.
Son rôle est de « tunneliser », de manière sécurisée, des données sur un seul port TCP/UDP à travers un réseau non sûr comme Internet et ainsi établir des VPNs.
Il existe deux méthodes pour faire tourner OpenVPN:
– Le mode « routed » plus simple, est généralement utilisé pour connecter des utilisateurs depuis l’extérieur d’un réseau (les roadwarriors »);
– Le mode « Bridged » plus compliqué à installer, mais un peu plus rapide. Il est généralement utilisé pour interconnecter deux réseaux entre eux.
Voici un exemple de VPN site à site:
http://www.isalo.org/wiki.debian-fr/images/3/36/VPN_site-a-site.jpg
Les clients se connectant à partir d’une machine isolée à un tunnel VPN sont nommées « Road Warriors »…
Voici un exemple de VPN « nomade » à site:
http://www.isalo.org/wiki.debian-fr/images/b/b2/VPN_nomade-a-site.jpg
Installation du programme
Sur le serveur Debian:
# apt-get install openvpn openssl
Sur le client Debian:
# apt-get install openvpn Sur Centos serveur :
yum install openvpn openssl -y Sur Centos client :
yum install openvpn -y
Installation des outils pour la génération des certificats : yum install easy-rsa -y
Mise en oeuvre de la PKI (Génération des certificats et clefs avec Openvpn)
PKI ( « Public Key Infrastructure »=Infrastructure de clé publique )
Nous utiliserons évidemment les utilitaires fournis par openvpn qui simplifient grandement le travail.
cp /usr/share/doc/openvpn-*/sample-config-files/server.conf /etc/openvpn
mkdir -p /etc/openvpn/easy-rsa/keys cp -rf /usr/share/openvpn/easy-rsa/2.0/* /etc/openvpn/easy-rs L'emplacement du fichier openssl est important, il faut donc faire une petite manip
cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf cd /etc/openvpn/easy-rsa/ ln -s openssl-1.0.0.cnf openssl.cnf
- Quelques modifications pour coller à nos besoins:
# vi vars export KEY_COUNTRY="MG" export KEY_PROVINCE="IH"export KEY_CITY="Quelquepart" export KEY_ORG="serveur.domaine.org" export KEY_EMAIL="admin@domaine.org"
- On charge les variables d’environnement d’openvpn
# . ./vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys # ./clean-all
On génère le certificat : Ca
# ./build-ca on met un password de son choix
- Attention le ca.key est la clé privée du ca, il ne faut pas la laisser trainer, ni lui donner des droits trop permissifs
Génération du certificat et des clefs pour le Serveur
# ./build-key-server monserver
- Attention, il est important de répondre Y (oui) aux deux question suivantes:
Sign the certificate? [y/n]:y commit? [y/n]y
Génération des certificats et des clefs pour le Client
# ./build-key client1
# ./build-key client2
# ./build-key client3
Generate Diffie Hellman parameters
# ./build-dh
-
On copie les certificats serveur vers la racine du répertoire openvpn :
cd /etc/openvpn/easy-rsa/keys cp dh1024.pem ca.crt server.crt server.key /etc/openvpn dh2048 en cas de génération d'un fichier diffie Hellman de 2048
Résultats
# vdir total 72 -rw-r--r-- 1 root root 3827 10 mai 10:17 01.pem -rw-r--r-- 1 root root 3698 10 mai 10:18 02.pem -rw-r--r-- 1 root root 1184 10 mai 10:17 ca.crt (Root CA certificate - server + all clients) -rw------- 1 root root 887 10 mai 10:17 ca.key (Root CA key - SECRET - key signing machine only) -rw-r--r-- 1 root root 245 10 mai 10:18 dh1024.pem (Diffie Hellman parameters - server only) -rw-r--r-- 1 root root 3698 10 mai 10:18 client1.crt (Client1 Certificate - client1 only) -rw-r--r-- 1 root root 664 10 mai 10:18 client1.csr (Client1 Key - SECRET - client1 only) -rw------- 1 root root 887 10 mai 10:18 client1.key -rw-r--r-- 1 root root 203 10 mai 10:18 index.txt -rw-r--r-- 1 root root 21 10 mai 10:18 index.txt.attr -rw-r--r-- 1 root root 21 10 mai 10:17 index.txt.attr.old -rw-r--r-- 1 root root 103 10 mai 10:17 index.txt.old -rw-r--r-- 1 root root 3 10 mai 10:18 serial -rw-r--r-- 1 root root 3 10 mai 10:17 serial.old -rw-r--r-- 1 root root 3827 10 mai 10:17 server.crt (Server Certificate - server only) -rw-r--r-- 1 root root 668 10 mai 10:17 server.csr -rw------- 1 root root 887 10 mai 10:17 server.key (Server Key - SECRET - server only) -rw------- 1 root root 636 16 mai 17:37 ta.key
Nom | Utilisée par: | Description | Secret |
---|---|---|---|
ca.crt | Serveur et tous les clients | Certificat racine du serveur | NON |
ca.key | Serveur seulement | Clef du certificat racine du serveur | OUI |
dh1024.pem | Serveur seulement | Paramètres Diffie Hellman | NON |
client1.crt | Client1 seulement | Certificat du client | NON |
client1.key | Client1 seulement | Clef du certificat du client | OUI |
server.crt | Serveur seulement | Certificat du serveur | NON |
server.key | Serveur seulement | Clef du certificat du serveur | OUI |
Configuration de openvpn
Créez un lien symbolique ou copiez le répertoire contenant les clefs:
# ln -s /etc/openvpn/easy-rsa/2.0/keys/ /etc/openvpn
Création du fichier de configuration du serveur:
# vi /etc/openvpn/server.conf
# Port protocole et interface port 1194 proto udp dev tun # Chemin vers les fichiers ssl ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh1024.pem # IP désirée pour le serveur server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status openvpn-status.log verb 3 # On définit le serveur VPN comme passerelle par défaut pour les clients pour cela on décommente la ligne suivante. push "redirect-gateway def1 bypass-dhcp" #On définit la route pour atteindre un réseau souhaité : push "route 10.9.8.0 255.255.252.0" # On définit le serveur VPN comme DNS par défaut ou on renseigne l'ip d'un serveur dns joignable push "dhcp-option DNS 10.8.0.1" push "dhcp-option DNS 8.8.8.8" on décommente :
user nobody group nobody
Configuration sur le serveur d’IPTABLES en mode « routed »
Règles nécessaires au bon fonctionnement d’OpenVPN en full-tunneling :
Évidemment changez l’interface (ici eth0) et l’IP par celle de votre système.
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
- On sauvegarde les règles iptables pour les conserver au redémarrage :
>Debian/Ubuntu: iptables-save > /etc/iptables/rules.v4 >RHEL/CentOS: iptables-save > /etc/sysconfig/iptables
Activer le forwarding :
echo 1 > /proc/sys/net/ipv4/ip_forward
Attention, l’ip_forwarding ne sera pas conservé au prochain démarrage, il faudra éditer le fichier /etc/sysctl.conf et dé-commenter la ligne suivante:
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
Configuration du client
Avec une clef usb récupérez les fichiers suivants sur le serveur:
- ca.crt
- client1.crt
- client1.key
Que vous copierez directement dans le dossier /etc/openvpn/ Puis vous créez un fichier de configuration:
# cat /etc/openvpn/client1.conf client dev tun proto udp remote IP-DU-SERVEUR 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key eee.key comp-lzo verb 3 pull
Tests
Lancer le serveur:
# cd /etc/openvpn # openvpn server.conf
Sur le client:
# cd /etc/openvpn # openvpn client1.conf
A ce moment là vous devez être capable, depuis le serveur de « pinguer » le client, et depuis le client de pinguer le serveur et les autres machines du sous-réseau.
Voilà votre serveur OpenVPN est prêt!
Il ne reste plus qu’a le lancer:
# sysctl -p # service openvpn start Configurer au démarrage de la machine: # chkconfig openvpn on
Une interface Web pour contrôler le serveur
Vous avez plusieurs outils vous permettant d’avoir une vision d’ensemble du fonctionnement de votre serveur OpenVPN. J’ai choisi OpenVPN Web GUI:
# mkdir /var/www/html/openvpn # tar xvzf openvpn-web-gui-0.3.2.tgz -C /var/www/html/openvpn # chown -R apache:apache /var/www/html/openvpn
Installation de Smarty :
# wget http://www.smarty.net/files/Smarty-3.0.7.tar.gz # tar xvzf Smarty-3.0.7.tar.gz # mkdir /usr/share/php/Smarty # cp -r ~/Smarty-3.0.7/libs/* /usr/share/php/Smarty/
# nano /etc/php/apache2/php.ini
... ;;;;;;;;;;;;;;;;;;;;;;;;; ; Paths and Directories ; ;;;;;;;;;;;;;;;;;;;;;;;;; include_path = ".:/usr/share/php5:/usr/share/php/Smarty" ...
Configuration de OpenVPN Web GUI en fonction de vos besoins:
# nano /var/www/html/openvpn/config.inc <?php if (!defined ("LOCAL_SECURITY_KEY")) die (); // OPENVPN-WEB-GUI ________________________ // Change: your company name $config['Company_Name'] = 'Web certificat management'; $config['Company_Logo'] = 'img/OpenVPN-small.gif'; // Change: your company home page $config['URL_Home_Page'] = 'http://openvpn-web-gui.sourceforge.net/'; $config['AUTH_REALM'] = $config['Company_Name'] .' OpenVPN Web GUI v.0.3.2a'; // What files to include into ZIP $config['Download']['ZIP']['.pem'] = true; $config['Download']['ZIP']['.key'] = true; $config['Download']['ZIP']['.csr'] = false; // All the following files should be placed into downloads folder $config['Download']['ZIP']['Others'] = array (); //$config['Download']['ZIP']['Others'] = array ('readme.txt', 'install.cmd', 'tls-auth.key'); // OPENVPN-WEB-GUI PLUG-INS _______________ // Use the real absolute path here. $config['PluginsAbsolutePath'] = '/var/www/html/openvpn/plugins/'; // If there are no plugins //$config['Plugins'] = NULL; // Otherwise, follow this example: //$config['Plugins']['PLUGINMANE']['Folder'] = 'FOLDERNAME'; // The post-install helper plugin. Shows if PHP5 has the neccessary functions available $config['Plugins']['systemcheck']['Folder'] = 'systemcheck'; // OPENVPN ________________________________ // Change: the configuration directory $config['openvpn']['folder'] = '/etc/openvpn/'; // Change: configuration and status file names $config['openvpn']['config'] = $config['openvpn']['folder'] .'server.conf'; $config['openvpn']['status'] = $config['openvpn']['folder'] .'openvpn-status.log'; // OPENSSL ________________________________ // Change: openssl keys directory $config['openssl']['folder'] = '/etc/openvpn/keys/'; // Change: different folders for Public Certificates, Certificate Requests and Private Keys. // NOTE: openssl somehow respects only newpem folder (for Public Certificates). $config['openssl']['pubfolder'] = '/etc/openvpn/keys/newpem/'; $config['openssl']['reqfolder'] = '/etc/openvpn/keys/newpem/'; $config['openssl']['prvfolder'] = '/etc/openvpn/keys/newpem/'; // Change: openssl CA private and public keys $config['openssl']['CA']['priv'] = 'file://'. $config['openssl']['folder'] .'ca.key'; $config['openssl']['CA']['pub'] = 'file://'. $config['openssl']['folder'] .'ca.crt'; // Change: openssl serial file $config['openssl']['serial'] = $config['openssl']['folder'] .'serial'; // Change: openssl database $config['openssl']['database'] = $config['openssl']['folder'] .'index.txt'; // Change: openssl configuration $config['openssl']['config'] = array ('config' => $config['openvpn']['folder'] .'openssl.cnf', 'encrypt_key' => 0); // NEW OPENSSL CERTIFICATE DEFAULTS _________ // Change all of them as it is done in your easy-rsa/vars $config['openssl']['default']['expiration'] = 3560; $config['openssl']['default']['countryName'] = 'FR'; $config['openssl']['default']['stateOrProvinceName'] = 'Vaucluse'; $config['openssl']['default']['localityName'] = 'Cavaillon'; $config['openssl']['default']['organizationName'] = 'xxxx'; $config['openssl']['default']['organizationalUnitName'] = 'xxxx'; $config['openssl']['default']['commonName'] = 'test.FR.0'; $config['openssl']['default']['emailAddress'] = 'mail@monmail.com'; ?>
# service apache2 restart
Rendez-vous dans votre navigateur:
Plusieurs instances Openvpn
J’ai installé 4 instances VPN – Chacune d’entre elles est liée à un cpu – en théorie je peux désormais atteindre les 1000 connexions actives.Chaque Instance écoute sur son propre port et possède aussi des sous réseaux différents. Des routes supplémentaires sont déployées pour joindre les réseaux internes.
Il y a donc 4 fichiers de configuration VPN différents, server0.conf, server1.conf, server2.conf and server3.conf et j’ai modifié le fichier de démarage openvpn dans init.d pour extraire du nom de fichier de configuration vpn le numéro. ce numéro est ensuite réutilisé pour créer une affinité CPU avec chacune des instances VPN grâce à l’outil taskset (voir l'article taskset).
Ainsi je suis sur que chaque instance à son propre cpu attitré.
diff /etc/init.d/openvpn 25c25,26 &lt; DAEMON=/usr/sbin/openvpn – – – &gt; DAEMON=/usr/bin/taskset &gt; DAEMON2=/usr/sbin/openvpn 57a59,60 &gt; CPU=`echo $NAME | sed ‘s/[A-Za-z]*//g’` &gt; 63c66 &lt; –exec $DAEMON — $OPTARGS –writepid /var/run/openvpn.$NAME.pid \ – – – &gt; –exec $DAEMON — $OPTARGS -c $CPU $DAEMON2 –writepid /var/run/openvpn.$NAME.pid \</pre> |