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
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.
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.
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/
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.
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
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
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 !