Un Virtual Private Network avec OpenVPN

Virtual Private Network ? Mais qu’est-ce que c’est ?

Un Virtual Private Network est vu comme une extension du réseau local et préserve la sécurité logique que l’on peut avoir à l’intérieur de celui-ci. Il correspond en fait à une interconnexion de réseaux locaux via une technique de « tunnel ».

On peut utiliser Internet comme support de transmission en utilisant un protocole de tunneling (en encapsulant les données à transmettre de façon chiffrée). On parle alors de VPN pour désigner le réseau ainsi artificiellement créé. Ce réseau est dit virtuel car il relie deux réseaux « physiques » (réseaux locaux) par une liaison non fiable (Internet), et privé car seuls les ordinateurs des réseaux locaux de part et d’autre du VPN peuvent accéder aux données en clair.

Ce qu’il faut savoir avant de commencer

Ce tuto a été réalisé en travaillant avec une machine virtuelle sous Debian 7  (le serveur OpenVPN). La machine cliente tourne sous Windows 7.

Dans mon cas, le serveur VPN aura pour adresse IP 192.168.0.3 et le client 192.168.0.5.

Mode opératoire

Après avoir configuré correctement l’interface du serveur, nous allons rentrez dans le vif du sujet.

Tout d’abord nous allons activer l’IP forwarding (activer le routage des paquets d’une interface à une autre). Nous pouvons le faire de 2 manières.

De manière provisoire (au redémarrage de la machine, il sera désactivé):

# echo 1 > /proc/sys/net/ipv4/ip_forward

De manière automatique, en modifiant le fichier /etc/sysctl.conf:

net.ipv4.ip_forward=1

Avec cette méthode, on peut « forcer » ce changement sans devoir redémarrer la machine:

# sysctl -p

Nous allons maintenant installer le paquet OpenVPN:

# apt-get update
# apt-get upgrade
# apt-get install openvpn

Maintenant qu’OpenVPn est installé, nous allons mettre en place les différentes clés et certificats.

Nous allons tout d’abord copier le contenu du dossier easy-rsa vers /etc/openvpn:

# cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn

Dans ce dossier qui vient d’être copié, ouvrons le fichier vars pour y modifier quelques lignes:

export KEY_COUNTRY="BE"
export KEY_PROVINCE="Namur"
export KEY_CITY="Namur"
export KEY_ORG="PixieOrg"
export KEY_EMAIL="@VPN"
export KEY_EMAIL=pixie@vpn.be

Nous enregistrons et nous exécutons les commandes suivantes:

# . ./vars
# ./clean-all
# ./build-dh

La dernière commande permet de générer les paramètres de Diffie-Hellman pour l’échange de clés.

Nous créons ensuite notre autorité de certification (CA):

# ./build-ca

On laisse tout blanc (étant donné que nous avons modifié le fichiers vars pour qu’il corresponde à nos attentes) sauf l’information concernant le Common Name. Ce champs doit absolument correspondre au nom de la machine (vérifiable grâce à la commande hostname).

Nous pouvons maintenant créer la clé et le certificat du serveur.

# ./build-key-server server

Pareil que précédemment pour ce qui est du Common Name.
Nous répondons y aux 2 questions qui nous sont posées.

Et nous terminons par la clé pour le client:

# ./build-key client

Pour la partie Common Name, mettons le nom de la machine Windows.
Nous répondons y aux 2 questions qui nous sont posées.

Nous allons maintenant nous occuper du fichier de configuration d’OpenVPN. Dans /etc/openvpn, nous créons un fichier nommé server.conf.

# nano server.conf
dev tun
proto udp
local 192.168.0.3
port 1194
server 192.168.30.0 255.255.255.0

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
client-to-client # pour que les clients puissent communiquer entre eux
comp-lzo
verb 9 # loglevel
mute 50
keepalive 10 60
push "dhcp-option DNS 192.168.0.1"
push "route 192.168.30.0 255.255.255.0" #Informe les clients VPN du LAN
ifconfig-pool-persist ipp.txt
status openvpn-status.log
log /etc/openvpn/openvpn.log
duplicate-cn # Un certificat pour plusieurs clients

Pour tester que nous n’avons pas d’erreur dans la syntaxe (avant de lancer le serveur):

# openvpn server.conf

Nous devons pourvoir lire Initalization Sequence Completed.

Nous pouvons alors démarrer OpenVPN:

# /etc/init.d/openvpn start

Côté client, nous installerons OpenVPN GUI (http://openvpn.net/index.php/open-source/downloads.html).

Une fois installé, nous devons récupérer 3 fichiers sur notre serveur (en utilisant WinSCP par exemple):

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

Et nous les copions dans le dossier C:\Program Files\OpenVPN\config ou C:\Program Files (x86)\OpenVPN\config

Dans le dossier config, nous allons également créer un fichier client.ovpn:

client
dev tun
proto udp

remote 192.168.0.3 1194

resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key

comp-lzo
verb 4

route-method exe
route-delay 2

Nous enregistrons et nous pouvons lancer OpenVPN GUI.

Si la connexion est établie, nous devrions retrouver dans les logs (côté client) :

Sun Nov 17 18:40:29 2013 MANAGEMENT: >STATE:1384710029,CONNECTED,SUCCESS,192.168.30.10,192.168.0.3

Vous pouvez ensuite réaliser un ping vers 192.168.30.10 depuis notre machine Windows. Si le ping ne renvoie pas d’erreur, c’est que votre VPN fonctionne correctement.