[Tuto] mise en place d'un VPN

/!\ Important /!\ Lorsque vous faites des copier/coller d'éléments de ce tuto, veillez à virer les “*” qui correspondant à des listes à puces et qui n'ont rien à faire dans un fichier de configuration!

Un VPN késako?

Un VPN ou réseau privé virtuel en français est un système permettant de créer un lien direct entre des ordinateurs distants. Concrètement c'est un système client-serveur permettant d'encapsuler tout le trafic réseau lié au client, de l'envoyer au serveur et celui-ci s'occupe de le traiter.

L'intérêt est, entre autre, de pouvoir débrider votre connexion (aller sur youtube en étant en Chine par exemple ou jouer à un jeu au McDo du coin).

Wahh, c'est cool, mais de quoi je vais avoir besoin pour ça?

Concernant les VPNs, il existe la solution du riche: les VPNs tout configurés, souvent avec une version au débit ultra limité gratuite et des versions payante, généralement hors de prix. Cette solution est souvent clé en main et dans tous les cas les sites proposant ce genre de services décrivent très bien la marche à suivre pour mettre en place leur produit.

Sauf que, comme nous sommes étudiants, nous sommes pauvres et donc on va s'intéresser à une solution avec un meilleur rapport qualité/prix: la mise en place d'un VPN sur un serveur personnel. Avec une offre de serveur pas chère (souvent un VPS) on peut s'en tirer pour moins de 3€ par mois !

Pour cela, il vous faudra (en vrac):

  • 1 serveur qui pourra éventuellement héberger d'autres services. Si vous ne savez pas où en trouver, google est votre ami 🙂 Personnellement, j'utilise un VPS mais cela fonctionne aussi très bien avec un serveur dédié.
  • ne pas être sur connexion du wifi du foyer. En effet, afin de configurer votre serveur vous aurez besoin d'y accéder en ssh, ce qui est bloqué par arise (ou alors connectez vous à perso.iiens.net, puis faites un ssh vers l'extérieur).
  • ce tuto.
  • 1 connexion internet.
  • N bières.
  • des yeux pour lire.
  • des doigts pour taper sur un clavier.

A noter que pour ce tuto je m'appuie sur ce que j'ai moi-même fais en utilisant les deux tutos suivants: Le tuto de MyOuaibe et celui de NICOLARGO

Ce tuto considère que votre serveur est sur ubuntu.

Mise en place du serveur

Outils

Connectez-vous en root à votre serveur. Assurez-vous que votre serveur est bien à jour:

  apt-get update; apt-get upgrade

Profitez-en pour créer un utilisateur que vous pourrez utiliser plus tard (rester tout le temps en root c'est pas génial)

  adduser votre_username

Puis, tant qu'à faire, ajoutez les droits nécessaires à ce user pour utiliser la commande sudo:

  adduser votre_username sudo

Vous allez avoir besoin d'openVPN. Ce logiciel est fournis de base avec ubuntu server 14.04, si vous ne savez pas s'il est installé ou pas, dans le doute:

  apt-get install openvpn

Pour la suite de ce tuto, vous allez avoir besoin d'easy-rsa:

  apt-get install easy-rsa

Un éditeur de texte sera utile également:

  apt-get install vim

Configuration d'openvpn et génération de la config serveur

Les tutos dont les liens figurent plus haut indiquent assez bien la marche à suivre pour les anciennes versions d'ubuntu. La suite s'applique donc à ubuntu 14.04.

easy-rsa fournit tout un jeu de scripts permettant de créer les clés et certificats nécessaires au bon fonctionnement d'openvpn. Afin de les avoir à disposition nous devons créer un répertoire voué à les contenir:

  cd /etc/openvpn
  make-cadir easy-rsa
  cd easy-rsa

Puis, on s'assure que le owner du répertoire easy-rsa est bien le bon:

  chown -R $USER /etc/openvpn/easy-rsa/

Maintenant, éditez les infos contenues dans le fichier vars

  vim vars

comme ceci:

  export KEY_COUNTRY="FR"
  export KEY_PROVINCE="91"
  export KEY_CITY="Evry"
  export KEY_ORG="votredomaine.fr"
  export KEY_EMAIL="an@nyme.fr"

Pour savoir comment utiliser vim, utilisez dans un terminal la commande vimtutor

Ensuite on lance la séquence suivante qui va générer les clés (.key) et les certificats (.crt):

  source vars
  ./clean-all
  ./build-dh
  ./pkitool --initca
  ./pkitool --server server
  openvpn --genkey --secret keys/ta.key

On copie ensuite les clés et les certificats utiles pour le serveur dans le répertoire /etc/openvpn/:

  cp keys/ca.crt keys/ta.key keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/

Pour dh1024.pem: vous pouvez ne pas avoir ce fichier mais dh2048.pem, ceci n'est pas gênant mais du coup tapez keys/dh<tab>. A noter que l'usage de l'auto-complétion (le <tab>) est toujours assez utile, c'est un bon truc de fainéant mangez-en!

Puis on génère un répertoire /etc/openvpn/jail dans lequel le processus OpenVPN sera chrooté (afin de limiter les dégâts en cas de faille dans OpenVPN) puis un autre répertoire (/etc/openvpn/clientconf) qui contiendra la configuration des clients:

  mkdir /etc/openvpn/jail
  mkdir /etc/openvpn/clientconf

Enfin on créé le fichier de configuration /etc/openvpn/server.conf:

  cd /etc/openvpn
  vim server.conf

Puis remplissez-le comme suit:

  # Serveur TCP/443
  mode server
  proto tcp
  port 443
  dev tun
  # Cles et 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
  # Reseau
  server 10.8.0.0 255.255.255.0
  push "redirect-gateway def1 bypass-dhcp"
  push "dhcp-option DNS 208.67.222.222"
  push "dhcp-option DNS 208.67.220.220"
  keepalive 10 120
  # Securite
  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

Voila nous sommes prêt a lancer le serveur pour cela:

  cd /etc/openvpn 
  openvpn server.conf

Si tout est ok jusque là, la dernière ligne affichée doit être : Initialization Sequence Completed Si ce n'est pas le cas, relisez ce tuto, les tutos liés et sinon googlez votre erreur.

Pour reprendre la main faites CTRL+C Reprenez en modification le fichier server.conf pour enlever le ; de la derniere ligne, ce ; servait à mettre en remarque la commande log-append /var/log/openvpn.log et maintenant que nous sommes prêt il vaut mieux avoir un petit log pour savoir ce qui se passe par la suite sur notre vpn.

Nous pouvons maintenant lancer notre serveur vpn correctement via la commande service openvpn start Maintenant il faut que l'on s'occupe du routage, nous avons jusque là mis en place uniquement la possibilité de demarrer un serveur vpn sécurisé, il faut maintenant donner la possibiliter d'accès au reseau public pour cela nous allons utiliser les possibilités de routage de linux Pour donner le droit de router à chaud il suffit de taper la commande :

  sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

Pour que cela soit toujours en place au prochain demarrage du serveur il faut l'indiquer dans un fichier de configuration soit en ajoutant une ligne soit en dé-commentant celle qui existe déjà dans le fichier /etc/sysctl.conf

Voici la ligne qui doit être présente dans ce fichier:

  net.ipv4.ip_forward = 1

Maintenant mettons en place les règles de routage :

  iptables -I FORWARD -i tun0 -j ACCEPT
  iptables -I FORWARD -o tun0 -j ACCEPT
  iptables -I OUTPUT -o tun0 -j ACCEPT
  iptables -A FORWARD -i tun0 -o venet0 -j ACCEPT
  iptables -t nat -A POSTROUTING -o venet0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 10.8.0.2/24 -o venet0 -j MASQUERADE

A noter la présence de venet0 au lieu de eth0, car sur les serveurs vps souvent ce ne sont pas des interfaces physiques de cartes réseau, mais des cartes virtuelles. Sur un serveur dédie ce sera donc eth0 (généralement). Vérifiez le nom de votre interface avec ifconfig.

Maintenant nous pouvons sauvegarder les régles dans un fichier afin de pouvoir s'en servir à chaque démarrage du serveur pour cela nous passons la commande

  sh -c "iptables-save > /etc/iptables.rules" 

Nous obtenons donc un fichier iptables.rules qui va falloir faire connaitre au script qui demarre le serveur VPS Pour cela je rappel que nous sommes sur un ubuntu serveur il nous faut creer un fichier

  vim /etc/network/interfaces.tail

et y mettre dedans

  pre-up iptables-restore < /etc/iptables.rules

Génération de la config client

Imaginons que l'on veuille créer une clés pour le client “SauvezMoïse”, alors il suffit de saisir les commandes suivantes sur le serveur:

  cd /etc/openvpn/easy-rsa
  source vars
  ./build-key SauvezMoïse

On copie les fichiers nécessaires dans un sous répertoire du répertoire /etc/openvpn/clientconf/ préalablement créé:

  mkdir /etc/openvpn/clientconf/SauvezMoïse/
  cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/SauvezMoïse.crt keys/SauvezMoïse.key /etc/openvpn/clientconf/SauvezMoïse/

On va ensuite dans le répertoire /etc/openvpn/clientconf/SauvezMoïse/:

  cd /etc/openvpn/clientconf/pcportablenicolargo/

Puis on créé le fichier client.conf suivant (il faut remplacer A.B.C.D par l'adresse publique de votre serveur VPN que vous pouvez obtenir avec la commande “wget -qO- ifconfig.me/ip” ou en lisant ce que vous affiche ubuntu server lors de votre connexion):

  # Client
  client
  dev tun
  proto tcp-client
  remote A.B.C.D 443
  resolv-retry infinite
  cipher AES-256-CBC
  ; client-config-dir ccd
  # Cles
  ca ca.crt
  cert SauvezMoïse.crt
  key SauvezMoïse.key
  tls-auth ta.key 1
  key-direction 1
  # Securite
  nobind
  persist-key
  persist-tun
  comp-lzo
  verb 3

Si vous comptez utiliser votre configuration sur un client qui se trouve derrière un proxy, ajoutez:

  http-proxy-retry
  http-proxy adresse_du_proxy port_du_proxy

après “; client-config-dir ccd” dans le cas d'un proxy http. Pour un proxy socks, référez-vous à la documentation d'openvpn.

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

On devrait ainsi avoir les fichiers suivants dans le répertoire /etc/openvpn/clientconf/SauvezMoïse/:

  • ca.crt: Certificat du serveur
  • client.conf: Fichier de configuration du client OpenVPN (Linux, BSD, MacOS X)
  • client.ovpn: Fichier de configuration du client OpenVPN (Windows)
  • SauvezMoïse.crt: Certificat du client
  • SauvezMoïse.key: Clés du client
  • ta.key: Clés pour l'authentification

Il ne reste plus qu'à mettre ces fichiers dans une archive ZIP et de la transmettre sur le PC client:

  zip SauvezMoïse.zip *.*
  logout
  scp root@ip_de_votre_serveur:/etc/openvpn/clientconf/SauvezMoïse/SauvezMoïse.zip ~/

Dézippez dans un endroit facile à retrouver.

OS X

Sur un client OS X, installez tunnelblk et indiquez-lui le fichier client.ovpn. Connectez-vous à votre vpn et profitez 🙂.

Windows

Sur un client Windows, installez le client openvpn. Sur le racourcis mis par défaut sur le bureau: clique droit → propriétés → compatibilité et cochez “Executer ce programme en tant qu'administrateur”. Puis dans le dossier d'installation d'openvpn (typiquement: C:\Programmes\OpenVPN\) copiez le contenu de l'archive (configuration du client + certificats) dans le dossier “config”. Lancez openvpn en utilisant le racourcis de votre bureau. Connectez-vous à votre vpn et profitez 🙂.

Linux

Si la ligne de commande ne vous gêne pas, copiez le fichier de conf client ainsi que les clefs et certificats nécessaires (ceux listé dans la conf client) dans /etc/openvpn/. Il suffit ensuite de lancer openvpn –config <chemin/vers/le/fichier/de/conf/client>.

Pour rediriger tout le traffic réseau dans le tunnel crée, ajoutez la ligne suivant dans la conf :

  redirect-gateway def1

Si vous préférez un client graphique, lisez donc sa doc (et complétez ensuite cette page).

Problèmes possibles

Partager un port

OpenVPN permet de faire proxy pour partager le port avec un autre serveur. Il faut pour cela être en TCP et rajouter côté serveur la ligne suivante (après la ligne indiquant le port) :

  port-share 127.0.0.1 4443

Ici tout le trafic que OpenVPN reçoit mais qui ne lui est visiblement pas destiné est redirigé vers le port 4443. Cela peut permettre notamment de partager le port 443 avec un serveur HTTPS.

SFR Wifi

Attention, si vous vous voulez utiliser votre VPN sur un SFR Wifi, il faut changer votre serveur DNS pour en utiliser un accessible depuis votre serveur VPN (par exemple celui fourni par Google (c'est mal, mais il est simple à retenir) : 8.8.8.8).

Cela est du au fait que SFR a eu la bonne idée pour les gens se connectant aux SFR Wifi de ne pas utiliser le serveur DNS sur la box (donc sur le réseau local) mais un serveur distant (chez moi 109.0.66.20 au moment où j'écris ces lignes). Comme cette IP ne fait pas partie du réseau local (qui est en 192.168.2.0/24), la requête passe par le VPN (route par défaut) et est refusée par le serveur DNS qui ne doit sûrement accepter que les requêtes venant des boxs SFR.