====== 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 !