Voordelig een VPN-server op de Raspberry Pi installeren

De beveiliging van een openbare internetverbinding laat vaak te wensen over. Als je je ook onderweg veilig op het internet wilt bewegen, kun je dit goed regelen met een eigen VPN (Virtual Private Network of Virtueel Particulier Netwerk). Wie besluit een eigen VPN-server te gaan opzetten, heeft bovendien toegang tot het lokale thuisnetwerk via elke internetverbinding.

Om een eigen VPN-server te installeren, heb je een computer nodig die goed als server functioneert. De Raspberry Pi is hiervoor een voordelige optie. Een VPN-server op de Raspberry Pi is te realiseren door middel van de VPN-server-software OpenVPN, die als gratis download beschikbaar is.

Een VPN-server instellen doe je in een lokaal netwerk (LAN), zodat je hier ook van buitenaf toegang toe kunt hebben. Dit is een virtueel communicatienetwerk, waarbij de aanvragen en antwoorden tussen de VPN-server en de VPN-clients (apparaten gekoppeld aan de server) in de regel via internet worden getransporteerd.

Met een zelf ingerichte VPN is het dus mogelijk om via welke internetverbinding dan ook toegang te hebben tot het eigen lokale netwerk. Daardoor heb je de beschikking over data die zich op het LAN bevinden, kun je op afstand toegang krijgen tot specifieke apparaten (bijvoorbeeld een printer of faxmachine) en kun je de internetverbinding van je lokale netwerk gebruiken. Dankzij een versleutelde verbinding met je VPN-server kun je je veiliger bewegen door het internet dan wanneer je gebruikmaakt van risicovolle, open internetverbindingen (zoals openbaar WiFi).

Om een dergelijk beveiligde verbinding met een VPN-server mogelijk te maken, dien je echter in je lokale netwerk een VPN-server te installeren op een computer die constant verbonden blijft met het internet. De computer fungeert dan als host voor het virtuele privénetwerk. Via client-software verbind je je apparaten (zoals een laptop, smartphone of tablet) met de server. Als je dan met een client via een internetverbinding, die zich buiten je persoonlijke LAN bevindt, je VPN-server op gaat, dan gebeurt dit via een versleutelde verbinding (de zogenaamde VPN-tunnel).

Deze VPN-tunnel begint bij je client, eindigt bij je VPN-server en strekt zich uit over de volledige internetverbinding. Deze tunnel is veel veiliger dan de gemiddelde openbare internetverbinding. Het is daarom moeilijk voor hackers om de tunnel binnen te dringen en het dataverkeer te onderscheppen. Via een persoonlijke VPN-verbinding kun je daarom ook in een openbaar WiFi-netwerk veilig met gevoelige data werken (zoals internetbankieren).


VPN-server opzetten met de Raspberry Pi en OpenVPN: de voordelen

De geringe kosten voor deze minicomputer maken de Raspberry Pi als VPN-server zo aantrekkelijk. De inkoopprijs van de kleine computer en de nodige toebehoren is in vergelijking met de concurrenten erg laag. Bovendien is ook het stroomverbruik voor de langdurige besturing van een server op de computer relatief laag. In het algemeen biedt hij een goede prijs-kwaliteitverhouding (ook vergeleken met de verschillende Raspberry Pi-alternatieven die ondertussen zijn verschenen).

OpenVPN is om meerdere redenen zeer geschikt voor jouw VPN: het gaat hier om kosteloze, wijdverspreide VPN-server-software, die ondersteuning biedt voor een groot aantal besturingssystemen (Windows, OS X, Android, iOS, Linux en meer). Daarbij overtuigt het programma met een relatief eenvoudige inrichting en een hoge stabiliteit.


Wat heb je nodig om een VPN-server te installeren op de Raspberry Pi?

Voor onderstaande tutorial heb je het volgende nodig:

  • Raspberry Pi (aanbevolen: model 2 of hoger)
  • Micro-SD-geheugenkaart met het besturingssysteem Raspbian Jesse erop geïnstalleerd
  • Continu beschikbare internetverbinding (het beste via een netwerkkabel) en stroomvoorziening (micro-USB-kabel) voor de Raspberry Pi

Daarnaast moet je besluiten of je de VPN-server direct op de Raspberry Pi wilt installeren (met gekoppelde monitor en aangesloten muis en toetsenbord) of via een SSH-client. Extern onderhoud van de server via SSH is in de meeste gevallen aan te bevelen, omdat je hiermee het gemakkelijkst vanaf een andere computer toegang tot de latere VPN-server op de Raspberry Pi kunt verkrijgen.

Hiervoor vind je veel verschillende software zoals PuTTY, WinSCP of OpenSSH (voor Unix-besturingssystemen), waarmee je de Raspberry Pi kunt besturen en bedienen. Je verbindt de SSH-software met de Raspberry Pi door het IPv4-adres in de client (de computer waarmee je toegang tot de Raspberry Pi wilt hebben) op te geven en beide apparaten aan elkaar te koppelen. Het IP-adres van je Raspberry Pi kun je bijvoorbeeld via het routermenu laten weergeven in je browser. Dat lukt in de regel door het adres “192.168.0.1“ (bijv. bij Fritz!Box-eigenaar “fritz.box“) in je browser op te roepen.


IP-adressen aanpassen

Voor het gebruik van een SSH-client is het aan te raden om de Raspberry Pi een statisch privé-IP-adres in het lokale netwerk toe te kennen. Anders moet je elke dag dat je via SSH toegang tot de minicomputer wilt maken, opnieuw het actuele dynamische IP-adres achterhalen en de client hiermee verbinden. Nog belangrijker voor het gebruik van OpenVPN is de koppeling tussen een stabiel privé-IP-adres en de Raspberry Pi. De VPN-server moet in het lokale netwerk permanent onder hetzelfde adres bereikbaar zijn, zodat je er continu toegang toe hebt. Daarnaast dien je de VPN-server ook permanent onder hetzelfde adres op het internet bereikbaar te houden. Doorgaans beschikt een internetverbinding echter alleen over een dynamisch, openbaar IP-adres dat uiterlijk na 24 uur wisselt en zo dus de continue bereikbaarheid van de server onder eenzelfde IP-adres onmogelijk maakt. Wanneer je internetverbinding niet over een statisch, openbaar IP-adres beschikt, kun je dit oplossen door dynamisch DNS (DDNS) te gebruiken.

In een ander artikel kun je nalezen hoe je de Raspberry Pi een statisch IP-adres toekent en welke mogelijkheden er zijn voor de inrichting van DDNS. Als je je Raspberry Pi permanent als server online beschikbaar wilt houden, is het belangrijk om je regelmatig met updates en de beveiliging bezig te houden.


Met OpenVPN een eigen VPN-server op de Raspberry Pi installeren

Nu kan de installatie van OpenVPN beginnen. Om dit te doen open je de terminal (command-line-interface) van je Raspberry Pi.


raspberry pi vpn server

Voorbereiding van de Raspberry Pi

Voordat je verdergaat met de installatie van de OpenVPN is het aan te raden om de bestaande pakketten op de Raspberry Pi te controleren en te installeren. Dit doe je door de volgende commando’s in te voeren op de terminal:

sudo apt-get update
sudo apt-get upgrade

Als je het standaardwachtwoord van de Raspberry Pi (gebruikersnaam: “Pi”, wachtwoord: “Raspberry”) nog niet hebt veranderd, dan moet je dat nu alsnog te doen; anders kan iedereen toegang verkrijgen tot het systeem, zowel lokaal als over het netwerk via SSH. Met onderstaand commando roep je het configuratiebestand van de minicomputer op, waarin je een veilig wachtwoord kunt aanmaken.

sudo raspi-config


raspberry pi vpn server: easy-rsa

OpenVPN installeren en easy-rsa-bestand aanmaken

Vervolgens installeer je met het volgende commando de OpenVPN-software evenals OpenSSL, die de versleuteling van de internetverbinding verzorgt:

sudo apt-get install openvpn openssl

Na de installatie van OpenVPN kopieer je het kant-en-klare script “easy-rsa” in het configuratiebestand van OpenVPN. Hiervoor maak je verschillende certificaten en sleutels aan. Het volgende commando werkt alleen onder Raspbian Jessie (bij de voorloper Wheezy zijn de scripts te vinden onder “/usr/share/doc/openvpn/examples/easy-rsa/2.0”).

sudo cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa

Open dan in de terminal het bestand “/etc/openvpn/easy-rsa/vars” door het volgende commando in te voeren:

sudo nano /etc/openvpn/easy-rsa/vars

Nu dien je dit bestand aan te passen. Je verandert de instellingen door de volledige regel „export EASY_RSA="`pwd`"” te vervangen door het volgende:

export EASY_RSA="/etc/openvpn/easy-rsa"

De sleutellengte kan ook in het bestand worden aangepast, waardoor je de mate van beveiliging van de versleuteling vastlegt. Een Raspberry Pi 3 beschikt over genoeg rekenkracht om zonder problemen een sleutellengte van 2048 bits aan te kunnen. Bij model 2 leidt een dergelijke versleuteling echter al tot merkbare prestatievermindering. Afhankelijk of je snelheid of veiligheid belangrijker vindt, kun je in dit geval met oog op de prestatie ook een versleuteling van 1024 bits toepassen. Een 4096-bits versleuteling is daarentegen slechts in enkele gevallen zinvol. Je kunt de sleutellengte veranderen door het aantal bits in het deel “export KEY_SIZE=2048” aan te passen.

Nu ga je terug in het configuratiebestand “easy-rsa”, geef je jezelf root-rechten en integreer je de eerder gemaakte instellingen in de omgevingsvariabelen, door het script “vars” met het commando “source” uit te voeren. Dan maak je het resulterende configuratiebestand toegankelijk via een symbolische link onder de naam “openssl.cnf”.

cd /etc/openvpn/easy-rsa
sudo su
source vars
ln -s openssl-1.0.0.cnf openssl.cnf


raspberry pi vpn server: OpenVPN

Certificaten en sleutels voor OpenVPN instellen

De volgende stap is het terugzetten van de sleutel en instellen van de eerste sleutelbestanden voor OpenVPN.

./clean-all
./build-ca OpenVPN

Dan wordt je gevraagd om de eerste twee letters van de “Country Name” van je land in te voeren (NL voor Nederland, BE voor België, etc.). De daaropvolgende vragen zijn niet relevant en kun je eenvoudigweg met de Enter-toets bevestigen.

Daarna genereer je de sleutelbestanden voor de server:

./build-key-server server

Voer nog één keer de tweeletterige landencode in en laat de daaropvolgende velden leeg. Dan bevestig je het verzoek of het certificaat gegenereerd moet worden tweemaal met een “Y”.

Daarna houd je je bezig met het installeren van één of meerdere VPN-clients. Per apparaat waarmee je toegang tot de VPN-server wilt opzetten, stel je één certificaat en één sleutel in. Het proces is vergelijkbaar met dat van het genereren van een certificaat en sleutel op de server (landencode invoeren en tweemaal bevestigen). Je kunt de toestellen een specifieke naam toekennen (in onderstaand commando wordt een client voor een “laptop”, “smartphone” en een “tablet” aangemaakt).

./build-key laptop
./build-key smartphone
./build-key tablet

Als je de clients van een wachtwoord wilt voorzien dan gebruik je in plaats van de bovenstaande commando’s de volgende regels:

./build-key-pass laptop
./build-key-pass smartphone
./build-key-pass tablet

Het aanmaken van het certificaat en de sleutel sluit je af met het commando voor het Diffie-Hellman-sleuteluitwisselingsprotocol:

./build-dh

Dit kan onder bepaalde omstandigheden wat meer tijd kosten. Zodra het proces is voltooid, log je je als rootgebruiker uit:

exit


raspberry pi vpn server: Configuratiebestand

Configuratiebestand genereren voor de OpenVPN-server

Roep het OpenVPN-configuratiebestand op:

sudo nano /etc/openvpn/openvpn.conf

Het lege bestand vul je nu met verschillende commando’s, die we hieronder uitleggen. Eerst activeer je met “dev tun” de routing door een IP-tunnel en selecteer je met “proto udp” UDP als transportprotocol (als je TCP wilt gebruiken, kies dan “proto tcp”). In de daaropvolgende regel leg je vast dat de OpenVPN-server op poort 1194 bereikbaar is, die kun je echter ook wijzigen.

dev tun
proto udp
port 1194

Dan stel je een SSL/TLS-rootcertificaat (ca), een digitaal certificaat (cert) en een digitale sleutel (key) in via de map “easy-rsa”. Daarnaast dien je erop te letten dat je de juiste versleuteling in bits invoert (1024, 2048, etc.).

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

Nu leg je vast dat de Raspberry Pi als VPN-server wordt gebruikt. Hiervoor noem je het IP-adres en het netwerkmasker die aan het VPN toegekend moeten worden.

server 10.8.0.0 255.255.255.0

Met het commando “redirect-gateway def1 bypass-dhcp” leid je nu het complete IP-verkeer door de IP-tunnel. Als je hoge veiligheidseisen hebt, kun je met deze instelling experimenteren. Als dit echter problemen veroorzaakt of het surfen traag wordt, dan is het toch raadzaam om deze configuratie weer uit te schakelen. De andere, hieronder vermelde instructies dien je echter alsnog te volgen: deze zorgen er namelijk voor dat je de openbare DNS-server verandert, naar die waarmee je VPN-server zal werken. In onderstaand commando wordt met “217.237.150.188“ een server van een Duitse hostingprovider genoemd en met “8.8.8.8“ eentje van Google. Je kunt deze echter verwisselen voor alternatieven naar eigen wens door de IPv4-adressen in te voeren van andere DNS-servers. Via “log-append /var/log/openvpn“ stel je dan nog in dat de loginformatie in het bestand “/var/log/openvpn” wordt geschreven.

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 217.237.150.188"
push "dhcp-option DNS 8.8.8.8"
log-append /var/log/openvpn

Door middel van “persist-key” zorg je ervoor dat de sleutelbestanden niet opnieuw worden gelezen en met “persist-tun” voorkom je dat de TUN- en TAP-netwerkdrivers opnieuw worden opgestart. De rechten van de OpenVPN-daemon worden na het starten van een programma verlaagd via “user nobody” en “group nogroup”. Met “status /var/log/openvpn-status.log“ maak je een statusbestand aan, waarin je de huidige verbinding kunt zien. Verder is het aan te raden de uitvoerigheid van de loginformatie door middel van het commando “verb” op te lossen. Als je daarbij “0” kiest, krijg je naast foutmeldingen geen resultaten. Een waarde van 1 t/m 4 is geschikt voor het normale gebruik en de hogere waarden zijn eerder bedoeld voor het oplossen van problemen. Tot slot bepaal je nog met het commando “client-to-client” dat VPN-clients niet alleen de server, maar ook andere VPN-clients detecteren en met “comp-lzo” de LZO-compressie activeren (deze moet je dan ook vrijgeven in de configuratiebestanden van de clients).

persist-key
persist-tun
user nobody
group nogroup
status /var/log/openvpn-status.log
verb 3
client-to-client
comp-lzo

Met “CTRL + O” bewaar je de wijzigingen en met “CTRL + X” sluit je de editor.


raspberry pi vpn server: Script om internetverbinding

Script om internetverbinding met een client te realiseren

Om via jouw VPN-tunnel toegang te verkrijgen tot de internetverbinding van je lokale netwerk moet je een forwarding instellen. Om dit te doen, creëer je eerst het bestand “/etc/init.d/rpivpn”:

Sudo nano /etc/init.d/rpivpn

Om de volgende antwoorden naar het bestand te kopiëren, maak je de header voor een Linux init-script:

#! /bin/sh
### BEGIN INIT INFO
# Provides:           rpivpn
# Required-Start:     $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:       2 3 4 5
# Default-Stop:       0 1 6
# Short-Description: VPN initialization script
### END INIT INFO

Vervolgens activeer je “ip_forward” door een “1” in dit bestand te schrijven:

echo 'echo "1" > /proc/sys/net/ipv4/ip_forward' | sudo –s

Dan maak je via het pakketfilter “iptables” een forwarding aan voor VPN-pakketten.

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

Nu zijn er alleen nog commando’s nodig die je VPN-clients toegang geven tot het LAN en tot het internet. Deze stel je met de volgende regels in:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Sla het bestand opnieuw op met “CTRL + O” en sluit hem met “CTRL + X”.

Om te zorgen dat de forwarding werkt, moet je het script nog de juiste rechten toekennen en als init-script installeren.

sudo chmod +x /etc/init.d/rpivpn
sudo update-rc.d rpivpn defaults

Nu voer je het script uit en start daarna de OpenVPN-server opnieuw op.

sudo /etc/init.d/rpivpn
sudo /etc/init.d/openvpn restart


raspberry pi vpn server: Installatie

Installatie van de clients afsluiten

In de laatste stap bundel je de certificaten en sleutels van elke client in een eigen pakket. Hiervoor ken je weer root-rechten toe, open je de map “/etc/openvpn/keys/” en maak je het clientconfiguratiebestand aan. Gebruik de volgende commando’s om het bestand van de “laptop”-client op te roepen. De installatie werkt voor elke client hetzelfde; je hoeft alleen de naam van het apparaat te wijzigen.

sudo su
cd /etc/openvpn/easy-rsa/keys
nano laptop.ovpn

In het “.ovpn”-bestand van de client voer je het volgende in:

dev tun
client
proto udp
remote x.x.x.x 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert laptop.crt
key laptop.key
comp-lzo
verb 3

De bovenstaande bestandsinhoud dien je nog wel aan te vullen. In de vierde regel vervang je “x.x.x.x” met het IP-adres van je DDNS-provider (mocht je een statisch openbaar IP-adres gebruiken, kun je deze hier natuurlijk gewoon invoeren) gevolgd door de poort waarop de VPN-server bereikbaar moet zijn. In de twee-na-laatste en drie-na-laatste regels voer je de naam van je client in (hier: “laptop”). Nadat je de wijzigingen hebt aangebracht, sla je deze met “CTRL + O” op en sluit je de editor met “CTRL + X”.

Tot slot voeg je het configuratiebestand met de certificaten en sleutels in een zip-bestand bij elkaar. Als je nog geen zip-bestand op de Raspberry Pi hebt geïnstalleerd, kun je dit bijvoorbeeld met het volgende commando doen:

apt-get install zip

Gebruik dit commando voor het aanmaken van het zip-bestand en let daarbij weer op dat je overal de juiste clientnaam gebruikt.

zip /home/pi/raspberry_laptop.zip ca.crt laptop.crt laptop.key laptop.ovpn

Nu dien je nog de rechten voor de bestanden aan te passen en daarna de installatie te beëindigen met “exit”.

chown pi:pi /home/pi/raspberry_laptop.zip
exit

Het zip-bestand is nu klaar en kan van de Raspberry Pi naar de client worden overgezet (bijvoorbeeld door middel van een SCP- of SFTP-programma). Vervolgens installeer je de client op het apparaat. Nu kun je met het apparaat via welke internetverbinding dan ook toegang verkrijgen tot het lokale netwerk dat met de client is verbonden en zo gebruikmaken van deze beveiligde toegang tot internet.


Een eigen VPN-server installeren op de Raspberry Pi: de moeite waard

Je eigen VPN is minder duur dan veel mensen denken: dankzij het lage energieverbruik van de Raspberry Pi heb je geen hoge vaste lasten. En ook de uitgaven voor de afzonderlijke componenten van de server (Raspberry Pi, micro-SD-kaart, etc.) zijn te overzien.

Bovendien biedt een VPN-server op Raspberry Pi veel mogelijkheden. Met je zelfgehoste VPN-server op de Raspberry Pi kun je vanaf elke internetverbinding toegang krijgen tot je lokale computernetwerk. De VPN-verbinding is versleuteld en maakt het mogelijk dat je je op zowel een open en/of niet betrouwbare WiFi-netwerk, als via de data van je mobiel veel veiliger op het internet kunt bewegen. Veel meer bescherming kan een mobiele internetverbinding nauwelijks bieden.