OpenVPN Server

Omdat ik mijn eigen LAN netwerk niet aan de (boze) buitenwereld van het internet wil koppelen, heb ik ervoor gekozen om gebruik te maken van een VPN Server. Een VPN-verbinding is cruciaal als je veilig wilt internetten op openbare wifi-netwerken. Een bijkomend voordeel is dat je landrestricties van bijvoorbeeld Uitzending Gemist of Ziggo Go wilt omzeilen wanneer je in het buitenland bent.

Een Virtueel Particulier Netwerk of Virtueel Privénetwerk (EngelsVirtual Private Network, VPN) is een goedkope manier om een Local Area Network (LAN) over een bestaande verbinding, een Wide Area Network (WAN), zoals het internet, uit te bouwen met behoud van vertrouwelijkheid. (bron Wikipedia)

Voor de Raspberry Pi kan dit met de gratis OpenVPN software. In onderstaande beschrijving staan de stappen beschreven om OpenVPN op de Raspberry Pi te installeren.

Installatie van de software

De eerste stap is het installeren van de software:

sudo apt-get install openvpn

Instellen van de OpenVPN Server

Om OpenVPN als server te gebruiken moeten we onze eigen certificaten aanmaken. Ga daarvoor naar de OpenVPN-configuratiedirectory cd /etc/openvpn en voer onderstaand commando uit:

sudo make-cadir easy-rsa

Omdat we nu voor de rest van de handelingen allemaal opdrachten met sudo moeten uitvoeren, voeren we één keer onderstaande commando (sudo -s) uit, zodat we de volgende keren geen sudo meer moeten opgeven. De opdrachtregel begint nu met root in plaats van met pi.

sudo -s

Ga nu naar de directory easy-rsa met commando cd easy-rsa en open het bestand vars.

nano vars

We geven nu een aantal variabelen een waarde, zodat we bij het aanmaken van certificaten later niet telkens dezelfde waarden moeten ingeven. Wijzig de inhoud van de variabelen KEY_SIZE, KEY_COUNTRY,  KEY_PROVINCE,  KEY_CITY, KEY_ORG, KEY_EMAIL en KEY

# Increase this to 2048 if you
 # are paranoid. This will slow
 # down TLS negotiation performance
 # as well as the one-time DH parms
 # generation process.
 export KEY_SIZE=1024

# In how many days should the root CA key expire?
 export CA_EXPIRE=3650

# In how many days should certificates expire?
 export KEY_EXPIRE=3650

# These are the default values for fields
 # which will be placed in the certificate.
 # Don't leave any of these fields blank.
 export KEY_COUNTRY="NL"
 export KEY_PROVINCE="Noord-Brabant"
 export KEY_CITY="xxxxxxxx"
 export KEY_ORG="xxxxxxxx"
 export KEY_EMAIL="xxxxxxxx"
 export KEY_OU="xxxxxxxx"

Voor het land vul je een tweeletterige landcode in (NL), voor de andere waarden is de inhoud vrij in te vullen. Verander KEY_SIZE in 1024, want de standaardwaarde 2048 is te zwaar voor de Pi. Sla op en sluit af met Ctrl+O en Ctrl+X.

Aanmaken van Server Certificaten

Normaal brengt een certificate authority (CA) certificaten uit waarmee het eigenaarschap van een publieke sleutel bewezen wordt, maar we kunnen dat evengoed zelf doen. We maken daarom een CA-certificaat aan. Met source ./vars laden we de variabelen in die we hierboven aangepast hebben, met ./clean-all verwijderen we alle sleutels die al aanwezig zijn en met ./build-ca maken we uiteindelijk het CA-certificaat aan.

source ./vars
./clean-all
./build-ca

   Druk bij elke vraag op Enter om de standaardwaarde te aanvaarden, ook bij de Common Name en Name.

Daarna maken we een certificaat en sleutel aan voor onze OpenVPN-server. Dat doen we met onderstaand commando:

./build-key-server raspberrypi

waarbij raspberrypi de naam van onze VPN server is. Aanvaard weer de standaardwaardes, zeker voor Common Name, die gelijk moet zijn aan de naam van de server die je aan build-key-server doorgegeven hebt.

De vraag voor een challenge password antwoord je met Enter, waardoor het leeg blijft en ook de optionele bedrijfsnaam laat je leeg. Op de vraag “Sign the certificate?” antwoord je bevestigend met y, evenals op de vraag “1 out of 1 certificate requests certified, commit?” die je ook bevestigend met y beantwoord.

Aanmaken van Cliënt Certificaten

Nadat we de serverkant in orde hebben, moeten we voor elke cliënt een certificaat en sleutel aanmaken met de opdracht  ./build-key client1, waarbij client1 de naam van de client is. Bijvoorbeeld:

./build-key harm

Accepteer weer dezelfde standaardwaarden en kies zeker bij Common Name de voorgestelde waarde, namelijk de naam van de cliënt, zoals bijvoorbeeld harm. Voor de rest antwoord je hetzelfde als bij de server. Herhaal dit voor alle apparaten waarmee je met het VPN wilt verbinden en zorg dat je voor elke cliënt een unieke naam gebruikt.

Als laatste voeren we eenmalig onderstaande opdracht uit (deze opdracht gaat lang duren!):

./build-dh

Configureren van de OpenVPN Server

Kopieer nu de sleutels naar /etc/openvpn met onderstaand commando:

cp keys/ca.crt keys/raspberrypi.crt keys/raspberrypi.key keys/dh1024.pem /etc/openvpn

Kopieer de voorbeeldconfiguratie:

zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Open het bestand om het te wijzingen:

nano /etc/openvpn/server.conf

Zoek naar de regels die achtereenvolgens beginnen met ca, cert, key en dh. Geef daarachter de juiste naam van de bestanden, zoals ca ca.crtcert raspberrypi.crtkey raspberrypi.key en dh dh1024.pem.

# SSL/TLS root certificate (ca), certificate
# (cert), and private key (key). Each client
# and the server must have their own cert and
# key file. The server and all clients will
# use the same ca file.
#
# See the "easy-rsa" directory for a series
# of scripts for generating RSA certificates
# and private keys. Remember to use
# a unique Common Name for the server
# and each of the client certificates.
#
# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca ca.crt
cert raspberrypi.crt
key raspberrypi.key # This file should be kept secret

Zoek vervolgens in het configuratiebestand naar de regel ;push “redirect-gateway def1 bypass-dhcp” en verwijder de puntkomma (;) vooraan de regel zodat deze actief wordt. Daardoor wordt je VPN-server de default gateway van de aangesloten clients, zodat ze via de VPN-verbinding kunnen surfen.

Verwijder ook de ; vooraan de regel ;push “dhcp-option DNS 208.67.222.222” en de bijna identieke regel erna. Die twee regels zorgen dat de clients de DNS-servers van OpenDNS gebruiken.

Sla tot slot het bestand op met Ctrl+O en sluit het af met Ctrl+X.

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
push "redirect-gateway def1 bypass-dhcp"

# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses. CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Port forwarding

De Raspberry Pi is pas vanaf buiten je thuisnetwerk bereikbaar als je poort 1194 op je internetmodem/router laat doorsturen (forwarden) naar je Raspberry Pi. Daarvoor moet je op de beheerpagina van je internetmodem/router naar de functionaliteit voor port forwarding gaan.

Geef de regel een naam (bijvoorbeeld ‘vpn’), geef als poort 1194 op (of wat je in de OpenVPN-serverconfiguratie gekozen hebt), als protocol UDP en als lokaal IP-adres het interne IP-adres van je Pi. Op mijn Ziggo modem ziet er dit als volgt uit:

 

 

 

 

 

 

 

 

 

Starten OpenVPN Server

Om nu OpenVPN Server te starten, moeten we naar het juiste configuratiebestand verwijzen. Voer daarom onderstaand commando uit en wijzig het bestand

nano /etc/default/openvpn

voeg AUTOSTART=”server” toe.

# This is the configuration file for /etc/init.d/openvpn
#
# Start only these VPNs automatically via init script.
# Allowed values are "all", "none" or space separated list of
# names of the VPNs. If empty, "all" is assumed.
# The VPN name refers to the VPN configutation file name.
# i.e. "home" would be /etc/openvpn/home.conf
#
# If you're running systemd, changing this variable will
# require running "systemctl daemon-reload" followed by
# a restart of the openvpn service (if you removed entries
# you may have to stop those manually)
#
#AUTOSTART="all"
#AUTOSTART="none"
#AUTOSTART="home office"
AUTOSTART="server"

Sla op en sluit af met Ctrl+O en Ctrl+X. Laat de OpenVPN Server daarna automatisch starten bij het booten van de Raspberry Pi met

update-rc.d openvpn enable

Herstart je Pi met commando:

reboot

Bestanden naar cliënt

Eén manier om bestanden van je Raspberry Pi (zoals certificaat- en configuratiebestanden van OpenVPN) met je computer te delen is door de Pi uit te schakelen, het SD-kaartje in de kaartlezer van de computer te steken en de benodigde bestanden te kopiëren. Daarvoor moet je wel Ext2Fsd op Windows installeren om het Linux-bestandssysteem in te kunnen lezen. Je moet er ook telkens je Raspberry Pi voor uitschakelen!

Een andere manier om bestanden van je Pi naar je computer te verplaatsen is met Samba. Je installeert dat programma op de Pi, zie hiervoor de pagina Samba op deze website. In het configuratiebestand van Samba definieer je welke map je op het netwerk deelt. Kopieer de bestanden die je wilt delen naar die map en open die in de verkenner van je Windows-pc.

VPN Verbinding gebruiken

Nadat de benodigde bestanden naar je cliënt gekopieerd zijn:

ca – ca.crt
cert – client1.crt
key – client1.key

kan je je eigen favoriete VPN cliënt (bijv. OpenVPN cliënt) verder configureren om verbinding te maken met de VPN server.

Extra informatie m.b.t. Mobiele Cliënts

Als je met je VPN-server wilt verbinden op Android- of iOS-apparaten, dan moet je nog enkele stappen uitvoeren. Die lees je hier onder de titel “Debian Server with Android / iOS devices” vanaf de tekst “Create client profile file…”. De opdrachten daar plaatsen de CA, het clientcertificaat en de clientsleutel in het configuratiebestand van de client zelf, zodat de app OpenVPN Connect ze kan openen.

Hulp

OpenVPN heeft heel wat meer mogelijkheden dan we hier getoond hebben. Op deze webpagina vind je enkele tips. Maar ook de website van OpenVPN zelf staat boordevol met informatie. Klik links op Documentation om de uitgebreide documentatie te bekijken. Ook de voorbeeldconfiguratiebestanden staan overigens vol met informatie die uitlegt waarvoor alle opgenomen regels dienen. En als er iets misloopt, kijk dan eens naar foutmeldingen in de uitvoer van grep ovpn /var/log/syslog.


Gebruikte resources:
https://computertotaal.nl/artikelen/internet-thuis/raspberry-pi-als-vpn-router-en-server-63600/?article-page=1
https://computertotaal.nl/artikelen/internet-thuis/veilig-surfen-via-een-eigen-vpn-server-63413/?article-page=1

 

Like
2