Utiliser le Raspberry Pi comme passerelle OpenVPN pour permettre un accès VPN à tout votre réseau local

Article mis à jour le 3 Février 2016 : prenant en compte Raspbian Jessie et Systemd

Cet article décrit comment utiliser un Raspberry PI (sous Raspbian) comme passerelle OpenVPN (avec le client openvpn) pour permettre à toutes les machines de votre réseau local de se connecter à internet via votre serveur VPN (pour la mise en place de votre serveur VPN, je vous recomande l’article que j’ai écrit récemment qui décrit comment installer un serveur OpenVPN sur votre machine dédiée)

En clair, nous allons voir comment permettre à une machine n’ayant pas de client OpenVPN (comme une playstation 3, une Wii, un téléviseur intelligent, etc.) de se connecter de manière transparente à un serveur OpenVPN, via un RaspberryPi (ou autre machine sous Debian/Ubuntu connectée à votre réseau local)

Installation de Raspbian sur votre  RaspberryPi

On télécharge une image récente de Raspbian (dans mon cas 2015-11-21-raspbian-jessie.zip) l’on installe ensuite sur une SD card (sous Mac OS j’utilise ApplePi Baker).

On peut alors démarrer le RaspberryPi sous Raspbian : après avoir configuré un mot de passe, on peut commencer la configuration de la passerelle (le serveur SSH est ouvert par défaut, par la suite on se connectera en ssh au RaspberryPi, en utilisant pi comme utilisateur, qui a les bons droits sudo)

Configuration de votre RaspberryPi en passerelle OpenVPN

On commence par permettre le forwarding IPv4, en éditant /etc/sysctl.conf :

Ensuite on configure le RaspberryPi pour utiliser une IP statique (non plus obtenue par DHCP), en modifiant /etc/network/interfaces

Remarquez, cette étape n’est pas nécessaire si vous avez le contrôle de votre serveur DHCP, et que vous pouvez y assigner une adresse IP statique à votre Raspberry Pi

Ensuite, on y installe le client openvpn :

On installe le fichier client.ovpn :

Attention ! vous devez utilisez un fichier de configuration client.ovpn ne nécessitant pas d’authentification par mot de passe. Si vous utilisez OpenVPN Access Server, il suffit de vous rendre sur la console d’administration et d’ajouter les droits de « auto login » à votre compte, dans l’onglet « User Permissions »

Screen Shot 2014-09-16 at 10.23.45 AM

Acceptez ensuite de mettre à jour OpenVPN Access Server

Screen Shot 2014-09-16 at 10.23.35 AM

Et enfin rendez vous sur https://monip-vpn/?src=connect pour télécharger le client.opvn sans mot de passe (autologin profile tout en bas)

Screen Shot 2014-09-16 at 10.24.28 AM

Sur notre Raspberry Pi,  on démarre l’accès au VPN en utilisant le fichier .ovpn qui correspond à la configuration de votre serveur OpenVPN :

On autorise enfin le NAT sur la nouvelle interface réseau (tun0) créée par OpenVPN (qui est en fait un tunnel vers votre serveur VPN) :

et le tour est joué, vous n’avez plus qu’à configurer les machines sur votre réseau local pour utiliser votre Raspberry Pi comme passerelle par défaut.

Persister la configuration de votre passerelle

Pour garder ces réglages à chaque redémarrage de votre Raspberry Pi, il faut d’abord configurer OpenVPN pour se lancer au démarrage de la machine.

On copie la configuration client.opvn vers /etc/openvpn/client.conf

Attention ! Spécifique à Raspbian Wheezy !

On commence par autoriser OpenVPN à charger les configurations dans /etc/openvpn au démarrage, en éditant /etc/default/openvpn :

Pour Raspbian Jessie, mise à jour le 3 Février 2016:

On peut tester que tout fonctionne avec systemd :

si tun0 est bien dans la liste, alors il est temps de paramétrer le démarrage automatique (boot startup)

plus de détails : http://uname.pingveno.net/blog/index.php/post/2015/05/23/Migrate-an-OpenVPN-configuration-to-Debian-8-%28Jessie%29-with-systemd

-> fin du spécifique wheezy / jessie

On peut tester :

Il nous reste à persister la configuration NAT; rien de plus facile sous Raspbian :

Acceptez de sauvegarder les règles courantes :

Screen Shot 2014-09-16 at 11.45.40 AM

Vous pouvez vérifier que tout s’est bien passé en faisant un cat :

On retrouve bien nos règles de routing à travers tun0

En redémarrant votre raspberry pi, vous retrouverez votre passerelle en fonctionnement.

Aller plus loin : diagnostiquer

Lister les règles relatives au NAT :

Supprimer les règles relatives au NAT :

Ajouter la règle pour activer le nat sur tun0 :

Connecter une machine du réseau local à travers la passerelle OpenVPN

Pour les serveurs DNS, j’utilise les serveurs public de Google, mais vous pouvez très bien utiliser ceux mis à disposition pour la machine hébergeant le serveur OpenVPN.

Exemple de configuration d’une machine sous Mac OS X

Configurez son Mac pour se connecter via un routeur vpn
Configurez son Mac pour se connecter via un routeur vpn
Configurez son Mac pour se connecter via un routeur vpn
Configurez son Mac pour se connecter via un routeur vpn

 

Exemple de configuration d’une Playstation 3

Rendez vous dans les paramètres réseaux, configuration personnalisée :

Configurez sa PS3 pour se connecter via un routeur vpn
Configurez sa PS3 pour se connecter via un routeur vpn

 

Configurez sa PS3 pour se connecter via un routeur vpn
Configurez sa PS3 pour se connecter via un routeur vpn

 

Bien entendu, n’oubliez pas de remplacer l’adresse ip du routeur par celle de votre raspberry pi.

23 réflexions sur « Utiliser le Raspberry Pi comme passerelle OpenVPN pour permettre un accès VPN à tout votre réseau local »

  1. hi, Anthony Dahanne.
    I try to setup a vpn server on raspberry pi also, i can not find a deb install package for OPENVPN ACCESS SERVER which can install on raspberry pi, can you tell me how to get it ? thanks.

  2. Merci Anthony, cela marche parfaitement chez moi.
    Un script permettant de bloquer le routage lorsque la connexion vpn est off serait parfait ;-)
    Très bon tutoriel, bravo !

  3. Bonjour Anthony,
    Très intéressant, comme tout ton blog d’ailleurs. Quel boulot!
    J’ai du mal à adapter ton tuto pour mon cas, je t’explique:
    Je souhaite sauvegarder via sftp et Filezilla des données « clients distants » sur l’un de mes Nas (UbuntuServer actuellement) qui n’aura pas d’accès internet. J’ai créé un groupe d’utilisateurs chrootés sur ce Nas et une adresse no-ip.org pointant sur ma RaspberryPi avec port 22 redirigé.
    J’utilise ProxyCommand pour la communication entre les deux machines et ça fonctionne en interne/externe seulement si j’ignore le proxy dans Filezilla et que je mets le nom du serveur final. Bref, je n’arrive pas à paramétrer Filezilla correctement pour que les utilisateurs chrootés puissent se connecter directement sur leur dossier de dépôt dune part, et qu’ils ne voient pas le nom du Nas d’autre part. Est-ce qu’il faut que je permette aussi le forwarding IPV4 dans mon cas?
    Merci d’avance pour tes lumières
    fahdyezz

  4. Super tuto. J’ai réglé mon serveur DHCP pour qu’il donne comme passerelle le raspberry plutôt que la box.

    Malheureusement j’ai une perte de connexion énorme. Avec une seul carte réseau le raspberry a du mal à gérer.

    Je vais adapter ton tuto sur un serveur avec plusieurs carte réseau; une pour le LAN et une pour le WAN et pourquoi pas une DMZ ca pourrais servir.

    Je vais essayer de faire un script qui coupe la connexion en cas de non réponse du VPN.

    Merci ;)

  5. Génial, très bon tuto, ça marche parfaitement sur mon Raspberry B mais c’était lent, (environ 600 ko/s max en dl il me semble).

    Par contre je viens de recevoir mon raspberry pi 2 donc je vais tester, petite question est ce que ce ne serait pas plus léger et rapide qu’openvpn si on utilisait pptp par exemple ? Le processeur serait tout aussi surchargé ?

    Merci

  6. (désolé pour le double message)

    Certes ce serait moins sécurisé en PPTP mais je me pose la question, je suis avec Private Internet Access comme fournisseur VPN donc je ne peux pas changer le cryptage ou le cipher sans utiliser le client officiel PIA. (ce qui est impossible sous le rpi)

    Merci pour les éventuelles réponses :)

  7. La crainte du VPN payant était justifiée il y a encore de cela quelques années, mais cela ne devrait plus être le cas de nos jours. La presque totalité pour ne pas dire tous les fournisseurs ont revu leur politique de prix. Pour 5 euros par mois, on bénéficie de nos jours des multiples avantages d’un fournisseur de qualité. Les tarifs ne dépassent que très rarement les 8 euros par mois et il s’agit des abonnements les plus chers.

  8. Salut Freddy,
    Passer par le réseau d’un tiers présente certes l’avantage de la simplicité, mais configurer son VPN soit même, c’est permettre de choisir ses options, avoir la certitude de ne pas se faire « épier » son traffic, et surtout, c’est s’amuser à bricoler autour du Raspberry Pi !

  9. Salut Neex,
    PPTP est un protocole de VPN beaucoup moins « robuste » que OpenVPN. En effet, sur une connexion partagée (genre un hôtel, un café, bref un lieu public où l’usage d’un VPN perso peut être recommandé) il est rare que les connexions PPTP fonctionnent (certainement à cause d’un firewall ou routeur qui bloque le traffic de PPTP).
    OpenVPN a l’avantage de pouvoir faire passer ton traffic via UDP ou TCP, fournit effectivement une meilleure encryption et passe facilement à travers des réseaux publics tels que décrits plus haut.
    L’unique inconvénient c’est que tu dois installer un client OpenVPN sur tous tes appareils, mais une fois que c’est fait, on n’y pense plus :-)

  10. Salut Stéphane,
    je serais curieux de savoir si t’as pu progresser dans ta démarche d’équiper ton Raspberry Pi avec plusieurs cartes réseau !
    C’est vrai que le Raspberry pi souffre un peu en jouant le rôle de passerelle VPN !

  11. Salut,

    J’aurais une question (peut être bêtes),
    si j’utilise un raspberry en vpn a la maison.

    Les données qui sorte de mon serveur vpn raspberry, pourront être lues par n’importe quel entités ayant acces a ma central téléphonique.. vue que le raspberry devra decrypter les infos que je lui donne..

  12. Est-il possible de rediriger la connexion tun0 vers eth0 directement, pour utiliser la rpi en tant que routeur connecté au VPN ? J’ai essayé pendant des heures sans résultats…

  13. Merci Anthony pour ce tuto. Pensez-vous qu’un RaspberryPi Zero avec son dongle wifi serait suffisant pour faire tourner la configuration que vous proposez ?

    Côté serveur j’utilise un Raspi3 sous Pivpn/openvpn.

  14. Passionnant!
    J’ai voulu suivre le tuto pour me servir de ma vieille Eeebox Asus comme passerelle puis j’ai bifurqué au dernier moment pour expérimenter Tinyproxy, mon Eeebox étant sous VPN. Donc l’idée étant là-aussi de s’en servir comme passerelle VPN. Ça a fonctionné mais pas parfaitement. Certains détecteurs d’IP, voyaient mon adresse FR et notamment Pandora.com qui me rejetait, sauf curieusement sur mon Smartphone…
    Je voulais juste dire que pour les fichiers ovpn non autologin, c’est très facile à contourner. Je reviendrai un peu plus tard pour expliquer….

  15. Bon, ben, c’est encore moi…
    Pour transformer un fichier *.ovpn en « autologin »:
    1. allez en root dans /etc/openvpn.
    2. Créer un fichier auth.txt.
    3. Editer le fichier -toujours en root- et ajouter sur la première ligne votre username et sur la deuxième, votre mot de passe. Tout simplement. Enregistrez.
    4. Editez votre myvpn.ovpn -évidemment en root. Rechercher (Ctrl+f) « auth-user-pass ». Rajouter à la suite: « /etc/openvpn/auth.txt », ce qui donne: « auth-user-pass /etc/openvpn/auth.txt ». Et enregistrez

    Deux autres trucs:
    1. Je lance mon VPN depuis /etc/rc.local depuis plusieurs années et ça fonctionne nickel (pas besoin de NetworkManager). Ajoutez vers la fin de votre rc.local (avant exit 0): openvpn –config /etc/openvpn/myvpn.ovpn (ou le nom de votre ovpn). Essayez! Vous verrez, c’est parfait. Vous êtes déjà sous VPN avant d’arriver au Bureau.

    2. Commande pour changer de VPN (dans un lanceur): sh -c « sudo killall openvpn ; sudo openvpn –config /etc/openvpn/monvpn.ovpn ». J’en ai toute une batterie! J’ai la folie des VPN! « sudo killall openvpn » stoppe le VPN actif et  » sudo openvpn –config /etc/openvpn/myvpnflorida.ovpn » lance le nouveau VPN. Le point-virgule « ; » est un caractère d’enchaînement. Même si la première commande rate, la seconde est effectuée. C’est important si vous lancez la commande et qu’aucun VPN n’est actif: la première échoue donc. Mais la seconde peut fonctionner (ça peut arriver).

    Pour info: VPS à trois sous (heu… $3) et qui marche duTonnerre de Brest: https://bandwagonhost.com. Attention cependant, Google m’a fait un « caca nerveux » avec multiples demandes de Capcha, etc… Je ne dois donc pas être le seul à avoir cette IP… Tant pis pour eux, j’ai adopté Ixquick /Startpage comme moteur de recherche par défaut. Bien fait!

    Lien: https://www.it-connect.fr/lenchainement-des-commandes-sous-linux/

  16. Bonjour, `
    Super tes infos, comment tu accède de l’extérieur à ton réseau local ? ta solution m’intéresse car j’ai un serveur web derrière un routeur 4G et je souhaiterai pouvoir y accéder.
    merci SR

  17. Bonjour,
    Tuto tres interessant qui va m’aider pour mes tests..
    J’ai quelques questions:
    « vous devez utilisez un fichier de configuration client.ovpn ne nécessitant pas d’authentification par mot de passe. » Pourquoi?

    si je comprends bien, le PI, qui n’a qu’un port ethernet, est connecte sur le LAN. La passerelle a pour IP 192.168.1.254 cote LAN.

    L’adaptateur ETH0 du PI a l’adresse 192.168.1.1.
    L’adaptateur virtuel openVPN TAP0 ou TUN0 du PI a l’adresse IP 192.168.1.12.?

    Si je connecte un autre equipement reseau sur le LAN par le switch de la passerelle, et que je configure le champ routeur par defaut de cet equipement sur 192.168.1.12, alors ce deuxieme equipement IP verra son traffic IP passer par le tunnel openVPN?

    Parlons de mes tests actuels:
    Mon PC sur le LAN, se connecte en openVPN bridge a un serveur openvpn (freebox V6). Y a t il quelque chose a configurer sur ce PC /W7, pour que les autres equipements du LAN puissent passer par ce tunnel openVPN?

    Merci!
    Phil

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *