Différences entre versions de « Openvpn »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Ligne 314 : Ligne 314 :
 
[[Fichier:ovpn client connexion ok.png|centré]]
 
[[Fichier:ovpn client connexion ok.png|centré]]
  
= Use case 2 : site-to-site unidirectionnel =
+
= Use case 2 : passerelle site-to-site unidirectionnel =
 
Dans ce cas de figure, nous avons un ou plusieurs sites secondaires qui ont besoin d'accéder aux ressources disponible sur un site principal.  
 
Dans ce cas de figure, nous avons un ou plusieurs sites secondaires qui ont besoin d'accéder aux ressources disponible sur un site principal.  
  

Version du 25 octobre 2015 à 19:23

Serveur
Protocole udp
Port 1194
Configuration Iptables iptables -I INPUT 2 -p udp --dport 1194 -j ACCEPT

Préparation

Dans un premier temps, il faudra avoir une connexion à Internet, utiliser un serveur DNS et désactiver SELinux.

Pour ceux qui auraient manqué des étapes, les voici:

Assurez-vous d'avoir installé le dépôt EPEL car OpenVPN vient de cette source.

Une fois ces étapes effectuées, entrons dans le vif du sujet !

Use case 1 : serveur - client

Dans ce cas d'utilisation (use case), nous allons utiliser un serveur CentOS et un client Seven. Le client, situé sur Internet, pourra accéder aux services de l'entreprise comme s'il était physiquement connecté au LAN.

C'est le use case le plus commun comme, par exemple, des commerciaux qui veulent accéder à leur PGI (Progiciel de Gestion Intégré) alors qu'ils sont à l'autre bout du monde.

Serveur-client-vpn.png

Partie serveur

Installation

Premièrement, installons les packages nécessaires:

# yum -y install openvpn easy-rsa

OpenVPN est livré avec un fichier de configuration d'exemple que nous allons copier dans le bon répertoire:

# cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

Configuration

Éditons le fichier maintenant qu'il est au bon endroit:

# vi /etc/openvpn/server.conf

Nous allons dé-commenter la ligne suivante qui permet de router le trafic qui vient du client à travers le tunnel VPN:

push "redirect-gateway def1 bypass-dhcp"

La ligne suivante doit être décommentée car elle permet de préciser quel serveur DNS le client doit utiliser. Si vous avez un serveur DNS sur votre réseau, mettez son IP ici, sinon utilisez le serveur de Google:

push "dhcp-option DNS 8.8.8.8"

Les lignes suivantes doivent être décommenteés pour signifier à OpenVPN d'utiliser l'utilisateur et le group nobody. Cela permet d'augmenter la sécurité.

user nobody
group nobody

Pour résumer:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
log openvpn.log
status openvpn-status.log
verb 3

Création des clés

Mise en place

Le serveur utilise un certificat pour monter un tunnel SSL avec le client. Cela nécessite une autorité de certification, pour délivrer des certificats, une paire certificat/clé pour le serveur et une paire certificat/clé pour le client.

Nous allons utiliser une librairie qui nous permet de créer tous les fichiers dont nous allons avoir besoin: easy-rsa.

Tout d'abord, créons un dossier pour stocker tous ces fichiers:

# mkdir -p /etc/openvpn/easy-rsa/keys

Copions les fichiers nécessaires :

# cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

Informations du certificat

Nous allons inscrire les informations du certificat dans le fichier /etc/openvpn/easy-rsa/vars pour ne pas avoir à les saisir à chaque fois:

export KEY_COUNTRY="FR"
export KEY_PROVINCE="Herault"
export KEY_CITY="Juvignac"
export KEY_ORG="Tala Informatique"
export KEY_EMAIL="root@tala.informatique.fr"
export KEY_OU="Informatique"

Création de l'autorité de certification

# cd /etc/openvpn/easy-rsa
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key
...................................................+++
...................................................................................+++
writing new private key to 'ca.key'
-----
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 code) [FR]:
State or Province Name (full name) [Herault]:
Locality Name (eg, city) [Juvignac]:
Organization Name (eg, company) [Tala Informatique]:
Organizational Unit Name (eg, section) [Informatique]:
Common Name (eg, your name or your server's hostname) [Tala Informatique CA]:
Name [EasyRSA]:
Email Address [root@tala.informatique.fr]:

Génération du certificat serveur

Pour le serveur, ne pas mettre de mot de passe lorsque l'on vous pose la question.

# ./build-key-server server
Generating a 2048 bit RSA private key
.............+++
.........+++
writing new private key to 'server.key'
-----
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 code) [FR]:
State or Province Name (full name) [Herault]:
Locality Name (eg, city) [Juvignac]:
Organization Name (eg, company) [Tala Informatique]:
Organizational Unit Name (eg, section) [Informatique]:
Common Name (eg, your name or your server's hostname) [server]:
Name [EasyRSA]:
Email Address [root@tala.informatique.fr]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'FR'
stateOrProvinceName   :PRINTABLE:'Herault'
localityName          :PRINTABLE:'Juvignac'
organizationName      :PRINTABLE:'Tala Informatique'
organizationalUnitName:PRINTABLE:'Informatique'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'root@tala.informatique.fr'
Certificate is to be certified until Oct 14 17:16:17 2025 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Nous allons également avoir besoin de clés Diffie Hellman pour procéder à la vérification des certificats de manière sécurisée. Pour les générer, nous allons utiliser le script build-dh et copier tous les fichiers dans /etc/openvpn:

# ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...

# cd /etc/openvpn/easy-rsa/keys
# cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

Démarrage et enregistrement du serveur

# service openvpn start
# chkconfig openvpn on

Activation du routage

Il faut activer le routage, comme on le ferait sur un pare-feu, pour que les clients qui sont sur le sous-réseau du VPN puissent accéder au réseau sur lequel se trouve la passerelle OpenVPN.

Tout d'abord paramétrons le pare-feu pour faire du NAT:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -F FORWARD
# service iptables save

Enfin, activons le routage dans le fichier /etc/sysctl.conf:

net.ipv4.ip_forward = 1

Rechargeons les paramètres du noyau:

# sysctl -p

Partie cliente

Installation du client

Premièrement, installez le client OpenVPN sur la machine Windows, Mac ou Linux en récupérant l’exécutable ici : https://openvpn.net/index.php/open-source/downloads.html

Génération du certificat client

Comme pour la partie serveur, la première étape est la génération des clés.

Cela se fait sur le serveur OpenVPN:

# cd /etc/openvpn/easy-rsa
# ./build-key client
Generating a 2048 bit RSA private key
...........+++
............+++
writing new private key to 'client.key'
-----
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 code) [FR]:
State or Province Name (full name) [Herault]:
Locality Name (eg, city) [Juvignac]:
Organization Name (eg, company) [Tala Informatique]:
Organizational Unit Name (eg, section) [Informatique]:
Common Name (eg, your name or your server's hostname) [client]:
Name [EasyRSA]:
Email Address [root@tala.informatique.fr]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'FR'
stateOrProvinceName   :PRINTABLE:'Herault'
localityName          :PRINTABLE:'Juvignac'
organizationName      :PRINTABLE:'Tala Informatique'
organizationalUnitName:PRINTABLE:'Informatique'
commonName            :PRINTABLE:'client'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'root@tala.informatique.fr'
Certificate is to be certified until Oct 14 17:22:18 2025 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Récupération des fichiers

Il va falloir maintenant récupérer les trois fichiers suivants:

  • ca.crt
  • client.crt
  • client.key

Ils se trouvent dans le répertoire /etc/openvpn/easy-rsa/keys du serveur.

Fichier de configuration

Il faut créer le fichier de configuration, client.ovpn, qui va nous permettre de nous connecter au serveur dont voici le contenu:

client
dev tun
proto udp
remote !!!adresse IP du serveur OpenVPN!!! 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
<ca>
!!!! Contenu du fichier ca.crt !!!!
</ca>
<cert>
!!!! Contenu du fichier client.crt !!!!
</cert>
<key>
!!!! Contenu du fichier client.key!!!!
</key>

Adaptez:

  • l'adresse IP du serveur OpenVPN;
  • les contenus des fichiers commencent par le mot BEGIN et se terminent par le mot END

Mise en place

Dans cet exemple, nous allons utiliser un client Windows Seven. Il faut copier le fichier précédent dans le répertoire C:\Program Files\OpenVPN\config, puis démarrer la connexion:

Start ovpn client connexion.png

Une fois la connexion montée, le message suivant devrait apparaître:

Ovpn client connexion ok.png

Use case 2 : passerelle site-to-site unidirectionnel

Dans ce cas de figure, nous avons un ou plusieurs sites secondaires qui ont besoin d'accéder aux ressources disponible sur un site principal.

C'est le cas d'utilisation de tous les magasins franchisés ou grandes enseignes. Leurs stocks, informations de paiement, etc... remontent à Paris, au niveau de la maison mère.

Dans ce cas précis, nous allons minimiser l'impact de la mise en place du tunnel VPN sur le réseau existant. C'est souvent l'attitude à adopter quand on est prestataire externe et qu'il faut intégrer un nouveau service dans une architecture réseau existante et non maîtrisée.

Nous allons placer un client OpenVPN dans la DMZ publique pour ne pas intervenir sur le routeur déjà en place, excepté, pour ajouter une règle de routage.

Site-to-site-uni-vpn.png

Partie serveur

Suivez exactement les même instruction que dans le use case 1.

Partie cliente

Dans ce use case nous allons utiliser un CentOS comme client OpenVPN.

Installation

# yum -y install openvpn

Configuration

Dans ce use case, on peut reprendre la même configuration que pour la partie précédente

Mettez le fichier client.ovpn dans le répertoire /root par exemple.

Démarrage

Pour démarrer notre client OpenVPN nous allons utiliser la commande suivante :

# openvpn --config client.ovpn
Mon Oct 19 23:57:08 2015 OpenVPN 2.3.8 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Aug  4 2015
Mon Oct 19 23:57:08 2015 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.03
Mon Oct 19 23:57:08 2015 WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.
Mon Oct 19 23:57:08 2015 Socket Buffers: R=[124928->131072] S=[124928->131072]
Mon Oct 19 23:57:08 2015 UDPv4 link local: [undef]
Mon Oct 19 23:57:08 2015 UDPv4 link remote: [AF_INET]192.168.100.10:1194
Mon Oct 19 23:57:08 2015 TLS: Initial packet from [AF_INET]192.168.100.10:1194, sid=f742fd94 094225a6
Mon Oct 19 23:57:08 2015 VERIFY OK: depth=1, C=FR, ST=Herault, L=Juvignac, O=Tala Informatique, OU=Informatique, CN=Tala Informatique CA, name=EasyRSA, emailAddress=root@tala.informatique.fr
Mon Oct 19 23:57:08 2015 VERIFY OK: depth=0, C=FR, ST=Herault, L=Juvignac, O=Tala Informatique, OU=Informatique, CN=server, name=EasyRSA, emailAddress=root@tala.informatique.fr
Mon Oct 19 23:57:08 2015 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Oct 19 23:57:08 2015 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Oct 19 23:57:08 2015 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Oct 19 23:57:08 2015 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Oct 19 23:57:08 2015 Control Channel: TLSv1.2, cipher TLSv1/SSLv3 DHE-RSA-AES256-GCM-SHA384, 2048 bit RSA
Mon Oct 19 23:57:08 2015 [server] Peer Connection Initiated with [AF_INET]192.168.100.10:1194
Mon Oct 19 23:57:10 2015 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
Mon Oct 19 23:57:10 2015 PUSH: Received control message: 'PUSH_REPLY,route 192.168.50.0 255.255.255.0,dhcp-option DNS 8.8.8.8,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5'
Mon Oct 19 23:57:10 2015 OPTIONS IMPORT: timers and/or timeouts modified
Mon Oct 19 23:57:10 2015 OPTIONS IMPORT: --ifconfig/up options modified
Mon Oct 19 23:57:10 2015 OPTIONS IMPORT: route options modified
Mon Oct 19 23:57:10 2015 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Mon Oct 19 23:57:10 2015 ROUTE_GATEWAY 192.168.30.254/255.255.255.0 IFACE=eth0 HWADDR=00:0c:29:d9:56:1b
Mon Oct 19 23:57:10 2015 TUN/TAP device tun0 opened
Mon Oct 19 23:57:10 2015 TUN/TAP TX queue length set to 100
Mon Oct 19 23:57:10 2015 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Mon Oct 19 23:57:10 2015 /sbin/ip link set dev tun0 up mtu 1500
Mon Oct 19 23:57:10 2015 /sbin/ip addr add dev tun0 local 10.8.0.6 peer 10.8.0.5
Mon Oct 19 23:57:10 2015 /sbin/ip route add 192.168.50.0/24 via 10.8.0.5
Mon Oct 19 23:57:10 2015 /sbin/ip route add 10.8.0.1/32 via 10.8.0.5
Mon Oct 19 23:57:10 2015 Initialization Sequence Completed

Le tunnel est maintenant monté, il ne reste plus qu'à informer le router des réseaux qui se trouve derrière le client OpenVPN.

Configuration du routage

Sur le routeur/pare-feu de sortie, il nous faut ajouter une règle de routage pour rediriger correctement le trafic à l'intérieur du tunnel VPN.

Nous allons partir du postulat suivant:

  • le réseau derrière le tunnel est 192.168.50.0/24;
  • l'adresse IP du client OpenVPN est 192.168.1.200/24;
  • l'interface réseau du pare-feu connectée à la DMZ publique est eth1 ou FastEthernet0/1.

Sur CentOS

Avec la commande ip:

# ip route add 192.168.50.0/24 via 192.168.1.200

Pour rendre ce paramètre persistant, il faut créer le fichier /etc/sysconfig/network-scripts/route-eth1:

192.168.50.0/24 via 192.168.30.1 dev eth1

Sur Cisco

Vous pouvez vous trouvez plus d'informations ici :

(config) ip route 192.168.50.0 255.255.255.0 192.168.1.200

Use case 2 : site-to-site bidirectionnel

Les logs

On peut voir dans les logs les connexions des clients:

Sun Oct 18 20:27:01 2015 192.168.100.129:49196 [client] Peer Connection Initiated with [AF_INET]192.168.100.129:49196

Pare-feu

S'il y a un pare-feu entre le serveur OpenVPN et le client (eg. DMZ publique), n'oubliez pas de mettre une règle Iptables sur le pare-feu pour rediriger le trafic UDP 1194 :

# iptables -t nat -A PREROUTING -i eth0 -p udp --dport 1194 -j DNAT --to @ip_serveur_openvpn