Table des matières

OpenVPN

Source

http://www.coagul.org/spip.php?article422

http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-et-configurer-openvpn-sur-debian-4-0-etch

http://www.vogelweith.com/debian_server/10_openvpn.php

But

Un serveur Debian avec un serveur OpenVPN sur un reseau en 172.16.43.0

Un client sous windows qui veut accéder au serveur debian et tous les pc qui se trouvent sur son LAN

Installation

apt-get install openvpn

On crée un utilisateur openvpn pour plus de sécurité

groupadd openvpn
useradd -d /dev/null -g openvpn -s /bin/false openvpn

Tous les fichiers nécessaires se trouvent dans

cd /usr/share/doc/openvpn/examples/

On va copier le fichier de config par défaut et l’ajuster ensuite

cd /usr/share/doc/openvpn/examples/sample-config-files/
gunzip server.conf.gz
cp server.conf /etc/openvpn/

Avant de se lancer dans la config, nous allons générer les clé et certificat dont nous avons besoin.

Génération de certificat et clé privé/public

Allons dans le répertoire adéquate

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/

Nous llons éditer le fichier vars afin de donner quelques info sur nous.

vi vars

Tout à la fin du fichier, modifiez les infos en fonction de vous

export KEY_COUNTRY=FR
export KEY_PROVINCE=France
export KEY_CITY=Dijon
export KEY_ORG="MonEntreprise"
export KEY_EMAIL="contact@monentreprise.fr"

Ensuite, on va initialiser le fichier vars

source vars

Faire un nettoyage au préalable

./clean-all

On crée le certificat principal du serveur ca.crt et la clé correspondante ca.key

./build-ca

On crée maintenant le certificat et clé pour le serveur openvpn

./build-key-server NomServeurVPN

Ensuite on crée un certification et clé pour le client openvpn

./build-key Client01

Répétez la commande précédente autant de fois qu’il y a de poste client avec un nom différent biensur.

Création du paramètre Diffie Hellman

./build-dh

Voila, tout est créé dans le répertoire keys, il n’y a plus qu’a copier les fichiers concernant le serveur sur le serveur et le client sur le client ;)

cp ./keys/ca.crt /etc/openvpn/
cp ./keys/LeServeurVPN.crt /etc/openvpn/
cp ./keys/LeServeurVPN.key /etc/openvpn/
cp ./keys/dh1024.pem /etc/openvpn/

Pour le client, copier le ca.crt, le Client01.crt et le Client01.key à copier dans c:\Program Files\OpenVPN\config mais nous y reviendrons dans la partie client.

Configuration du serveur

Astuce pour lire votre fichier de conf sans tous les commentaires.
 grep -E -v '^(#|;|[ ]*#|[ ]*;)' /etc/openvpn/server.conf

exemple du fichier de conf

;Port en écoute utilisé pour la connexion VPN
port 1194
 
;Protocole utilisé (Le protocole udp est plus sécurisé que le tcp)
proto udp
 
;Type d'interface réseau virtuelle créée
dev tun
 
;Nom des fichiers servant à l'authentification des clients via OpenSSL
ca ca.crt
cert LeServeurVPN.crt
key LeServeurVPN.key  
dh dh1024.pem
 
;Adresse du réseau virtuel (Le serveur aura l'adresse 10.8.0.1)
server 10.8.0.0 255.255.255.0
 
;Cette ligne ajoute sur le client la route du réseau du serveur
push "route 172.16.43.0 255.255.255.0"
 
;Ces lignes indiquent aux clients l'adresse des serveur DNS et WINS
push "dhcp-option DNS 172.16.43.2"
push "dhcp-option DOMAIN MonDomaine.com"
push "dhcp-option WINS 172.16.43.3"
 
# Cette ligne permet aux clients de voire les autres clients
;client-to-client
 
keepalive 10 120
 
;Cette ligne active la compression
comp-lzo
 
;Ces lignes indiquent un user et un group particulier pour le processus et on ajoute un chroot pour plus de sécurité
chroot /etc/openvpn
user openvpn
group openvpn
 
;Ces lignes permettent de rendre persistante la connexion
persist-key
persist-tun
 
;Cette ligne permet de voir le status du serveur dans le fichier /etc/openvpn/openvpn-status.log
status openvpn-status.log
 
;on définit le nom du fichier de log dans /var/log
log openvpn.log
 
;Cette ligne permet d'indiquer le niveau de log souhaité (de 1 à 9)
verb 3

ATTENTION, si les journaux sont écrits dans un fichier dédié comme c’est le cas dans la configuration ci-dessus, il faut absolument mettre en place une rotation des ces journaux. Dans le cas contraire, OpenVPN tombe lorsque le fichier atteint 2Go.

Pour cela, il suffit de créer le fichier /etc/logrotate.d/openvpn et d’y ajouter les directives suivantes :

/var/log/openvpn.log { 
    rotate 4 
    daily 
    copytruncate 
    compress 
    missingok 
    notifempty 
}

Ainsi, une rotation des journaux d’OpenVPN sera effectuée chaque jour et les 4 derniers fichiers seront conservés. Bien sur ces valeurs doivent être adaptées en fonction de l’utilisation du serveur : si les journaux sont trop importants il est possible de diminuer le niveau de verbosité d’OpenVPN ou de modifier les paramètres de la rotation.

Vous pouvez maintenant redémarrer le serveur openvpn pour qu’il prenne en compte son nouveau fichier de config

/etc/init.d/openvpn restart

Dans l’état actuel, si un client se connecte sur le serveur openvpn, il n’aura accès uniquement au serveur mais pas au reste du LAN.

Pour cela il faut configurer le reseau et le firewall.

Vérifions que le port_forwarding est activé sur votre serveur avec la commande

cat /proc/sys/net/ipv4/ip_forward

Si vous avez 1, la fonction est activé, sinon vous avez 0, vous pouvez changer cela grace à cette commande

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

Afin que ce paramètre reste en place lors du redémarrage du serveur, il convient de modifier le fichier /etc/sysctl.conf

Trouver la ligne

# Uncomment the next line to enable packet forwarding for IPv4
# net.ipv4.ip_forward=1

et décommenté la 2eme en vous assurant que la variable est bien définie sur la valeur 1

net.ipv4.ip_forward=1

Créons maintenant notre règle firewall pour rediriger les paquets venant du réseau virtuel VPN vers notre LAN

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Pour que cette règle s’exécute au redémarrage du serveur, il convient de créer un fichier contenant cette règle dans le répertoire

/etc/network/if-up.d/

Configuration du routeur

Pour un serveur OpenVPN, par défaut (si vous n’avez pas modifier le fichier de conf) il faut ouvrir le port 1194 en UDP sur votre routeur.

Configuration du client

Sous Windows

Comme je le disais, le poste client est sous windows.

Nous allons télécharger l’application sur le site http://openvpn.se/download.html

A l’heure actuel le client est en version 2.0.9 http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe

Vous pouvez télécharger la francisation du programme http://openvpn.se/files/localized/binary/1.0.3/openvpn-gui-1.0.3-fr.exe

Lancez donc l’installation du client, une fois l’installation fini, une icone avec 2 petit écran rouge apparait à coté de l’heure, faite un clic droit puis Exit

Allez dans le répertoire C:\Program Files\OpenVPN\bin
Copiez le fichier openvpn-gui-1.0.3-fr.exe
Supprimez le fichier openvpn.exe
Renommez le fichier openvpn-gui-1.0.3-fr.exe en openvpn.exe.

Vous pouvez maintenant relancer openvpn : Menu Démarrer / Tous les programmes / OpenVPN / OpenVPN GUI

Nous allons préparer la config du client, allez dans le répertoire C:\Program Files\OpenVPN\config

Copiez les fichiers ca.crt, Client01.crt et Client01.key

Créons le fichier de config nommé par exemple MonServeur.ovpn

Vous pouvez trouver des exemples de fichiers de config dans le répertoire C:\Program Files\OpenVPN\sample-config

Dans notre cas, voici ce que contient mon fichier de config

#On spécifie qu'on est le client
client

#Même parametre que le serveur
dev tun
proto udp

remote adresse_du_serveur_openvpn 1194

#Tente de résoudre le nom de la machine indéfiniment
resolv-retry infinite

nobind

# essaie de préserver le même état lorsque la connexion redémarre
persist-key
persist-tun

#Définit les fichiers que vous avez copier
ca ca.crt
cert Client01.crt
key Client01.key

#permet la compression des données
comp-lzo

#détails des logs
verb 3

Sous Linux

Installez le paquet openvpn

Copiez les fichiers ca.crt, Client01.crt et Client01.key dans le répertoire /etc/openvpn/

Créons le fichier de config nommé par exemple client.conf toujours dans le répertoire /etc/openvpn/

Dans notre cas, voici ce que contient mon fichier de config

#On spécifie qu'on est le client
client

#Même parametre que le serveur
dev tun
proto udp

remote adresse_du_serveur_openvpn 1194

#Tente de résoudre le nom de la machine indéfiniment
resolv-retry infinite

nobind

# essaie de préserver le même état lorsque la connexion redémarre
persist-key
persist-tun

#Définit les fichiers que vous avez copier
ca ca.crt
cert Client01.crt
key Client01.key

#permet la compression des données
comp-lzo

#détails des logs
verb 3

Y’a plus qu’a lancer la connexion, même commande que pour lancer le serveur.

/etc/init.d/openvpn restart

Problème MTU

Après utilisation, j’ai constaté qu’un accès au bureau distant d’une machine via VNC ramait beaucoup trop à en perdre même la connexion…

Le problème venait du réglage MTU.

La machine distante passe par une freebox, j’ai donc ajusté le MTU à 1492

ifconfig eth0 mtu 1492

Pour le serveur, il existe une ligne à mettre dans le fichier de config d’openvpn pour faire un test de MTU

Rajoutez mtu-test quelque part dans votre fichier de config.

Relancer le serveur openvpn puis le client openvpn sur la machine distante.

Regardons à présent les log.

Thu Apr  8 13:54:54 2010 client-distant/88.88.88.88:49018 NOTE: Empirical MTU test completed [Tried,Actual] local->remote=[1541,1541] remote->local=[1541,1437]
Thu Apr  8 13:54:54 2010 client-distant/88.88.88.88:49018 NOTE: This connection is unable to accomodate a UDP packet size of 1541. Consider using --fragment or --mssfix options as a workaround.

On constate que les chiffres de MTU sont différent sur la fin de la 1ère ligne local→remote=[1541,1541] remote→local=[1541,1437]

Cette différence va engendrer un problème de fragmentation des paquets et à causé chez moi des pertes de connexion à VNC.

J’ai donc rajouté ces 2 lignes dans le fichier de config du serveur et du client openvpn

fragment 1437
mssfix

Après redémarrage du serveur puis du client, on retrouve dans les logs

Thu Apr  8 14:31:35 2010 client-distant/88.88.88.88:41551 NOTE: Beginning empirical MTU test -- results should be available in 3 to 4 minutes.
Thu Apr  8 14:34:40 2010 client-distant/88.88.88.88:41551 NOTE: Empirical MTU test completed [Tried,Actual] local->remote=[1389,1389] remote->local=[1437,1437]

On retrouve des valeurs cohérentes et pas de message d’erreur ;)

Au final, ma connexion VNC est instantanée !