Installer un serveur OpenVPN sous Debian

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:

  1. Pré-requis
  2. Installer OpenVPN
  3. Configurer OpenVPN
  4. Configuration du routage
  5. Création d’un compte client OpenVPN
  6. Installation et configuration du client OpenVpn sous Windows et Linux
  7. Script pour automatiser installation Serveur et création compte client
  8. 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.

Bien sûr après avoir fait ces modifications, il faut relancer nos services:

/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:


 

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/

 

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.