Un nouvel article sur le sujet est disponible à cette adresse: Créer un serveur OpenVPN sur Microsoft Azure
Un serveur VPN dans la pratique est généralement utilisé pour passer outre les limitations imposées par l'administrateur du réseau que vous utilisez.
Ainsi il est bien souvent utilisé pour:
- consulter les sites non autorisés sur le réseau
- afficher à la face du monde une IP différente de celle de notre domicile
Bref, un serveur VPN ça permet de protéger ses données et de contourner la censure (une problématique qu'une partie du monde ne connaît que trop bien).
Techniquement:
Un serveur VPN (VPN pour Virtual Private Network), permets de relier de manière sécurisée 2 réseaux entre eux en créant un tunnel sécurisé (encapsulation et chiffrement de paquets).
Le protocole utilisé le plus souvent auparavant était le protocole PPTP, celui-ci présenté déjà une faiblesse, car attaquable lors de sa phase d’identification, qui était résolu grâce à une complexité de mot de passe plus élevé notamment.
Cependant le fait que le chiffrement MS-CHAPv2 est désormais lui aussi cassé, PPTP est à abandonner.
OpenVPN est la solution à déployer dans le monde du libre afin de créer un serveur VPN avec lequel vous pourrez établir une connexion sécurisée.
Afin de pouvoir se connecter sur ce serveur VPN en tout lieu, c'est à dire depuis des hotspots publics notamment sans avoir de problème, on va configurer notre serveur VPN pour qu'il écoute sur son port 443.
Si jamais votre serveur VPN fait aussi office de serveur WEB avec connexion HTTPS (vous avez dit "owncloud" ?), nous verrons plus loin une astuce afin de garder ce service actif également.
Menu du jour:
- Pré-requis
- Installer OpenVPN
- Configurer OpenVPN
- Configuration du routage
- Création d'un compte client OpenVPN
- Installation et configuration du client OpenVpn sous Windows et Linux
- Script pour automatiser installation Serveur et création compte client
- Faire cohabiter un serveur VPN sur port 443 avec un serveur apache en HTTPS
Les explications qui vont suivre ont été copiées à 99% depuis le blog de Pazpop
Je m'accorde 1% car je suis sympa avec moi-même.
Dans cet article, je vais donc vous expliquer comment installer votre propre serveur VPN OpenVPN sous GNU/Linux Debian 7. Vous pouvez également suivre ce tutoriel pour d’autre distributions Linux et d’autres versions de Debian. Pour connaître la version de votre système d’exploitation, utiliser les commandes : uname -a et/ou cat /etc/debian_version.
- Pré-requis :
Avant de commencer, vous devez être connecté sur votre serveur GNU/Linux en root via putty. Vous devez également avoir votre système à jour (apt-get update && apt-get upgrade).
- Installer OpenVPN :
apt-get install openvpn |
Effectuez une copie des fichiers de configuration et du générateur de clées :
mkdir /etc/openvpn/easy-rsa/ cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/ |
- Configuration d'OpenVPN :
Éditez le fichier /etc/openvpn/easy-rsa/vars et ajoutez ces lignes à la fin du fichier:
export KEY_COUNTRY="FR" export KEY_PROVINCE="FR" export KEY_CITY="FR" export KEY_ORG="exemple.com" export KEY_EMAIL="exemple@exemple.com" |
Ensuite, exécutez les commandes suivante afin de générer les clés (.key) et les certificats (.crt) :
cd /etc/openvpn/easy-rsa/ source vars ./clean-all ./build-dh ./pkitool --initca ./pkitool --server server openvpn --genkey --secret keys/ta.key |
Copiez ensuite les clés et les certificats dans le répertoire /etc/openvpn/ :
cp keys/ca.crt keys/ta.key keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/ |
Puis, générez les répertoires /etc/openvpn/jail et /etc/openvpn/clientconf. Le premiers répertoire permet de chrooté le processus OpenVPN (afin de limiter les dégâts en cas de faille dans OpenVPN) puis, le dernier répertoire contiendra la configuration des clients :
mkdir /etc/openvpn/jail && mkdir /etc/openvpn/clientconf |
Enfin, créez le fichier de configuration /etc/openvpn/server.conf :
# Serveur TCP/443 mode server proto tcp port 443 dev tun # Clés certificats ca ca.crt cert server.crt key server.key dh dh1024.pem tls-auth ta.key 1 key-direction 0 cipher AES-256-CBC # Réseau server 10.8.0.0 255.255.255.0 push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 87.98.175.85" push "dhcp-option DNS 188.165.91.48" keepalive 10 120 # Sécurité user nobody group nogroup chroot /etc/openvpn/jail persist-key persist-tun comp-lzo # Log verb 3 mute 20 status openvpn-status.log log-append /var/log/openvpn.log |
Cette configuration permet de créer un serveur VPN SSL routé basé sur le protocole TCP et utilisant le port HTTPS (443). Les clients obtiendront une nouvelle adresse IP dans le range 10.8.0.0/24 et aurons les DNS de OpenNIC (87.98.175.85 et 188.165.91.48).
Vous pouvez tester la configuration en saisissant la commande suivante:
cd /etc/openvpn openvpn server.conf |
Alors en théorie si ça marche, ça renvoie à peu près cette ligne:
Tue Oct 16 09:13:00 2012 Initialization Sequence Completed
Personnellement cela ne m'a rien renvoyé, et même une fois j'ai fais ctrl+c pour sortir ^^ et pourtant mon serveur fonctionne donc ... je ne sais pas.
- Démarrage du serveur VPN OpenVPN :
On lance le serveur avec la commande :
/etc/init.d/openvpn start |
Vous pouvez observer les logs :
tail -t /var/log/openvpn.log |
- Configuration du routage :
À ce stade les machines clientes vont pouvoir se connecter au serveur VPN. Par contre impossible d’aller plus loin car ce dernier aura l’adresse 10.8.0.x qui ne sera par routée en dehors de votre serveur. Il faut donc configurer le serveur pour qu’il joue le rôle de routeur entre l’interface VPN (tun0) et l’interface physique (eth0). Après ces opérations, votre serveur NATera les adresses en 10.8.0.x vers son adresse IP réelle.
Configuration du routage:
[ sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' ]
Afin de rendre cette modification permanente, vous devez éditer le /etc/sysctl.conf :
net.ipv4.ip_forward = 1 |
Puis configurer la translation d’adresse (NAT) :
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE |
Pour rendre cette règle de NAT persistante, il va falloir créer un script qui se lancera au démarrage de votre Debian :
Dans le fichier "/etc/init.d/ScriptIPtables", écrire (en root):
#!/bin/bash ### BEGIN INIT INFO # Provides: ScriptFirewall # Required-Start: $remote_fs $syslog $network # Required-Stop: $remote_fs $syslog $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: ScriptFirewall # Description: SSH,80,443 ### END INIT INFO #!/bin/bash echo Paramétrage du Firewall ... # Vidage des tables # NAT pour la connexion VPN iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE echo - Mise en place du NAT VPN : [OK] # Relance Fail2ban echo Configuration du Firewall terminée |
Rendre exécutable ce fichier (en root):
chmod +x /etc/init.d/ScriptIPtables
Le serveur est maintenant prêt à accueillir les clients.
- Création d'un compte client OpenVPN
Ici, nous allons créer la configuration pour notre client VPN. (Plus bas, un script pour faire ça rapidement)
Avec les commandes suivantes, un mot de passe sera demandé à l'utilisateur pour se connecter à votre serveur VPN.
cd /etc/openvpn/easy-rsa source vars ./build-key-pass mon-serveur-vpn |
Si pour vous cela n'a pas d'importance, vous pouvez utiliser les commandes suivantes:
cd /etc/openvpn/easy-rsa source vars ./build-key mon-serveur-vpn |
Copiez les fichiers nécessaires sous le répertoire /etc/openvpn/clientconf/ préalablement créé :
mkdir /etc/openvpn/clientconf/mon-serveur-vpn/ cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/mon-serveur-vpn.crt keys/mon-serveur-vpn.key /etc/openvpn/clientconf/mon-serveur-vpn/ |
On va ensuite dans le répertoire /etc/openvpn/clientconf/mon-serveur-vpn/ :
cd /etc/openvpn/clientconf/mon-serveur-vpn/ |
Créez le fichier client.conf (remplacez A.B.C.D par l’adresse publique de votre serveur VPN) :
# Client client dev tun proto tcp-client remote A.B.C.D 443 resolv-retry infinite cipher AES-256-CBC # Clé ca ca.crt cert mon-serveur-vpn.crt key mon-serveur-vpn.key tls-auth ta.key 1 key-direction 1 # Sécurité nobind persist-key persist-tun comp-lzo verb 3 |
Pour assurer la compatibilité avec le client Windows OpenVPN, on fait une copie du fichier client.conf vers client.ovpn:
cp client.conf client.ovpn |
- Installer et configurer votre client VPN Windows
Téléchargez et installez le client VPN OpenVPN. Vous le trouverez ici. Attention, prenez le client compatible avec l’architecture de votre CPU (64bits ou 32).
Allez sur votre serveur et télécharger le contenue du répertoire /etc/openvpn/clientconf/mon-serveur-vpn. Collez ensuite les fichiers dans le répertoire de votre ordinateur C:Program FilesOpenVPNconfig.
Exécutez votre client VPN OpenVPN en tant qu’administrateur. Dans votre barre des taches, en bas à droite, une nouvelle icône devrait apparaître. Faites un clic droit dessus et cliquez sur ‘Connecter’.
- Installer et configurer votre client VPN Linux
Et bien, il suffit d'un petit "apt-get install openvpn", se rendre ensuite à l'aide du terminal dans le dossier ou se trouve l'ensemble de vos fichiers clients. Puis "sudo openvpn client.conf".
Après quelques secondes vous serez connecté à votre serveur VPN !!
Pour vérifier votre nouvelle IP, allez ici.
- Script création d'un serveur OpenVPN
Script extrêmement basique car il compile juste les étapes décrites précédemment. Fonctionne parfaitement sous une installation propre de Debian 7.
A télécharger en txt.
Attention, il va falloir fixer à la main les règles iptables.
- Script création compte client OpenVPN
Un script pour automatiser la création de clients OpenVPN.
#!/bin/bash # Syntaxe: # ./create_vpn_user.sh <prenom-nom> # # Test que le script est lance en root if [ $EUID -ne 0 ]; then echo "Le script doit etre lance en root: # $0 <prenom-nom>" 1>&2 exit 1 fi # Test parametre if [ $# -ne 1 ]; then echo "Il faut saisir le nom de la personne: # $0 <prenom-nom>" 1>&2 exit 1 fi cd /etc/openvpn/easy-rsa source vars ./build-key $1 mkdir /etc/openvpn/clientconf/$1 cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/$1.crt keys/$1.key /etc/openvpn/clientconf/$1 ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)" touch /etc/openvpn/clientconf/$1/client.conf echo " # Client client dev tun proto tcp-client remote $ip 443 resolv-retry infinite cipher AES-256-CBC # Cle ca ca.crt cert $1.crt key $1.key tls-auth ta.key 1 key-direction 1 # Securite persist-key persist-tun comp-lzo verb 3" > /etc/openvpn/clientconf/$1/client.conf cp /etc/openvpn/clientconf/$1/client.conf /etc/openvpn/clientconf/$1/client.ovpn #zipper tous les fichiers à donner au client zip -r -T -9 /etc/openvpn/clientconf/$1.zip /etc/openvpn/clientconf/$1
- Faire cohabiter OpenVPN et un serveur web sur son port 443 c'est tout à fait possible.
Pour cela on doit procéder à "2" modifications.
Tout d'abords si vous utilisez un serveur web apache:
Modifier le fichier: "/etc/apache2/ports.conf" afin de changer le port des connexions SSL qui était (surement) 443 en 10443 par exemple.
<IfModule mod_ssl.c> # If you add NameVirtualHost *:443 here, you will also have to change # the VirtualHost statement in /etc/apache2/sites-available/default-ssl # to <VirtualHost *:443> # Server Name Indication for SSL named virtual hosts is currently not # supported by MSIE on Windows XP. Listen 10443 </IfModule> <IfModule mod_gnutls.c> Listen 10443 </IfModule>
Il faut que vous fassiez le même types de modification dans vos fichiers de virtual-hosts, qui doivent se trouver ici: "/etc/apache2/sites-available" toutes mentions du port 443 deviendra 10443.
Ensuite il faut modifier le fichier: "/etc/openvpn/server.conf"
# Serveur TCP/443 mode server proto tcp port 443 port-share 127.0.0.1 10443
On a rajouté la ligne:
port-share 127.0.0.1 10443
Cela permet d'indiquer à OpenVPN que les paquets https qu'il va recevoir sur ce port devront être redirigés en interne sur le port 10443 sur lequel écoute désormais notre serveur apache.
/etc/init.d/apache2 restart /etc/init.d/openvpn restart
Si un message d'erreur apparaît pour l'un ou l'autre c'est probablement dû à un oubli du côté d'Apache.
Ce qu'il faut comprendre: bien que nous accédions au serveur OpenVPN via le port 443, qui correspond généralement à une connexion de type sécurisée SSL, les paquets envoyés par OpenVPN sur ce port ne comportent pas l'en-tête attendus dans le cas d'une connexion https.
Ainsi si jamais votre opérateur utilise un équipement particulier pour regarder à l'intérieur de vos paquets, il peut repérer l'utilisation d'OpenVPN et le bloquer.
Si jamais vous étiez dans ce cas de figure, il est intéressant de s'orienter vers ces solutions:
- http://freesstpvpn.com/
- http://www.softether.org/
- http://blogs.technet.com/b/pierrc/a..
- https://www.bestvpn.com/blog/5919/how-to-hide-openvpn-traffic-an-introduction/
Astuce: Si jamais vous arrivez à vous connecter au VPN avec votre client, mais que vous n'avez pas ensuite accès à internet, pensez à vérifier vos règles NAT:
#Voir les règles appliquées iptables -t nat -nvL POSTROUTING --line-numbers # Pour supprimer une règle en particulier iptables -t nat -D POSTROUTING [numéro_de_ligne]
Sources consultées (et aujourd'hui copié) lors de la création de cet article:
Création du serveur: http://pazpop.fr/installer-un-serveur-vpn-openvpn-sous-gnulinux-debian/
Chroot OpenVPN + script: http://blog.valouille.fr/2013/02/installation-dun-serveur-openvpn-et-automatisation/
Faire cohabiter OpenVPN + serveur web https: http://www.vpntutorials.com/tutorials/openvpn-sharing-a-port-with-a-webserver-on-port-80-443/