Internet via een VPN

Privacy is het gesprek van de dag. Mensen schrijven zich massaal uit bij Facebook door het Cambridge Analytica schandaal. Met name jongeren kunnen zich niet vinden in de nieuwe Wet Inlichtingen- en Veiligheidsdiensten.

Er zijn veel manieren waarop men data kan verzamelen over internetgebruikers. Zo word je door marketingbedrijven met name gevolgd door middel van tracking cookies en stukken Javascript. Allemaal zaken die eigenlijk niks toevoegen voor de eindgebruiker, maar er enkel voor zorgen dat je advertenties te zien krijgt die ‘bij je passen’. Maar zeg nou zelf, in wiens belang is dat? Hoe belangrijk is het voor een potentiële klant dat hij aanbiedingen voorgeschoteld krijgt waardoor hij naar een website gelokt wordt?

Gelukkig zijn er tal van manieren om te voorkomen dat je wordt gevolgd. Voor webbrowsers zijn er bijvoorbeeld plugins als Ghostery en NoScript. Ik wilde nog een stapje verder gaan, door al mijn internetverkeer te laten verlopen via een VPN van PIA.

Nadat ik een nieuwe Raspberry Pi uit het doosje had gehaald en de nieuwste versie van Raspbian had geïnstalleerd, kon het project beginnen. Het doel was om uiteindelijk 2 wifi-netwerken te hebben, waarvan er één direct internet kreeg en één via de VPN. Wat ik uiteindelijk nodig had:

– Router met DDWRT (ik gebruik een Netgear R6400), met VLAN-ondersteuning;
– Raspberry Pi met netwerkpoort (de Pi 3 presteert goed)

Router

De router gebruik ik niet meer als router. De belangrijkste taak die hij vervult, is het toevoegen van VLAN-tags aan verkeer dat via bepaalde poorten binnenkomt. Zo heb ik de internetverbinding (WAN) gekoppeld aan VLAN-15. Poort 1, 2 en 3 zijn trunk-poorten. Dat houdt in, dat alle pakketten die vanaf daar verstuurd worden, een VLAN-tag meekrijgen van het netwerk van waaruit ze afkomstig zijn. In het geval van poort 2 en 3 is dat, zodat ik in de configuratie van een netwerkadapter kan bepalen in welk netwerk de computer moet komen. Poort 1 is aangesloten op de Raspberry Pi; de Pi is dus het enige apparaat in het netwerk dat toegang heeft tot de internetverbinding.

Raspberry Pi

Het eerste wat je in de Raspberry Pi moet doen, is het regelen van de belangrijkste netwerk-interfaces. De interface ‘eth0’ moet je een statisch IP geven, met het subnetmask 255.255.255.255. Het is onbelangrijk wat je hier precies instelt, maar het meest logische is om iets te kiezen in 169.254.0.0/16. Dit zorgt ervoor dat de Pi geen netwerk-routes kiest zonder VLAN-tag.

Vervolgens maak je de interfaces voor de vlans aan. Een voorbeeld:

auto eth0.1
iface eth0.1 inet static
address 192.168.1.2
netmask 255.255.255.0
vlan-raw-device eth0

Deze interface zorgt voor een verbinding met de router, zodat je die later nog kunt bereiken. Misschien we de belangrijkste: de WAN-interface.

auto eth0.15
iface eth0.15 inet dhcp
vlan-raw-device eth0
hwaddress ether b8:27:eb:e9:60:95

Voor het VPN-netwerk maakte ik deze interface:

auto eth0.7
iface eth0.7 inet static
address 192.168.7.1
netmask 255.255.255.0
vlan-raw-device eth0
up ip rule add from 192.168.7.0/24 table pia
up ip rule add to 192.168.7.0/24 table pia
down ip rule del from 192.168.7.0/24 table pia
down ip rule del to 192.168.7.0/24 table pia
hwaddress ether b8:27:eb:e9:60:87

Deze configuratie zorgt ervoor dat voor deze interface de routes worden bepaald in de tabel ‘pia’ in plaats van de standaard tabel. Het hwaddress is ingesteld, zodat Windows niet alle VLANs als hetzelfde netwerk gaat zien. Dan hebben we ook nog de interface die ‘directe’ connectiviteit aanbiedt:

auto eth0.14
iface eth0.14 inet static
address 192.168.14.1
netmask 255.255.255.0
vlan-raw-device eth0
hwaddress ether b8:27:eb:e9:60:94

Als het goed is, werkt je directe netwerk nu al. We zijn nog niet klaar, want de VPN moet nog verbinding krijgen. Hiervoor zijn gelukkig tal van tutorials te vinden. Bovendien is het enigszins afhankelijk van je provider. Het belangrijkste zijn deze zaken in het configuratiebestand van de OpenVPN-client:

route-noexec
script-security 2
route-up /etc/openvpn/client/pia-up.sh

En het genoemde bash-script:

#!/bin/sh

/sbin/ip route flush table pia
/sbin/ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table pia $ROUTE; done
/sbin/ip route add default via ${route_vpn_gateway} dev ${dev} table pia

Nu zouden de netwerken moeten werken. Het is een goed idee om met iptables wat regels aan te maken om de netwerken dicht te timmeren.

Het grootste probleem waar ik tegenaan liep, was het ontbreken van Netflix-toegang. Netflix blokkeert namelijk de meeste VPNs en proxies. Mijn oplossing hiervoor is een proxyserver, waar ik alleen het netflix-verkeer doorheen stuur. Op de Raspberry Pi werkt squid erg goed. Houd er wel rekening mee dat je na de installatie zelf nog moet aangeven welke subnets toegang krijgen. Om alleen het netwerkverkeer naar Netflix via deze proxy te laten verlopen, gebruik ik een proxyscript:

function FindProxyForURL(url, host) {
if(dnsDomainIs(host, “netflix.com”)
|| dnsDomainIs(host, “.netflix.com”)
|| dnsDomainIs(host, “nflxvideo.net”)
|| dnsDomainIs(host, “.nfxlvideo.net”)
|| dnsDomainIs(host, “nflximg.net”)
|| dnsDomainIs(host, “.nflximg.net”)
|| dnsDomainIs(host, “nflxext.com”)
|| dnsDomainIs(host, “.nflxext.com”)) {
return “PROXY asgard.bokd.am:3128”;
}
return “DIRECT”;
}

Dit kun je ergens hosten, en dan het adres instellen in Windows (of je favoriete OS). Als je het helemaal mooi wilt doen, kun je een bestand serveren op basis van client-ip, zodat je buiten de deur niet naar je interne proxy gestuurd wordt.