0

Openvpn Installation Centos

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
Tableau des clefs
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:

    1. 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:

Téléchargement

# 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:

http://10.9.8.1/openvpn/

 

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
&amp;lt; DAEMON=/usr/sbin/openvpn
– – –
&amp;gt; DAEMON=/usr/bin/taskset
&amp;gt; DAEMON2=/usr/sbin/openvpn
57a59,60
&amp;gt; CPU=`echo $NAME | sed ‘s/[A-Za-z]*//g’`
&amp;gt;
63c66
&amp;lt; –exec $DAEMON — $OPTARGS –writepid /var/run/openvpn.$NAME.pid \
– – –
&amp;gt; –exec $DAEMON — $OPTARGS -c $CPU $DAEMON2 –writepid /var/run/openvpn.$NAME.pid \</pre>
&nbsp;&nbsp;

 

Floppy

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.