Terwijl je op pad bent, is toegang tot je thuisnetwerk handig. Dan kun je bijvoorbeeld bij je documenten of foto-archief. Met VPN krijg je dat veilig voor elkaar, maar het is nog niet zo eenvoudig om dat helemaal zelf op te tuigen. Daarom bekijken we in dit artikel PiVPN. Hiermee transformeer je een Raspberry Pi snel en eenvoudig in een heuse VPN-server.
Serge Gielkens
Het principe van VPN is eigenlijk niet zo moeilijk. Eerst zet je een versleutelde verbinding op tussen je laptop en de router van je netwerk. Vervolgens zorg je dat alle dataverkeer automatisch via die beveiligde verbinding loopt. Zo maak je als het ware een privé-tunnel door internetland om je laptop met je netwerk te verbinden.
Toch blijft het zelf inrichten van VPN behoorlijk complex. Zo moet je de beveiliging goed opzetten, netwerkverkeer regelen en de firewall configureren. Gelukkig hoef je je niet te vermoeien met dergelijke details dankzij PiVPN. Die neemt je via een menugestuurde configuratie aan het handje om van je Raspberry Pi een VPN-server te maken.
Tot voor kort was OpenVPN zo ongeveer de standaard. Tegenwoordig maakt WireGuard als alternatief steeds meer opmars. Die laatste is makkelijker te configureren en presteert in het algemeen beter. WireGuard maakt sinds kort zelfs deel uit van de standaard Linux kernel. PiVPN ondersteunt beide. In dit artikel gebruiken we WireGuard, omdat die veel minder vraagt van de beperkte rekencapaciteit van de Raspberry Pi dan OpenVPN.
Maak de Pi gereed
Installeer allereerst het besturingssysteem op de Raspberry Pi. Voorheen heette dat Raspbian, maar inmiddels is dat omgedoopt tot Raspberry Pi OS. Download hiervan de Lite versie. De desktopvariant heb je namelijk niet nodig, omdat je bij PiVPN op de commandoregel werkt.
Zet het image op het microSD-kaartje met een tool als Etcher. Navigeer in de file browser naar de boot partitie van het kaartje en plaats daar een leeg bestandje met de naam ssh. Standaard draait er geen SSH-server op Raspberry Pi OS. Door dat lege bestandje is SSH wel direct vanaf de eerste start beschikbaar.
Unmount de partitie en steek het kaartje in de Raspberry Pi. Verbind het bordje met een ethernetkabel met je router. Omwille van stabiliteit, snelheid en veiligheid voor je VPN-sessies is dat aan te bevelen. Start de Raspberry Pi op en log in als gebruiker pi met het wachtwoord raspberry:
ssh pi@raspberrypi.local
Straks geef je via een VPN-poort toegang tot de Raspberry Pi vanaf internet. Verander dus meteen het wachtwoord in een ijzersterke variant middels het commando passwd. De Raspberry Pi hanteert als tijdzone Europe/London, waardoor je een uur achterloopt. Start de menugestuurde configuratie op met sudo raspi-config. Ga naar Localisation Options -> Change Timezone en verander London in Amsterdam.
Breng tevens de software up-to-date:
sudo apt-get update sudo apt-get dist-upgrade
En voer een herstart uit om de nieuwe kernel te activeren:
sudo reboot
Hiermee heb je dan meteen de benodigde WireGuard ondersteuning.
Ga verder met PiVPN
De installatie van PiVPN verloopt via een installatiescript:
curl -L https://install.pivpn.io | bash
Het commando curl klopt aan bij de webserver install.pivpn.io. Die stuurt als antwoord de URL van het script terug. Door de optie -L toont curl niet dit antwoord als uitvoer, maar gebruikt de URL om het script te downloaden. De bash shell voert het vervolgens uit.
Als eerste stap vraagt het installatiescript om een statisch IP-adres te zetten (zie de afbeelding hieronder). Nu heeft de Raspberry Pi door DHCP immers een dynamisch adres. Bij een reboot bestaat daardoor de kans dat je een ander IP-adres krijgt. Even verderop sturen we het verkeer vanaf de router door naar de Raspberry Pi. Om te garanderen dat die pakketten daadwerkelijk arriveren, is een vast IP-adres nodig.
Je regelt dit ofwel op je router ofwel met PiVPN. In het eerste geval geef je bij de routerinstellingen het statische IP-adres op dat deze Raspberry Pi moet krijgen. Raadpleeg daarvoor de handleiding. Kies in dit scherm dan Yes. In het tweede geval selecteer je No. Dat doen wij, waarop het script een bevestiging vraagt om het huidige dynamische adres statisch te maken.
Zo dadelijk genereer je met PiVPN configuratiebestanden voor VPN-clients, zoals je mobiel en laptop. PiVPN zet die klaar in de home directory van een gebruiker. Op de Raspberry Pi is dat het user ID pi. Die selecteer je in de volgende stap Local Users. In dit venster is de term ovpn configurations verwarrend. WireGuard is later toegevoegd en blijkbaar is hier ovpn (van OpenVPN) nog blijven hangen.
Vervolgens kies je het type VPN. WireGuard staat al aangevinkt en dat houden we zo. Hierna genereert PiVPN de kernelmodule voor WireGuard. De standaard poort 51820 voor WireGuard accepteren we eveneens.
Kies nu uit een lijst de DNS-server voor de VPN-clients. Standaard is Quad9 geselecteerd, een publieke DNS-dienst. Heb je voor je netwerk een eigen DNS-server draaien, dan geef je die op bij Custom helemaal onderaan. Die optie gebruik je eveneens als je liever de DNS-servers van je internetprovider gebruikt in plaats van een publieke dienst. Vul in dat geval het LAN IP-adres van je router in.
Toegang tot de Raspberry Pi krijgt de VPN-client via je router. Dat heet het endpoint. Daarvoor heeft de client diens IP-adres nodig. Let wel, het gaat om het publieke adres, dat wil zeggen het adres waarmee je router verbinding heeft met internet. PiVPN detecteert deze al automatisch voor je.
Ook dit moet een vast IP-adres zijn, zodat de client altijd bij je router uitkomt. Hoewel internetproviders in het algemeen dynamische IP-adressen uitdelen, krijg je in de praktijk meestal toch altijd hetzelfde adres na een reboot van je router. Zo niet, regel dan Dynamic DNS (DDNS) bij bijvoorbeeld Duck DNS of No-IP. Op veel routers zijn daarvoor al instellingen aanwezig. Via een DDNS dienst krijg je een domeinnaam die altijd naar het actuele IP-adres van je router wijst. Vul die naam dan in bij DNS Entry.
Als laatste genereert het script de cryptografische sleutels en raadt het automatische updates aan. Omdat je een poort naar internet openzet, zijn security updates immers cruciaal. Herstart wel af en toe zelf de Raspberry Pi om alle updates te activeren, met name die van de kernel.
Router instellen
Een VPN-client maakt verbinding met het publieke IP-adres van je router. Dat dataverkeer moet vervolgens doorgesluisd worden naar je Raspberry Pi. Dat heet port forwarding of port mapping. De instellingen daarvoor vind je op je router (onderstaande afbeelding). Lees in de handleiding waar je dat regelt voor jouw router. Vaak vind je de gezochte instellingen onder NAT-configuratie. Zorg dat je in het betreffende menu dataverkeer op UDP-poort 51820 verder leidt naar dezelfde poort op het IP-adres van je Raspberry Pi.
Profiel maken
Een VPN-client heeft een profiel nodig om te kunnen communiceren met je Raspberry Pi. Dat bevat gegevens zoals de IP-adressen van je router en DNS-server. Maak de eerste voor je mobiel. Tik daartoe op de commandoregel het volgende in:
pivpn add
Geef een naam voor je profiel, bijvoorbeeld mijn_mobiel. PiVPN maakt nu een bestandje aan met alle benodigde informatie. Om dit profiel op eenvoudige wijze aan je mobiel bekend te maken gebruikt WireGuard QR-codes. Tik het volgende in:
pivpn qrcode
Bij de vraag om welke client het gaat, geef je mijn_mobiel op. Vervolgens verschijnt als een soort ASCII art je QR-code. Bij sommige fonts, zoals die van Ubuntu, ziet deze vreemd uit. Corrigeer dat in je instellingen van je terminal, anders gaat de scan zo dadelijk mis. Een geschikt lettertype is onder andere Courier.
Mobiel contact
WireGuard heeft apps voor zowel de iPhone als mobieltjes met Android. Voor die laatste beschrijven we hier hoe je een VPN-verbinding maakt met je thuisnetwerk.
Installeer als eerste de WireGuard app vanuit Google Play Store. Open de app en tik rechtsonder op de blauwe knop met het plusteken. Kies dan optie 2 SCAN FROM QR CODE. Scan met je mobiel de zojuist gegeneerde QR-code en geef een naam aan je tunnel. Wij geven mijn_tunnel op en tikken tot slot op CREATE TUNNEL.
Controleer dat wifi op je mobiel uitstaat en schuif nu het knopje bij mijn_tunnel naar rechts. Er lijkt niets te gebeuren, maar je hebt nu direct verbinding via het mobiele netwerk met je Raspberry Pi! Verifieer dat door op de Raspberry Pi een lijst met verbonden clients op te halen:
pivpn clients
In de uitvoer zie je mijn_mobiel staan. Ping hem maar eens vanuit de Raspberry Pi. Zijn adres staat onder Virtual IP. Heb je thuis een eigen webserver draaien, navigeer daar dan heen met je mobiele browser om je VPN-tunnel te testen.
En met je laptop
Vrijwel alle distributies gebruiken tegenwoordig NetworkManager voor de netwerkconfiguratie. Die ondersteunt zowel OpenVPN als WireGuard. Hier beschrijven we hoe je VPN met WireGuard opzet.
Maak op de Raspberry Pi een tweede profiel aan voor je laptop met als naam mijn_laptop. Een QR-code scannen gaat nu niet, maar het profiel staat klaar in de directory /home/pi/configs. Tik op je laptop het volgende in om dat op te halen:
scp pi@raspberrypi.local:configs/mijn_laptop.conf .
En importeer het als volgt in NetworkManager:
nmcli connection import type wireguard file /pad/naar/mijn_laptop.conf
De VPN-connectie is direct actief. Op je desktop in de netwerk widget zie je mijn_laptop daarom bij de actieve verbindingen staan. Om dit automatische gedrag aan te passen tik je het volgende in:
nmcli connection modify mijn_laptop connection.autoconnect no
Ga nu naar je buren en verbind je laptop via hun router door de VPN-tunnel met je Raspberry Pi thuis.
Tot slot
Om van je Raspberry Pi een eigen VPN-server te maken is PiVPN een aanrader. Het opzetten van de server verloopt vlekkeloos. Voor clients genereert het profielen die je of simpelweg scant of importeert in NetworkManager. Zo kun je direct veilig via VPN aan de slag op je thuisnetwerk.