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