Forum Linux.debian/ubuntu [Tuto/HowTo] Monter un serveur VPN avec PiVPN sur Raspbian

Posté par  . Licence CC By‑SA.
9
6
mai
2017

Sommaire

musique d'ambiance : Tryo - Watson Tryo - La misère d'en face
Note : PiVPN fonctionne autant sur Raspbian, Debian qu'Ubuntu

_


_

Qu'est-ce qu'OpenVPN ?

  • OpenVPN est un logiciel permettant de créer un Réseau Virtuel Privé (ou Virtual Private Network), plus communément appelé VPN. Le client et le serveur sont sous licence GPLv3 (libre).
  • Dans ce tutoriel nous allons utiliser PiVPN qui est un ensemble de scripts permettant de faciliter l'installation et l'utilisation d'OpenVPN. Je vous conseil de choisir un Raspberry Pi type 2 ou supérieur (sur le 1 pour un seul client le CPU varie déjà entre 30% et 70%).
  • Note : n'oubliez pas de maintenir à jours votre machine !

_


_

Mise en place d'OpenVPN serveur sur Raspbian (debian pour Raspberry Pi)

Note : on part de zéro (fresh install)

  1. Passez en administrateur (root)
  • sur Raspbian/Ubuntu
sudo su
  • sur Debian
su
  1. Balayage du système (pour Raspbian Jessie normal)
apt-get purge libreoffice* wolfram-engine sonic-pi minecraft-pi greenfoot pcmanfm realvnc-vnc-server supercollider-ide
apt-get autoremove && apt-get autoclean
dpkg -P $(dpkg -l | grep "^rc" | tr -s ' ' | cut -d ' ' -f 2)
  1. Mises à jours du système
apt-get update
apt-get dist-upgrade -y
#raspberry pi uniquement
rpi-update
  • Si rpi-update et raspi-config ne sont pas installé (Raspbian Jessie Light) :
apt-get install rpi-update raspi-config
  1. Fixez l'IP de votre Raspberry Pi (source, pour Debian checkez ici)
    • Éditez /etc/dhcpcd.conf
nano /etc/dhcpcd.conf
  • Et collez à la fin les lignes suivantes en adaptant à vos souhaits et votre réseau.
    interface eth0
    static ip_address=192.168.1.42/24
    static routers=192.168.1.1
    static domain_name_servers=192.168.1.1

interface eth0 => ou eth0 est votre interface réseau
static ip_address=192.168.1.42/24 => ou 192.168.1.42 est l'adresse IP que vous souhaitez
static routers=192.168.1.1 => ou 192.168.1.1 est l'adresse IP de la passerelle (le routeur)
static domain_name_servers=192.168.1.1 => ou 192.168.1.1 est l'adresse IP du serveur DNS à utiliser

  1. Redémarrez la machine
reboot
  1. Re-passez en administrateur (root)
  • sur Raspbian/Ubuntu
sudo su
  • sur Debian
su
  1. Créer un utilisateur dédié
adduser pivpn
  1. Ouvrez un screen (sera utile si l'installation s'attarde plus que votre patience, surtout si vous générez les clés de chiffrement)
screen -R installation
  1. Lancement de l'installation
curl -L https://install.pivpn.io | bash
  1. Lorsque l'installeur vous demande :
  • quel user utiliser => utilisez les flèches et la barre d'espace pour choisir l'utilisateur créé précédemment ( pivpn ).
  • quel protocole choisir => laissez UDP sauf si vous souhaitez pouvoir vous connecter à votre VPN depuis le réseau Tor, à ce moment là choisissez TCP
  • quel port choisir => laissez celui par défaut
  • la taille de la clés de chiffrement => choisissez la plus élevée (actuellement 4028bit)
  • s'il faut télécharger ou générer la clés Diffie-Hellman => Je vous conseil de les générer néanmoins il faut un peu plus de 30 heures pour un RPI 1b donc c'est suivant votre motivation (vous pouvez quitter le screen sans l’arrêter via le raccourcis clavier CTRL+A => CTRL+D)
  1. Éditez le fichier /etc/sysctl.conf
nano /etc/sysctl.conf
  • Et dé-commentez (supprimez les # au début) les deux lignes suivantes

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

  1. Demandez au système de prendre en compte la précédente commande
sysctl -p
  1. Redémarrez
reboot

Forcer toutes les connexions à passer par le VPN

Note : Par défaut les clients ne transitent par le VPN que pour contacter d'autres machines à l'intérieur du VPN. Si vous souhaitez faire passer toutes les communications des clients par le serveur VPN suivez cette procédure.
Attention : Cela rend inaccessible les clients depuis l'extérieur du VPN.

  1. Éditez le fichier /etc/openvpn/server.conf
sudo nano /etc/openvpn/server.conf
  1. Cherchez (CTRL+W) push "redirect-gateway def1" et remplacez par push "redirect-gateway def1 bypass-dhcp" OU dé-commentez la ligne en supprimant le point virgule (;) au début de la ligne suivant les fichiers de config. Enfin sauvez et quittez (CTRL+X).

_


_

Utilisation côté serveur

Comment créer un client/utilisateur pour serveur (sans mot de passe) ?

  • Réponse : Entrez la commande suivante dans votre terminal. sudo pivpn add nopass

La fin de la commande va vous sortir un paragraphe du style

Done! myUser.ovpn successfully created!
myUser.ovpn was copied to:
/home/pivpn/ovpns
for easy transfer.

Comment ajouter un client/utilisateur (avec mot de passe) ?

  • Réponse : Entrez la commande suivante dans votre terminal puis choisissez un nom d'utilisateur et un mot de passe.
sudo pivpn add

La fin de la commande va vous sortir un paragraphe du style

Done! myUser.ovpn successfully created!
myUser.ovpn was copied to:
/home/pivpn/ovpns
for easy transfer.

Comment supprimer un client/utilisateur ?

  • Réponse : Entrez la commande suivante dans votre terminal puis choisissez le nom de l'utilisateur.
sudo pivpn revoke

Peut-on afficher la liste des clients connecté au serveur ?

  • Réponse : Bien sur, entrez la commande suivante sur le serveur.
sudo pivpn -c

Ligne de commande : fixer l'adresse IP d'un client ou plusieurs clients sur le VPN

  1. Voyez ce tutoriel : [Tuto/HowTo] Fixer ip des clients sur openvpn

_


_

Utilisation d'OpenVPN côté client

Bonus : Si besoin, vous pouvez vérifier votre IP (publique) à cette adresse (PHP) ou encore ici (PHP + javascript). Si vous voulez checker votre IPv4 en ligne de commande :

curl -s -k -L https://www.0rion.netlib.re/outils/myIP.php | cat

Interface Graphique : installer OpenVPN client sur Ubuntu, Xubuntu, Kubuntu, Voyager OS, Linux Mint et le connecter

Note : vous devez utiliser le même nom de domaine que configuré sur le serveur VPN. Ainsi si votre serveur VPN est configuré pour être accédé depuis vpn.helloWorld.com, vous ne pourrez pas y accéder en entrant directement son ip (par exemple 192.168.1.42). Vous pouvez modifier votre fichier /etc/hosts pour corriger ce problème facilement :)

  1. Installez les pré-requis
sudo apt-get install openvpn network-manager-openvpn-gnome
  1. Vous devez disposer de votre fichier nomUtilisateur.ovpn si vous ne l'avez pas importez le ou demandez le à l'admin du VPN

  2. Lancez le gestionnaire réseau de votre distribution et choisissez "Modifications des connexions" puis "Ajouter" et enfin "Importer une configuration VPN enregistrée" et finalisez avec "Créer".

  3. Le logiciel vous demande le fichier .ovpn

  4. Enfin entrez le mot de passe associé à l'utilisateur (qui permet d'accéder à la clés) et si vous désirez ou non que le VPN soit disponible aux autres utilisateurs du système.

  5. Enregistrez puis tentez de vous connecter à votre VPN pour le tester :)

Ligne de commande : Installer OpenVPN client sur Raspbian/Ubuntu et le connecter

Note : vous devez utiliser le même nom de domaine que configuré sur le serveur VPN. Ainsi si votre serveur VPN est configuré pour être accédé depuis vpn.helloWorld.com, vous ne pourrez pas y accéder en entrant directement son ip (par exemple 192.168.1.42). Vous pouvez modifier votre fichier /etc/hosts pour corriger ce problème facilement :)

  1. Installez les pré-requis
sudo apt-get install openvpn
  1. Vous devez disposer de votre fichier nomUtilisateur.ovpn si vous ne l'avez pas importez le ou demandez le à l'admin du VPN

  2. Placez le fichier nomUtilisateur.ovpn dans /etc/openvpn/

sudo mv ~/Download/nomUtilisateur.ovpn /etc/openvpn/
  1. Accordez le droit de lecture uniquement pour l'utilisateur qui en a besoin.
sudo chown root:root /etc/openvpn/nomUtilisateur.ovpn
sudo chmod 770 /etc/openvpn/nomUtilisateur.ovpn
  1. Lancez openvpn avec le fichier de configuration
sudo openvpn --daemon --cd /etc/openvpn --config nomUtilisateur.ovpn

Note : Si vous êtes sur Ubuntu ou Raspbian et que vous souhaitez pouvoir accéder aux machines connectées à votre VPN sans pour autant que tout le trafic ne transitent par le VPN, alors ajoutez dans la commande --route-nopull comme suit

sudo openvpn --daemon --route-nopull --cd /etc/openvpn --config nomUtilisateur.ovpn
  1. Testez ! :)

Si vous avez forcé le passage par le VPN

curl -s -k -L https://www.0rion.netlib.re/outils/myIP.php | cat

Si vous n'avez pas forcé le passage par le VPN

ping -c 10 10.8.0.1

_


_

Astuces

Checker si openvpn est bien lancé

  1. Lancez la commande suivante :
ps -aux | grep -E '[o]penvpn'

Afficher la version d'openvpn installée (autant client que serveur)

openvpn --version

Est-ce qu'OpenVPN consomme beaucoup de ressources ?

Voici un screenshot pris lorsque j'ai connecté mon serveur ZoneMinder à un OpenVPN installé sur un RPI 1B+ puis que j'ai affiché une des cameras de surveillance (qui est passé de +-21FPS a 1fps, tout le trafic réseau de ZoneMinder transitant par le VPN soit un flux variable entre 1Mo/s et 2Mo/s)
DLFP

_


_

  • # dépêche ?

    Posté par  (site web personnel) . Évalué à 0.

    Ca pourrait se mettre en dépêche ça non ?

    • [^] # Re: dépêche ?

      Posté par  . Évalué à 0.

      ou dans le wiki :)

      Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

      • [^] # Re: dépêche ?

        Posté par  (site web personnel) . Évalué à 2.

        En tout cas, merci pour le tuto : c'est imprimé et mis de côté. Je ne sais pas encore si je vais m'en servir.

        • [^] # Re: dépêche ?

          Posté par  . Évalué à -3.

          Merci à toi pour ton retour positif :) N'hésites pas à rapporter toute amélioration/question qui te passerait à l'esprit :)

          Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

  • # PiVPN vs Yunohost

    Posté par  . Évalué à -2. Dernière modification le 07 mai 2017 à 19:15.

    Pour ceux qui ne le savent pas, on peut aussi faire un serveur VPN avec Yunohost. Néanmoins ce dernier (vpn sur yunohost) est, pour le moment, buggé (mais pas abandonné).
    Comme PiVPN et Yunohost ne sont pas totalement pareil, voici se que j'ai remarqué :

    VPN sur Yunohost
    Yunohost apporte l'avantage du LDAP pré-installé et gérable depuis une WEBUI.
    Les clients peuvent télécharger le fichier de config directement depuis la WEBUI en se loggant.
    Par contre les fichiers de configuration (.conf et .ovpn) que yunohost fournis aux utilisateurs sont éronné (un problème avec "user" et "group", corrigeable en éditant les fichiers manuellement après téléchargement).
    L'installeur de Yunohost refuse de fonctionner si on est loggé sur l'utilisateur "pi" se qui pose problème lorsqu'on veut l'installer sur raspberry pi.

    PiVPN
    Déjà il fonctionne !
    Très simple d'utilisation.
    Pas d'interface graphique.
    On a plus de choix lors de l'installation (taille des clés, faut-il télécharger la Diffie-Hellman ou la générer) que Yunohost.
    Comme ce n'est qu'un ensemble de script, on dispose d'une installation normale d'openvpn se qui permet de suivre les autres tuto sur le net pour apporter telle ou telle modification

    Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

  • # Essais et correction des bugs/erreurs

    Posté par  . Évalué à -3.

    Je suis en train de tester le tuto dans tout les sens :

    Le client fonctionne sans problème avec Debian Jessie et Raspbian. Par contre sur Ubuntu 16.04 j'arrive à me connecter au VPN, à ping les machines connectées au VPN mais je perd l'accès au LAN et au WAN.
    Je suis actuellement en train de chercher comment corriger ce problème (n'hésitez pas à participer, je n'ai qu'une vie).

    J'ai rédigé un tuto sur comment connecter le client OpenVPN au démarrage de la machine, je reposte dans un nouveau topic où je le poste ici même? (j'ai peur qu'on me reproche encore de faire trop long ^ ^ ).
    Notez que si vous voulez aidez à l'améliorer, par exemple en utilisant un service plutôt que rc.local, vous êtes le bienvenu.

    Pour les ubbers hackers, les hardcores bidouilleurs : j'ai fini de rédiger le pire cauchemar des grandes oreilles et une solution au harpinning en IPv4: [Tuto/HowTo] [GNU/Linux] Accéder à son VPN depuis le réseau Tor via SSH Tunneling. Il reste à l'essayer/corriger/améliorer (je le testerai quand j'aurai le temps).

    Petite question si quelqu'un lit ce thread :
    Peut-on utiliser un répartiteur de charge avec OpenVPN? (genre déployer le VPN sur deux raspberry pi et si l'un plante tout continue de fonctionner) Si oui, quel logiciel conseillez-vous ?

    Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

    • [^] # Re: Essais et correction des bugs/erreurs

      Posté par  . Évalué à -2. Dernière modification le 08 mai 2017 à 20:00.

      Le client fonctionne sans problème avec Debian Jessie et Raspbian. Par contre sur Ubuntu 16.04 j'arrive à me connecter au VPN, à ping les machines connectées au VPN mais je perd l'accès au LAN et au WAN.
      Je suis actuellement en train de chercher comment corriger ce problème (n'hésitez pas à participer, je n'ai qu'une vie).

      Voila c'est corrigé.

      Via Interface Graphique :

      • Dans la barre des icônes cliquez sur le Gestionnaire Réseau (Network Manager) => Modification des connexions => Cliquez sur votre connexion VPN (si vous ne l'avez pas encore créé : Ajouter => Importer une configuration VPN enregistrée => Paramètres IPv4 => Routes => Cochez "Utiliser cette connexion uniquement pour les ressources de son réseau".

      Via Ligne de Commandes :

      • Remplacez votre commande
      openvpn --cd /etc/openvpn --config myUser.ovpn
      
      • Par celle-ci où nous ajoutons --route-nopull
      openvpn --route-nopull --cd /etc/openvpn --config myUser.ovpn
      

      Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

  • # UUOG Detected !

    Posté par  (site web personnel) . Évalué à 1.

    Non au grep -v "grep" !

    ps -aux | grep -v "grep" | grep "openvpn"

    Peut facilement devenir un

    ps -aux | grep -E '[o]penvpn'

    Suivant le grep, un simple ps -aux | grep '[o]penvpn' juste marche (le -E est POSIX).

    • [^] # Re: UUOG Detected !

      Posté par  . Évalué à 2.

      Ca fonctionne , par contre on perd les couleurs et la mise en gras.
      J'ajoute au tuto de suite, merci pour ton amélioration. :)

      Pourrais-tu, stp, expliquer la différence?

      Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

    • [^] # Re: UUOG Detected !

      Posté par  . Évalué à 3.

      ou pas

      ps faux | grep -E 'firefox'
      moi 2345 31.6 11.3 2937988 898476 ? Sl 15:42 3:04 _ /usr/lib/firefox/firefox
      moi 2771 0.0 0.0 14260 932 pts/1 S+ 15:52 0:00 _ grep --color=auto -E firefox

      ou bien si

      ps aux | grep '[f]irefox'
      moi 2345 27.1 11.3 2937988 902972 ? Sl 15:42 3:10 /usr/lib/firefox/firefox

      c'est donc le faite d'utiliser les [ ] qui force grep à faire une regex et donc à ne prendre que cela et surtout à s'ignorer lui meme

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.