VPN op een eigen Linux-server
Als je niet afhankelijk wilt zijn van een externe aanbieder, kun je ook zelf een VPN-server installeren. Dat is met een Linux-VPS makkelijk te doen.
Naast de VPN-diensten van commerciële aanbieders en de mogelijkheden om met je thuisfront VPN-contact op te nemen via je router of een NAS als VPN-server, kun je natuurlijk ook helemaal zelfstandig een VPN-server installeren. Een handige optie daarvoor is een externe server die via internet bereikbaar is.
Om zelf zo’n VPN-server op een externe server te hosten, moet je eerst wel een paar dingen regelen. Het eerste is natuurlijk een Linux-server op een locatie en van een hoster naar keuze. In dit artikel gaan we uit van een elementaire Virtual Private Server (VPS), bijvoorbeeld het Linux V10-pakket van Strato. Dan heb je voor 5 euro per maand een Linux-server met 2 GB RAM en een 50GB-ssd en – wat belangrijker is – onbeperkt dataverkeer via de 100-Mbit/s-verbinding.
Dat is voor het doel van dit artikel ruim voldoende. Als je meer mogelijkheden wilt, omdat je daar bijvoorbeeld meteen ook een webserver op wilt draaien en eventueel nog andere services, dan zijn andere pakketten ook mogelijk. Als je daar de kosten van een com
merciële VPN-aanbieder dan aftrekt, hoeft dat al met al niet zo duur te zijn.
Bij die Linux-VPS wordt standaard de serverversie van Ubuntu 18.04 LTS geïnstalleerd. Als je wilt kun je er ook Ubuntu 14.04 LTS, Debian 8 en 9 of CentOS 7 op (laten) installeren. Die keuze is niet permanent, je kunt later altijd weer met een schone lei en/of met een ander besturingssysteem opnieuw beginnen.
Zo’n VPS heeft standaard een vast IPv4-adres, wat je later nodig hebt voor het configureren van de VPNclients. Je kunt echter ook vrij simpel een domeinnaam aan je Linux-server koppelen. Zo’n domeinnaam kost je dan 40 cent per maand, oftewel nog geen 5 euro per jaar. Dat maakt toegang tot je (web)server natuurlijk een stuk makkelijker.
VOORWERK
Om je Linux-server als OpenVPN-server te gebruiken, heb je in principe genoeg aan de commandline. Als je met behulp van bijvoorbeeld Putty (Windows) via SSH contact maakt met je server, kun je alles wat nodig is om je VPN-server werkend te krijgen met behulp van commando’s doen.
Voordat je daarmee begint, moet je echter eerst een andere gebruiker dan alleen root aanmaken. Maak verbinding met het commando ssh root@jouw_server_ip en je root-wachtwoord. Maak dan met adduser cttest (of een andere naam) een nieuwe gebruiker aan en geef die een wachtwoord. Of je bij de overige vragen ook wat invult moet je zelf weten – nodig is het niet per se. Vervolgens geef je die gebruiker superuser-rechten met usermod -aG sudo cttest. Als je de SSH-verbinding verbreekt en opnieuw inlogt, kom je vanzelf uit bij de nieuwe home-directory van die nieuwe gebruiker en kun je de volgende stappen veilig uitvoeren.
Daarna moet je nog een firewall installeren en configureren. Dat werkt bij Ubuntu 18.04 het makkelijkst met ufw. Installeer dat eerste met sudo apt install ufw en controleer de status met sudo ufw status verbose. Hij zal in eerste instantie uitstaan. Met sudo ufw app list kun je zien wat er door ufw allemaal afgehandeld wordt.
Omdat je contact via SSH wilt blijven maken, moet je die mogelijkheid toevoegen met sudo ufw allow ssh. Daarna kun je de firewall starten met sudo ufw enable. Je Linux-server is nu klaar voor gebruik.
MEEKIJKEN OP AFSTAND
Als je het prettiger vindt om het installeren en configureren toch meer lokaal op de server zelf te doen, dan moet je er eerst voor zorgen dat je verbindingen met een remote desktop kunt maken. Die desktop moet je dan eerst installeren en de VNC-server installeren. Dat zal in ieder geval nog via SSH moeten. Log in op de server en voer de volgende commando’s uit:
sudo apt update sudo apt upgrade sudo apt install xfce4 xfce4-goodies sudo apt install tightvncserver
Daarmee update je het systeem en installeer je de meest recente Xfce-desktop, en daarna de TightVNC-server. Daarna moet je een wachtwoord instellen voor de VNC-server en de configuratiebestanden aanmaken met het commando vncserver. Je wordt dan gevraagd naar het wachtwoord waarmee je remote toegang wilt hebben. Op de vraag of je een view-only-wachtwoord wilt instellen kun je n zeggen.
Nu de bestanden er zijn, kun je de VNC-server configureren. VNC moet bijvoorbeeld weten welke desktop er opgestart moet worden. In je home-directory staat in de verborgen directory .vnc het bestand xstartup, dat net is aangemaakt. Je moet de VNC-server wel eerst even stoppen met vncserver -kill :1.
Maak een back-up van het configuratiebestand met cp ~/.vnc/xstartup ~/.vnc/xstartup.bak. Open het bestand xstartup vervolgens met nano ~/.vnc/ xstartup. Je kunt daar ook een willekeurig andere editor voor gebruiken – en mocht nano nog niet geïnstalleerd zijn, dan kun je dat met sudo apt install nano alsnog even doen. Vervang de inhoud van het bestand door
#!/bin/bash xrdb $HOME/.Xresources startxfce4 &
Daarmee wordt eerst het bestand .Xresources ingelezen met daarin instellingen over de desktop, zoals kleuren en fonts. Met het tweede commando wordt Xfce gestart. Met sudo chmod +x ~/.vnc/xstartup
worden de rechten van het bestand nog even goed gezet.
VNC-SERVICE
De VNC-server draait dan wel, maar als het systeem herstart moet hij handmatig weer opgestart worden. Om dat automatisch te laten doen, maak je met sudo nano /etc/systemd/system/vncserver@. service een bestand aan waar je het volgende inzet: [Unit]
Description=Start TightVNC server at startup After=syslog.target network.target [Service] Type=forking User=cttest Group=cttest WorkingDirectory=/home/cttest
PIDFile=/home/cttest/.vnc/%H:%i.pid ExecStartPre=-/usr/bin/vncserver -kill :%i > / dev/null 2>&1 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :%i ExecStop=/usr/bin/vncserver -kill :%i
[Install] WantedBy=multi-user.target Daarmee wordt standaard een resolutie van 1280 bij 800 ingesteld met 24-bit kleuren. Daar kun je ook andere waarden bij opgeven. Vervolgens start je de systemd-service met sudo systemctl daemon-reload sudo systemctl enable vncserver@1.service sudo systemctl start vncserver@1 Je kunt dan met sudo systemctl status vncserver@1 controleren of de VNC-service draait.
VNC-CLIENT
Daarna kun in principe al bij je server met behulp van een VNC-viewer als het programma VNC Viewer of TightVNC. Als serveradres geef je het IP-adres of de domeinnaam van je Linux-server op, gevolgd door het poortnummer 5901, dus bijvoorbeeld mijnvpn. nl:5901.
Geef je wachtwoord op, waarna je de melding krijgt dat de verbinding niet versleuteld is. Als je daar geen problemen mee hebt, klik je gewoon op OK en ga je verder. Je krijgt dan de Xfce-desktop te zien en vanaf dat moment heb je met een grafische interface toegang tot je server.
OPENVPN INSTALLEREN
Je kunt OpenVPN handmatig op je Linux-server installeren, maar gelukkig bestaat er ook een snellere manier. Anders moet je zelf in de weer met het genereren van sleutels en certificaten en er voor zorgen dat de server en zijn clients over de juiste versie daarvan beschikken. Met het volgende commando haal je het kant-en-klare installatiescript binnen:
wget https://git.io/vpn -O openvpn-install.sh
Dan kun je dat script uitvoeren met sudo bash openvpn-install.sh
Bevestig het gevonden IPv4-adres, wat he IP-adres is waarmee je server via internet bereikbaar is, gebruik als VPN-protocol UDP (1) en bevestig het voor VPN standaard poortnummer 1194. Als DNS-servers kun je in eerste instantie die van Google (3) of OpenDNS (4) gebruiken. Na de configuratie een naam te hebben gegeven gaat het installeren beginnen.
Je kunt het config-bestand van de OpenVPN-server inzien met more /etc/openvpn/server.conf.
Onderdruk vooral de neiging om dat bestand zelf met een editor aan te passen! Na het installeren kun je met cat /etc/rc.local zien welke instellingen er door het script bij de firewall gedaan zijn om VPN mogelijk te maken. Omdat we liever met ufw als firewall-schil werken, zet je met een editor eerst een commentaarteken voor alle regels in /etc/rc.local. Dan voer je het commando sudo ufw allow 1194/udp uit. Na sudo nano /etc/ufw/before.rules voeg je bovenaan voor de filterinstellingen de volgende regels toe:
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source jouw_server_ip Om ervoor te zorgen dat al het netwerkverkeer via de VPN-verbinding zal lopen. Scrol naar beneden naar de regel
# ok icmp code for FORWARD en voeg daar de volgende regels toe: -A ufw-before-forward -m state --state RELATED,ESTABLISHED -j ACCEPT -A ufw-before-forward -s 10.8.0.0/24 -j ACCEPT -A ufw-before-forward -i tun+ -j ACCEPT -A ufw-before-forward -i tap+ -j ACCEPT
Bewaar het bestand en open vervolgens sudo nano /etc/ufw/sysctl.conf om bij de regel net/ipv4/ ip_forward=1 het commentaarteken te verwijderen. Daarna moet je de ufw-firewall herstarten met sudo ufw reload om alle nieuwe instellingen te activeren.
Met de volgende commando’s start je daarna de OpenVPN-service: sudo systemctl start openvpn@server
Daarna kun je met sudo systemctl status openvpn@server kijken wat de status van de VPN-server is. Als het goed is, heeft hij na een tijdje de status ‘active’ gekregen.
OPENVPN-CLIENT
In je home-directory staat vervolgens een client-configuratiebestand met de naam die je opgegeven hebt en de extensie .ovpn. Als je dat nog niet gedaan hebt, moet je een OpenVPN-client voor je besturingssysteem downloaden en/of installeren. Dat kan voor Windows, Linux en macOS, maar ook voor Android en iOS.
Kopieer het ovpn-bestand met scp of ftp naar je lokale machine. Bij een commandline kan dat bijvoorbeeld met scp root@jouw_server_ip:~/bestand. ovpn, maar je kunt daar ook een programma als WinSCP voor gebruiken. Als je het configuratiebestand bij je programma of app importeert, moet je meteen contact kunnen maken met de VPN-server op je remote Linux-server. Het kan zijn dat UDP-poort 1194 echter door je router geblokkeerd wordt, dan moet je die poort openzetten en eventueel laten doorsturen naar het IP-adres van het apparaat waar je de VPN-verbinding mee wilt maken.
Op deze manier kun je maar met één gebruiker contact maken, maar met meerdere personen in huis wil je natuurlijk ook meer accounts aanmaken. Het gedownloade installatiescript kan dat gelukkig ook: start het script opnieuw met sudo bash openvpn-install. sh. Het script zal merken dat OpenVPN al geïnstalleerd is en je de mogelijkheid bieden te kiezen uit het aanmaken van een nieuwe gebruiker of een bestaande te verwijderen – of OpenVPN in zijn geheel weer te verwijderen.
CONCLUSIE
Het script openvpn-install.sh neemt je veel werk uit handen bij het installeren van OpenVPN, maar heeft aan de andere kant ook het nadeel dat als er iets niets goed gegaan lijkt te zijn, het moeilijk te achterhalen is waar het probleem zou kunnen zitten. En ondanks het script moet je zelf hier en daar nog watat handwerk
verrichten om bijvoorbeeld de firewall goed in te stellen en al het dataverkeer door te sturen. Dat kan voor sommigen een overweging zijn om de installatie toch van de bodem af aan handmatig te doen – zie de link op deze pagina voor bronnen waar dat beschreven wordt.
Gelukkig is er op internet een heleboel te vinden over (problemen met het installeren van) OpenVPN. Bij de link op deze pagina kun je er daar een aantal van vinden. We liepen bijvoorbeeld tegen het feit aan dat de OpenVPN-service bleef hangen bij de status ‘activating’, maar nooit ‘active’ werd. Op een Franse website vonden we uiteindelijk de oplossing dat we LimitNPROC moesten verhogen van 10 naar 3897 – om maar eens wat te noemen.
Het mooie is wel, dat als het eenmaal werkt, je vanaf elke locatie ter wereld contact kunt maken met je Linux-VPN-server en dan niet afhankelijk bent van een externe aanbieder of de bereikbaarheid van je eigen thuisrouter of NAS.