Tech FEATURE

Zo maak je je thuisserver bereikbaar van buitenaf

Zo maak je je thuisserver bereikbaar van buitenaf

Met een thuisserver draai je zelf diensten als cloudopslag, mediastreaming of bestandsdeling binnen je eigen netwerk. Wil je daar ook onderweg of vanaf je werk bij kunnen, dan moet je die server veilig via internet bereikbaar maken. In dit artikel zetten we de belangrijkste mogelijkheden en aandachtspunten op een rij.

Foto: ID

In dit artikel

In dit artikel lees je hoe je een thuisserver veilig van buitenaf bereikbaar maakt. We zetten de belangrijkste routes op een rij, van poortdoorverwijzing en VPN tot reverse proxy, cloudtunnels en mesh-VPN, en laten ook zien waar double NAT en CGNAT roet in het eten kunnen gooien.

Lees ook: Je oude Windows-pc als thuisserver: zo zet je Jellyfin en Syncthing op

Het is op zich niet moeilijk om een eigen server in je thuisnetwerk te draaien. Dat kan een serverapplicatie op je NAS zijn, maar ook een service op een oudere computer of zelfs op een singleboardcomputer als een Raspberry Pi. Denk bijvoorbeeld aan eigen cloudopslag, een mediaserver, een web- of FTP-server en meer.

We gaan ervan uit dat je intussen wel weet hoe je zo'n server operationeel krijgt, en bespreken hier hoe je deze ook via internet veilig benadert. We geven hier een overzicht van de belangrijkste methoden en je voelt het wellicht al aankomen: dit artikel richt zich vooral op de wat gevorderde gebruiker.

NAT: wat?

Enige toelichting over hoe een thuisnetwerk verbinding maakt met internet lijkt ons geen overbodige luxe. Dat gebeurt via een router. Dit is bijna altijd een NAT-router (Network Address Translation), waarbij meerdere toestellen met private ip-adressen tegelijk het internet op kunnen via één publiek ip-adres dat door de internetprovider wordt toegekend. Wanneer een toestel in het thuisnetwerk een verbinding opzet naar het internet, houdt de router deze sessie bij in zijn NAT-tabel. Komt er vervolgens antwoordverkeer terug op het publieke ip-adres, dan weet de router naar welk intern toestel dit verkeer moet worden doorgestuurd. Ongevraagd inkomend verkeer van buitenaf wordt standaard geblokkeerd. Het publieke ip-adres kun je binnen je netwerk opvragen via bijvoorbeeld www.watismijnip.nl.

Het publieke ip-adres van de router (volgens watismijnip.nl).

Lastige NAT-scenario's

Doorgaans levert de provider een geïntegreerde modem-router, maar vaak kun je de routerfunctie uitschakelen (bridge-modus) en een eigen router aansluiten. Bij sommige providers is dit helaas niet mogelijk. Sluit je in dit geval toch een eigen router aan, dan krijg je te maken met 'double NAT', wat het lastiger maakt om interne servers of diensten van buitenaf bereikbaar te maken.

Daarnaast doe je er goed aan het WAN-ip-adres van je providerrouter te controleren, door in te loggen op (de webinterface van) deze router. Ligt dit in het adresbereik van subnet 100.64.0.0/10, dan maakt de provider gebruik van CGNAT (Carrier-Grade NAT). Hierbij delen meerdere klanten één publiek IPv4-adres, waardoor je eigen router geen apart publiek IPv4-adres heeft. Net als bij double NAT bemoeilijkt dit inkomende verbindingen, al bestaan hiervoor gelukkig werkbare oplossingen (zie 'Cloud relay' en verder).

Een typisch double NAT-scenario: een privé-ip-adres op de eigen router, dat verwijst naar de modem-router van de provider (met het publieke ip-adres).

Poortdoorverwijzing

We willen dus een eigen server van buitenaf bereiken en we gaan daarbij eerst uit van een doorsnee NAT-situatie.

Je moet weten dat een serverdienst luistert op een of meer vaste netwerkpoorten, met poortnummers tussen 1 en 65535, en steeds in combinatie met een protocol, meestal tcp of soms (ook) udp. Stel dat je server op tcp-poort 8081 draait. Wanneer verkeer van buitenaf op deze poort toekomt, moet de router weten naar welk toestel in het thuisnetwerk dit verkeer moet worden doorgestuurd, bijvoorbeeld naar het apparaat met het private ip-adres 192.168.0.10.

Daarvoor kun je op de router een poortdoorverwijzingsregel instellen. Je bepaalt bijvoorbeeld dat alle inkomende verbindingen op externe poort 80 worden doorgestuurd naar interne poort 8081 op het netwerktoestel 192.168.0.10. In de routerinterface vind je deze instelling vaak bij Port forwarding of Virtual Server. Raadpleeg eventueel de routerhandleiding of steek je licht op bij www.portforward.com/router.htm. Zo'n regel bevat doorgaans een naam, het interne ip-adres, het protocol, een interne en een externe poort. Deze laatste is vaak gelijk aan de interne poort, maar dit is niet noodzakelijk.

Je kunt de server nu van buitenaf bereiken via het publieke ip-adres van de router, gevolgd door de ingestelde (externe) poort, bijvoorbeeld 84.190.234.131:80.

Een typische doorverwijzingsregel: al het verkeer op poort 80 wordt doorverwezen naar poort 8081 op toestel 192.168.0.10.

Beperkingen

Het is wel wat lastig dat externe gebruikers het actuele publieke ip-adres van je router moeten kennen, aangezien dit adres kan wijzigen. Dit los je op met DDNS (Dynamic DNS). Met gratis diensten zoals Dynu en No-ip kun je een vast subdomein aanmaken, bijvoorbeeld mijnserver.ddnsfree.com, dat je automatisch kunt laten koppelen aan het publieke ip-adres van je netwerk. Een lokale app of eventuele routerfunctie zorgt ervoor dat deze koppeling up-to-date blijft. Je bereikt je server dan via de domeinnaam in plaats van via een dynamisch ip-adres.

Ook lastig is een double NAT-scenario. Hier moet je poortdoorverwijzing instellen op zowel de providerrouter (naar het WAN-ip-adres van je eigen router) als op je eigen router (naar de eigenlijke server). In een CGNAT-scenario is klassieke poortdoorverwijzing daarentegen vrijwel onmogelijk.

Weet ook dat poortdoorverwijzing op zich geen bijzonder veilige methode is. Extra maatregelen zijn daarom aanbevolen, zoals firewallregels op de router en/of server die toegang beperken tot specifieke ip-adressen, het up-to-date houden van serversoftware en het gebruik van sterke authenticatie, zoals op basis van certificaten.

Een (gratis) DDNS instellen is zo gepiept (hier: via Dynu).

VPN-server (Windows)

Een veiliger alternatief binnen een NAT-omgeving is het opzetten van een eigen VPN-server (Virtual Private Network), waarmee je in principe alle apparaten binnen je netwerk kunt bereiken. Dit zou je in principe ook kunnen doen op een VPS (Virtual Private Server) bij een hostingprovider, maar we houden het hier lokaal.

Een van de betere oplossingen is WireGuard, beschikbaar voor onder meer Linux en Windows. Op Windows kun je na het opstarten van de tool meteen een nieuwe, lege tunnel creëren en activeren, met automatisch gegenereerd sleutelpaar. De verdere configuratie voor onder meer het virtuele subnet en het toevoegen van een geautoriseerde client verloopt grotendeels handmatig en kunnen we hier helaas niet behandelen. Een configuratiebestand aan serverzijde kan er bijvoorbeeld als volgt uitzien:

[Interface]

PrivateKey = <SERVER_PRIVATE_KEY>

ListenPort = 50000

Address = 10.1.0.1/24

[Peer]

PublicKey = <CLIENT1_PUBLIC_KEY>

AllowedIPs = 10.1.0.2/32

Verwijs in dit voorbeeld udp-poort 50000 op je router door naar het LAN-ip-adres van de VPN-server en zorg ervoor dat de firewall inkomend verkeer op deze poort toelaat.

Als de VPN-server verkeer moet doorsturen naar andere netwerkapparaten, moet op de Windows-server bovendien ip-forwarding worden ingeschakeld, bijvoorbeeld via PowerShell:

Set-NetIPInterface -InterfaceAlias <tunnel_naam> -Forwarding Enabled

De WireGuard-serverconfiguratie, met geactiveerde ip-forwarding.

VPN-server (NAS)

Heb je een NAS, dan gaat het opzetten van een VPN-server een stuk eenvoudiger. Op een Synology NAS installeer je via het Package Center het pakket VPN Server. Open deze, ga (bij voorkeur) naar OpenVPN en schakel de server in. Definieer bij Dynamisch ip-adres het gebruikte subnet en merk dat standaard udp-poort 1194 actief is, die je vanuit je router naar je NAS moet doorverwijzen. Bevestig met Toepassen. Ga daarna naar de rubriek Rechten en plaats bij de gewenste accounts een vinkje in de kolom OpenVPN.

Klik vervolgens in de rubriek OpenVPN op Configuratie exporteren, pak het gegenereerde zip-bestand uit en open het ovpn-bestand in een teksteditor. Vervang hier YOUR_SERVER_IP door je publieke ip-adres of eventueel een ddns-hostnaam. Gebruik dit profielbestand met de bijbehorende sleutels daarna op de (ook mobiele) toestellen vanwaar je verbinding wilt maken met de VPN-server.

Een (Open)VPN-server instellen op een Synology NAS is snel geregeld.

Reverse proxy

Een derde manier om een server in een standaard NAT-omgeving van buitenaf te bereiken, is via een reverse proxy. Dit is een tussenliggende server in je netwerk die inkomende webverzoeken ontvangt op netwerkpoort 443 (https) en deze intern doorstuurt naar de juiste server en poort. Deze aanpak is vooral geschikt voor webdiensten die via http(s) werken, zoals een webapplicatie of zelfgehoste cloudopslag.

Je kunt een reverse proxy op een afzonderlijk toestel installeren, bijvoorbeeld via Nginx Proxy Manager via Docker (Windows), of – makkelijker nog – op je NAS.

Op een Synology NAS met DiskStation Manager 7 stel je dit in via Configuratiescherm / Aanmeldingsportaal, op het tabblad Geavanceerd, bij Reverse Proxy.

Om dit veilig te doen, koppel je een TLS-certificaat aan je domein zodat de reverse proxy via een versleutelde https-verbinding naar buiten communiceert. Dit kun je gratis regelen met Let's Encrypt, ook vanuit je NAS, bijvoorbeeld bij Synology via Configuratiescherm / Beveiliging / Certificaat.

Tot slot stel je op je router een poortdoorverwijzing in voor tcp-poort 443 naar de reverse proxy. Ga je extern naar bijvoorbeeld https://mijnserver.mijndomein.nl, dan ontvangt de proxy dit verzoek en stuurt het intern door naar bijvoorbeeld 192.168.0.10:8081. Extern blijft enkel de proxy zichtbaar; interne ip-adressen en poorten worden niet rechtstreeks blootgesteld.

Op een (Synology) NAS is het eenvoudig om zowel een TLS-certificaat als een reverse proxy in te stellen

Cloudtunnel

Deze en de volgende oplossingen functioneren ook probleemloos bij double NAT- en CGNAT-scenario's.

We beginnen met een zogeheten cloudtunnel. Hierbij draait op je thuisserver een programma dat een uitgaande verbinding opent naar een cloudservice, wat ook bij CGNAT lukt, die als tussenstation of proxy fungeert tussen het internet en je server.

Een bekende dienst is Cloudflare Tunnel. Meld je aan en klik op Add / Register a domain (jaarlijks vanaf circa 7 USD), of kies Connect a domain als je de DNS-instellingen van een bestaand domein wilt aanpassen. Klik in het linkerpaneel op Zero Trust en ga naar Networks / Connectors, klik op +Create a tunnel en benoem deze. Klik daarna op de drie puntjes naast de tunnel en kies Configure.

Installeer nu de connector-applicatie (ook voor Windows) op een systeem dat altijd bereikbaar is en volg de instructies op de webpagina. Open daarna het tabblad Published application routes en klik op Add a published application route. Selecteer je domein en vul een subdomein in. Is je server lokaal bereikbaar op bijvoorbeeld http://192.168.0.138:8080, dan vul je dit zo in bij Service Type en URL. Gebruik je https en heb je geen geregistreerd TLS-certificaat, open dan Additional application settings / TLS en schakel No TLS Verify in.

Als alles correct is ingesteld, bereik je je server nu van buitenaf via de versleutelde tunnel.

Voeg de juiste 'route' naar je server toe aan je Cloudflare-tunnel.
Cloudrelay-dienst

Een alternatieve methode die wat aan een cloudtunnel doet denken, zijn cloudservices als die van NAS-fabrikanten Synology met QuickConnect en QNAP met myQNAP-cloud. Deze zijn eenvoudig te gebruiken, maar kennen een belangrijke beperking: je bereikt van buitenaf in principe alleen servers en applicaties die door de fabrikant worden ondersteund, en dus geen willekeurige poorten of zelfgehoste diensten. Je kunt er ook zelf nauwelijks iets aan instellen.

Dit werkt in grote lijnen als volgt. Laat zowel je NAS als de client een uitgaande verbinding opzetten naar een centrale server van de fabrikant. Deze registreert en authenticeert de aanvraag en probeert vervolgens een directe P2P-verbinding tot stand te brengen. Lukt dat niet, bijvoorbeeld bij CGNAT, dan verloopt de data-uitwisseling via een cloudrelayserver van de fabrikant.

We nemen Synology als voorbeeld. Open het Configuratiescherm van je NAS, ga naar Externe toegang en vink QuickConnect inschakelen aan. Meld je aan met je account-ID en kies een QuickConnect-ID. Geef bij Geavanceerde instellingen aan of relayservers mogen worden gebruikt en bepaal welke diensten bereikbaar moeten zijn.

Synology biedt een cloudrelayservice aan via een QuickConnect-account.

Mesh-VPN

We hebben het eerder al gehad over een eigen VPN-server, maar deze functioneert niet zomaar binnen CGNAT, omdat je router geen publiek IPv4-adres krijgt. Een handig alternatief is een zogeheten mesh-VPN-dienst, waarmee je apparaten onderling versleuteld kunt verbinden over internet. In tegenstelling tot een klassieke VPN, die verkeer via één centrale server laat lopen, verbinden apparaten zich hier rechtstreeks met elkaar wanneer dat mogelijk is. Hierdoor ontstaat een overlaynetwerk dat zich gedraagt als een virtueel LAN.

Bekende, ook gratis te gebruiken, diensten zijn Tailscale en ZeroTier. We nemen hier Tailscale als voorbeeld.

Tailscale gebruikt het WireGuard-VPN-protocol voor versleuteling en probeert via NAT-traversal (hole punching) eerst directe verbindingen tot stand te brengen. Lukt dit niet, wat vaak het geval is bij CGNAT of bij strikte firewallregels, dan loopt het verkeer – nog steeds end-to-end versleuteld – via relayservers (DERP-servers) van Tailscale.

Ga naar Tailscale en klik op Get Started – it's free! (gratis tot drie gebruikers en 100 apparaten) en meld je aan. Er wordt nu een Tailscale-netwerk (kortweg tailnet) aangemaakt. Je krijgt meteen de gelegenheid om de Tailscale-applicatie voor het gewenste systeem te downloaden en te installeren. Meld je aan met hetzelfde account en bevestig de opname van het apparaat in het tailnet. Via de beheerconsole op je online dashboard kun je de apparaten verder beheren. Je ziet hier ook het toegewezen ip-adres (100.x) en de hostnaam waarmee dit apparaat bereikbaar is vanaf andere toestellen waarop je met hetzelfde account bij de Tailscale-app bent aangemeld. Om een tailnet te bereiken vanaf een toestel zonder Tailscale-app, moet je een specifieke dienst expliciet publiek maken via Tailscale Funnel (of een aparte tunnel/reverse proxy zoals Nginx Proxy Manager). We hebben helaas niet de ruimte hier verder op in te gaan.

Een machine is succesvol toegevoegd aan het tailnet.
Kieskeurig
Geen producten gevonden.