OPNsense, netwerksegmentatie en VPN
De kern van elk computernetwerk is de router. Zoals de naam doet vermoeden is de router verantwoordelijk voor het routeren van al net netwerverkeer. Daarnaast biedt een degelijke router andere functionaliteit en services zoals een firewall, monitoring van het netwerkverkeer, prioritering en dergelijke.
Omdat we een software-router willen draaien op het x86-64 platform, valt er veel te kiezen. Veruit de drie bekendste zijn DD-WRT en OPNsense/PfSense. Beide platformen bieden gelijkmatige functionaliteit maar hebben een ander oorsprong. DD-WRT was van oorsprong firmware welk geflashed kan worden op oudere modellen routers om zo meer functionaliteit toe te voegen. PfSense is een fork van een oud softwarepakket onder de naam m0n0wall. OPNsense is weer een fork van PfSense. Het verschil tussen PfSense en OPNsense is dat het laatste werkt met zogenaamde rolling releases waar PfSense werkt met updates waar een grote tijd tussen zit.
Vanwege de rolling releases van OPNsense, grote community-support en het schrappen van de Community-licentie van PfSense, kies ik ervoor om met OPNsense te gaan werken. Daarnaast beschikt OPNsense over een groot aanbod van verschillende plug-ins om de router nog functioneler te maken.

Hardware keuze
De router gaat samen met andere software draaien op een Supermicro rackmount server, hierna Routerbox genoemd. OPNsense gaat draaien op een VM met de volgende specificaties:

Het moederbord is standaard voorzien van 3 GBe NIC’s. Een is in gebruik voor de WAN een voor IPMI en de andere zou ik dan voor LAN kunnen gebruiken en die koppelen aan een switch. In mijn use-case is een enkele gigabit verbinding echter niet genoeg. Bij een grote bestandsoverdracht zal deze de verbinding compleet verzadigen waardoor er geen ruimte overblijft voor ander verkeer. Vanwege die reden heb ik de server uitbreid met een extra 4 ports GBe NIC.
Link aggegratie
LACP en Round Robin(RR) biedt de mogelijkheid om meerdere fysieke poorten te bundelen tot een enkele virtuele poort. Het voordeel hiervan is dat de theorethische maximale bandbreedte per poort omhoog gaat. Voorwaarde is dat zowel het OS als de switch deze functionaliteit moet ondersteunen. Er is een verschil tussen zowel de LACP en RR protocollen.

LACP
Dit protocol biedt, in tegenstelling tot RR de mogelijkheid voor fout-tolerantie. Mocht een fysieke poort of kabel niet meer functioneel zijn, wordt de workload verspreidt over de andere verbindingen. Het nadeel van LACP is dat het alleen meer bandbreedte biedt in het scenario waar er meerdere sessies zijn die data versturen over het netwerk. In de geschetste situatie van vier gebundelde poorten zou de theoretische bandbreedte 4 Gb/s moeten zijn. Bij een enkele bestandsoverdracht zal deze echter nooit groter zijn dan 1Gb/s omdat deze overdracht maar een enkele sessie is. Mochten er nou vier transfers zijn kan de volledige bandbreedte wel benut worden.
Round Robin
In tegenstelling tot LACP biedt RR geen fout-tolerantie. In plaats van een slimme toepassing van link aggegration wordt er bij RR omstebeurt een ethernet-frame gestuurd over de fysieke poorten. Het voordeel hiervan is dat de theoretische bandbreedte per sessie wel 4 Gb/s is. Het nadeel van RR is dat het heel belangrijk is dat de volgorde van de packets correct zijn, iets wat niet gegarandeerd kan worden bij druk netwerkverkeer. Het TCP-protocol geeft elke packet een nummer. Mocht het verkeer niet in de juiste volgorde aankomen kan de ontvanger de packets achteraf rangschikken. Bij een overdracht die gebruik maakt van het UDP-protocol worden de packets niet genummerd. Dit kan resulteren in gecorrumpeerde data.
Omdat ik gegarandeerd wil zijn dat de verstuurde data integer is, neem ik de nadelen van LACP voor lief en heb ik besloten om te kiezen voor LACP.
Netwerksegmentatie
Om de veiligheid van het netwerk te vergroten, de aangesloten apparaten te ordenen en het netwerkverkeer te verkleinen, moet het netwerk gesegmenteerd worden. Dit kan op twee manieren: Via subnetting en/of via VLAN’s. Op de volgende pagina volgt een opsomming van de twee verschillende technieken alsmede de voor en nadelen ervan.
Subnetting
Met subnetting kan een netwerk opgedeeld worden in verschillende netwerken door het netwerkmasker aan te passen. Het netwerkmasker wordt vergeleken met het IP-adres. Hiermee kan de client bepalen of hij het netwerkverkeer naar een andere client op hetzelfde netwerk moet sturen, of dat het verkeer bestemd is voor de gateway. Subnetting vind plaats in de 3e laag van het OSI-model, namelijk de netwerklaag.
Een voorbeeld:
Client IP adres (decimaal): 192.168.0.2
Subnet masker (decimaal): 255.255.255.252
Client IP adres (binair): 110000000 10101000 00000000 00000010
Subnet IP adres (binair): 111111111 11111111 11111111 11111100
Het binaire getal wat het subnet masker vertegenwoordigd, geeft aan dat de laatste twee getallen van het IP-adres binnen het lokale netwerk van de client valt. Dit is te zien aan de twee nullen op het eind van de binaire waarden. Deze rest wordt de wildcard genoemd.
Subnet Wildcard (decimaal): 0.0.0.3
Subnet Wildcard (Binair): 00000000.00000000.00000000.00000011
Uit de decimale waarde van de wildcard kan opgemaakt worden dat er totaal maar 4 IP-adressen beschikbaar zijn in het subnet, namelijk:
192.168.0.0 Gebruikt als network identifier
192.168.0.1 Beschikbaar voor een client
192.168.0.2 Beschikbaar voor een client
192.168.0.3 Gebruikt voor broadcast verkeer
Mocht een client in het bovenstaande voorbeeld een ping willen versturen naar 192.168.0.5, weet hij door gebruik te maken van het subnet masker dat dit adres buiten zijn netwerk ligt, en moet het verkeer door de ingestelde gateway afgehandeld worden.
Virtuele lokale netwerken (VLAN)
Netwerksegmentatie door middel van VLANs werkt op de 2e laag van het OSI-model, namelijk de datalink laag. De 2e laag is zich niet bewust van IP-adressen en werkt enkel met MAC-adressen. De pakketten netwerkverkeer worden geen packets genoemd zoals uit de TCP/UDP/IP stack, maar ethernet frames. Elk frame bestaat uit een header die meta-informatie geeft over onder andere de oorsprong en de bestemming van de frame. Een header kan geïnjecteerd worden met vier extra bytes aan informatie welk indicatief zijn voor een VLAN. Dit proces wordt VLAN tagging genoemd.
In tegenstelling tot subnetting, is er hardware nodig die de extra VLAN-informatie in de frame header kan interpreteren. Het configureren van een VLAN kan ten opzichte van subnetting lastig zijn met risico’s op clients die geen toegang tot het netwerk hebben, of terecht komen op een gedeelte van een netwerk waar ze niet horen. Werken met inferieure hardware brengt ook een beveiligingsrisico met zich mee doordat switches welk niet om kunnen gaan met VLAN tagged verkeer, de frames kunnen droppen of simpelweg doorsturen naar alle clients.
Het voordeel van VLAN is dat apparaten op verschillende fysieke locaties een netwerk kunnen delen. Met VLAN is het mogelijk om het verkeer van meerdere netwerken over een enkele netwerkport te laten verlopen. Een laatste grote voordeel van VLANs is dat het altijd aan de netwerkkant te configureren is. Hierdoor kunnen netwerkbeheerders een grotere controle uitoefenen op de clients op hun netwerk.
Voor het thuisnetwerk wil ik vier verschillende VLANs opzetten, namelijk:

In OPNsense heb ik vier nieuwe interfaces aangemaakt en die gekoppeld aan netwerkadapter VTNET1. Deze netwerkadapter is virtueel en berust zich op de vier gebundelde netwerkpoorten welk beschreven zijn in het vorige hoofdstuk. Op elke interface moet een eigen DHCP-server draaien.

Het configureren van de switch was echt een hoofdpijn dossier. De eerste managed switch die ik voor dit project gekocht had, had zijn management interface op VLAN1. Dit betekent dat elke niet geconfigureerde poort toegang had tot de web interface. Omdat dit een gigantisch beveiligingsrisico is, heb ik deze switch weg gedaan en een andere gekocht.
Configuraties voor VLANs zijn lastig omdat foutopsporing een draak is (niet weten wat ik fout deed). Wat het leerproces niet hielp is dat de terminologie omtrent VLANs verschilt per fabrikant. Het instellen van VLANs resulteerde regelmatig in een harde reset van de switch, loops in het netwerkverkeer waardoor er cascade-uitval plaatsvond, netwerkclients die simpelweg verdwenen en een Wifi-netwerk dat het vaker niet dan wel deed. Uiteindelijk heb ik gekozen om een backdoor op de switch te installeren zodat de interface op VLAN1 bereikbaar was. Tevens heb ik een backdoor aan de WAN-kant van de router geinstalleerd zodat ik van “bovenaf” toegang tot de switch en de router had om een nieuwe configuratie te proberen.
Het concept van VLAN trunking heeft lang op zich laten wachten voordat het bij me bezonken was. Ik heb meerdere Wifi-netwerken, verdeeld over meerdere access points. Elk wifi-netwerk heeft zijn eigen VID, afhankelijk van het gebruiksdoel. Sommige access points zijn bekabeld naar de switch toe en moeten over een enkele poort het verkeer van verschillende VLANs doorgeven. Ik maakte een fout door de VLAN tag die de access point mee gaf, te overschrijven met een eigen tag. Het resultaat hiervan was dat IoT-apparaten altijd onderdeel waren van VLAN 10; het netwerk waar alle kritische systemen zich bevinden.
Virtueel prive netwerk (VPN)
Omdat ik de diensten die thuis gehost worden graag ook buiten het LAN om wil benaderen, moet hier een oplossing voor gevonden worden. Er zijn hier een aantal obstakels die overwonnen moeten worden.
DDNS
De internet provider Ziggo deelt geen statische IP-adressen uit. Adressen worden geleased uit een poule, als de lease verlopen is kan de modem een beroep doen op hetzelfde IP-adres. Dit gaat in mijn ervaring meestal maar een paar maanden goed. Doordat er een roulatie in IP-adressen is, wordt het lastig om DNS-records te laten verwijzen naar het juiste adres.
De oplossing hiervoor is om te werken met DDNS. In dit systeem wordt de computer achter het dynamische IP-adres verantwoordelijk voor het bijhouden en bewerken van de DNS-record. Dit gebeurt door per tijdsinterval te controleren wat het externe IP-adres is. Als er een afwijking is tussen het geregistreerde en gemeten IP-adres, geeft de computer dat door aan het register en is het probleem opgelost.
Ik ben via het bedrijf Strato eigenaar van het domein lionel.wtf. Strato biedt echter geen gratis DDNS-service. Om om dit probleem heen te werken heb ik een gratis DDNS-service bij FreeDNS waar ik gebruik van maak. Het nadeel van FreeDNS is dat daar alleen maar subdomeinen te krijgen zijn. OPNsense ondersteunt wel DDNS via FreeDNS.
Port forwarding en een LAN-in-LAN
Als er verkeer vanaf het WAN verbinding wilt maken met een computer binnen het netwerk, weet de router niet voor wie het verkeer bestemd is. Er kunnen immers meerdere computers zich achter de router bevinden. Om te zorgen dat het verkeer op bestemming komt dient er in de router een regel gemaakt te worden die het verkeer naar de juiste host verwijst, dit wordt port forwarding of NAT genoemd.
In mijn geval wordt het nog complexer doordat mijn router opereert onder het netwerk van de Ziggo box. Dit houdt in dat het verkeer van het WAN in de modem/router combinatie doorverwezen moet worden naar OPNsense, en vanaf daar weer naar de host op mijn netwerk.
VPN: De implementatie
Er valt veel te zeggen over de verschillende soorten versleutelingstechnieken en protocollen. Omdat het onderwerp versleuteling een boek waardig is, ga ik niet verder uitwerken over de verschillende technieken. In plaats daarvan hou ik het praktisch.
Het doel van een VPN server is het veilig kunnen verbinden met het thuisnetwerk via een onveilig netwerk. Dit wordt gerealiseerd door het verkeer op packet-niveau in te kapselen met versleutelde informatie. Voor een ieder die het verkeer kan onderscheppen kan alleen zien wie de zender is en wie de ontvanger is.
Om als client geauthentiseerd te worden bij de server, wordt er 2FA toegepast. De eerste factor is iets wat je weet (wachtwoord) en het tweede is iets wat je hebt (MAC-adres en certificaat).
Vervolgens moet de client de software-suite van OpenVPN installeren. Deze suite is voor elk platform beschikbaar: Android, Windows, IOS. OSX, Linux, xBSD, RHEL, etc.
Als de server en client eenmaal geconfigureerd is, dienen de forwarding regels nog ingesteld te worden bij de ZiggoBox en OPNsense. Standaard wordt al het OpenVPN verkeer over poort 1194 verstuurd via het UDP-protocol.
Ik merkte op dat de bandbreedte van een versleutelde verbinding erg laag was. Na onderzoek kwam ik er achter dat de CPU load op 100% stond. Dit zou niet mogen omdat de processor AES-versleuteling hardware-matig zou moeten ondersteunen. In Proxmox kwam ik er achter dat deze feature uitgeschakeld stond. Na het inschakelen en rebooten van het systeem was de CPU geen bottleneck meer bij grote transfers op het LAN via een versleutelde verbinding.