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)
Contents
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 :
1 |
net.ipv4.ip_forward = 1 |
Ensuite on configure le RaspberryPi pour utiliser une IP statique (non plus obtenue par DHCP), en modifiant /etc/network/interfaces
1 2 3 4 5 6 7 8 9 10 11 12 13 |
auto lo iface lo inet loopback #iface eth0 inet dhcp iface eth0 inet static address 192.168.1.1 netemask 255.255.255.0 gateway 192.168.1.254 # IP de la boite qui me connecte à internet allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp |
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 :
1 |
$ sudo apt-get install openvpn |
On installe le fichier client.ovpn :
1 2 3 |
$ scp ~/Downloads/client.ovpn pi@192.168.1.12: pi@192.168.1.12's password: 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 »
Acceptez ensuite de mettre à jour OpenVPN Access Server
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)
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 :
1 2 3 4 5 6 7 |
$ sudo openvpn --config client.ovpn Tue Sep 16 01:25:37 2014 OpenVPN 2.2.1 arm-linux-gnueabihf [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Oct 12 2013 [...] Tue Sep 16 01:25:52 2014 ROUTE default_gateway=192.168.1.254 --> votre routeur adsl / cable Tue Sep 16 01:25:52 2014 TUN/TAP device tun0 opened --> nouvelle interface réseau tun0 [...] Tue Sep 16 01:25:57 2014 Initialization Sequence Completed |
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) :
1 |
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE |
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
1 |
$ sudo cp client.opvn /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 :
1 |
AUTOSTART="all" |
Pour Raspbian Jessie, mise à jour le 3 Février 2016:
On peut tester que tout fonctionne avec systemd :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo systemctl start openvpn@client $ ifconfig eth0 ... lo ... tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:192.168.255.6 P-t-P:192.168.255.5 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:228 (228.0 B) |
si tun0 est bien dans la liste, alors il est temps de paramétrer le démarrage automatique (boot startup)
1 2 |
pi@raspberrypi:/etc/openvpn $ sudo systemctl enable openvpn@client Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn@client.service to /lib/systemd/system/openvpn@.service. |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
pi@raspberrypi ~ $ sudo service start pi@raspberrypi:~ $ ifconfig eth0 ... lo ... tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:192.168.255.6 P-t-P:192.168.255.5 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:228 (228.0 B) |
Il nous reste à persister la configuration NAT; rien de plus facile sous Raspbian :
1 2 |
$ sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE $ sudo apt-get install iptables-persistent |
Acceptez de sauvegarder les règles courantes :
Vous pouvez vérifier que tout s’est bien passé en faisant un cat :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ 192.1 # Generated by iptables-save v1.4.14 on Tue Sep 16 00:46:06 2014 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT # Completed on Tue Sep 16 00:46:06 2014 # Generated by iptables-save v1.4.14 on Tue Sep 16 15:46:06 2014 *nat :PREROUTING ACCEPT [8376:660542] :INPUT ACCEPT [525:86733] :OUTPUT ACCEPT [439:33304] :POSTROUTING ACCEPT [634:55599] -A POSTROUTING -o tun0 -j MASQUERADE -A POSTROUTING -o tun0 -j MASQUERADE COMMIT # Completed on Tue Sep 16 15:46:06 2014 |
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 :
1 |
# iptables -L -t nat |
Supprimer les règles relatives au NAT :
1 |
# iptables -F -t nat |
Ajouter la règle pour activer le nat sur tun0 :
1 |
# iptables --table nat -A POSTROUTING -o tun0 -j MASQUERADE |
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
Exemple de configuration d’une Playstation 3
Rendez vous dans les paramètres réseaux, configuration personnalisée :
Bien entendu, n’oubliez pas de remplacer l’adresse ip du routeur par celle de votre raspberry pi.
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.
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 !
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
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
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
(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
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.
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 !
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
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 !
Bonjour fahdyezz,
Je n’avais jamais utilisé le Raspberry Pi comme un « aiguilleur » de sauvegardes.
Bon courage !
a quick google search revealed this url https://openvpn.net/index.php/access-server/download-openvpn-as-sw/113.html?osfamily=Debian
Marche très bien avec les chaînes us mais pas avec Netflix.
Quelqu’un a déjà réussi à faire ça ?
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..
pas sur de bien comprendre ta question…
la communication entre ton raspberry PI (client ovpn) et ton serveur VPN sera chiffrée
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…
Allo,
as tu essayé de bridger ? je donne un exemple dans l’article suivant : http://blog.dahanne.net/2016/07/07/utiliser-le-raspberry-pi-comme-point-dacces-wifi-route-via-openvpn/
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.
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….
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/
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
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