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