NAT: hoe twintig apparaten één IPv4-adres delen
Tel de apparaten in je huis die online zijn: laptops, telefoons, de tv, een NAS, een paar lampen. Je zit al snel op twintig. Toch heeft je provider je maar één IPv4-adres gegeven. Dat al die apparaten tegelijk kunnen streamen, updaten en appen, komt door een truc in je router die zo gewoon is geworden dat bijna niemand er nog bij stilstaat: NAT, network address translation.
Hieronder volg je één verbinding van je laptop naar een server, en daarna wat er gebeurt als het internet zelf aanklopt. Alle adressen in de voorbeelden zijn documentatie-adressen: 203.0.113.7 is dus niet echt iemands router.
20 apparaten · 20 privéadressen · 1 publiek adres: 203.0.113.7
privéadressen worden op het internet niet gerouteerd
Twintig apparaten, één adres
Binnen je netwerk krijgt elk apparaat een adres uit een van de drie privéreeksen uit RFC 1918: 10.0.0.0/8, 172.16.0.0/12 of 192.168.0.0/16. Die reeksen mag iedereen gebruiken, en daarom worden ze op het internet niet gerouteerd. Miljoenen huishoudens hebben een laptop op 192.168.1.10, en dat botst nergens.
Naar buiten heeft je router maar één publiek adres, hier 203.0.113.7. De vraag is hoe twintig apparaten zich achter dat ene adres kunnen verstoppen.
Een pakketje vertrekt
Je laptop opent een HTTPS-verbinding naar 198.51.100.20 op poort 443. Het besturingssysteem kiest zelf een willekeurige bronpoort, hier 51000. Het eerste TCP-pakket (de SYN) heeft dus als afzender 192.168.1.10:51000.
Binnenshuis is dat prima, maar naar dat afzenderadres kan de server nooit een antwoord terugsturen.
De router schrijft het adres om
Bij de router gebeurt het eigenlijke werk. Hij vervangt het bronadres door zijn eigen publieke adres, en meestal ook de bronpoort: 192.168.1.10:51000 wordt 203.0.113.7:40001. Omdat het IP-adres verandert, rekent hij ook de checksums van de IP- en TCP-header opnieuw uit.
Tegelijk schrijft hij een regel in zijn NAT-tabel: intern 192.168.1.10:51000 hoort bij extern poort 40001. Op Linux-routers heet die tabel de connection tracking-tabel; je kunt hem bekijken met conntrack -L.
Het antwoord komt terug
De server ziet alleen 203.0.113.7 en stuurt zijn antwoord daarheen, naar poort 40001. De router zoekt die poort op in de tabel, vindt de regel en schrijft het bestemmingsadres terug naar 192.168.1.10:51000. Je laptop merkt er niets van.
Poorten als huisnummers
Nu maken twee apparaten tegelijk verbinding. Stel dat je telefoon toevallig ook bronpoort 51000 kiest. Van buiten zouden beide verbindingen er dan precies hetzelfde uitzien. De router lost dat op door elke verbinding een eigen externe poort te geven: 40001 voor de laptop, 40002 voor de telefoon.
Deze vorm heet voluit NAPT (network address and port translation), of in routermenu's vaak masquerading. Een poortnummer is 16 bits, dus per publiek adres en per protocol zijn er 65.535 bruikbare poorten. Voor een huishouden is dat ruim voldoende.
Ongevraagd bezoek
Nu andersom: iemand op het internet stuurt uit zichzelf een pakketje naar 203.0.113.7, poort 22. De router kijkt in zijn tabel en vindt niets. Er is geen regel, dus hij weet niet voor welk apparaat het bedoeld is, en gooit het weg.
Zo werkt NAT in de praktijk ook als een grove firewall, al is het daar nooit voor ontworpen: van buitenaf kun je alleen verbinding maken als iemand binnen eerst de deur heeft opengezet.
Port forwarding: een vaste regel
Wil je dat je NAS vanaf buiten bereikbaar is, dan zet je zelf een regel in de tabel die niet verloopt: alles wat binnenkomt op poort 443 gaat naar 192.168.1.20:443. Dat is port forwarding. De router schrijft dan het bestemmingsadres om, net als bij een antwoord.
Veel routers doen dit ook automatisch via UPnP, als een spelcomputer of app erom vraagt. Handig, tot je wilt weten welke poorten er eigenlijk openstaan.
IPv4 is op, dus nog een laag NAT
IPv4-adressen zijn 32 bits: 2³² is ruim 4,29 miljard adressen, en dat is te weinig. Op 3 februari 2011 deelde IANA de laatste vijf /8-blokken uit, één aan elk regionaal register. RIPE NCC, dat Europa bedient, deed op 25 november 2019 zijn laatste /22-toewijzing uit de vrije voorraad.
Providers die nieuwe klanten geen eigen publiek adres meer kunnen geven, zetten daarom een tweede NAT-laag in hun eigen netwerk: CGNAT (carrier-grade NAT). Je router krijgt dan een adres uit 100.64.0.0/10, een reeks die RFC 6598 speciaal hiervoor reserveerde. Pas bij de provider wordt het vertaald naar een publiek adres, dat je deelt met andere klanten. Port forwarding op je eigen router helpt dan niet meer: de tabel die ertoe doet, staat bij de provider.
IPv6: geen vertaling meer nodig
IPv6 heeft 128-bits adressen. Een thuisaansluiting krijgt meestal een heel prefix, en elk apparaat een eigen globaal adres. Er valt niets te vertalen: het pakketje verlaat je huis met hetzelfde adres waarmee het vertrok.
Dat betekent niet dat alles openstaat. Je router houdt een stateful firewall bij met dezelfde logica als de NAT-tabel: uitgaande verbindingen worden onthouden en antwoorden mogen terug, ongevraagd verkeer van buiten niet. Speel er zelf mee: open verbindingen, stuur een inkomend pakket, zet een port forward aan en wissel tussen IPv4 en IPv6.
Zelf proberen
Vergelijk het adres dat je apparaat zelf heeft met het adres waarmee de buitenwereld je ziet:
# het adres van je laptop in het lokale netwerk
ipconfig getifaddr en0 # macOS
ip -4 addr show # Linux
# het adres waarmee servers je zien
curl -4 ifconfig.me
curl -6 ifconfig.me
Het eerste is vrijwel zeker een privéadres, het tweede je publieke adres. Geeft curl -6 een antwoord, dan heb je werkende IPv6 en zie je het globale adres van je eigen apparaat, zonder vertaling.
Zit je achter CGNAT?
Log in op je router en zoek het WAN-adres op. Begint dat met 100.64 tot en met 100.127, of is het een ander privéadres terwijl curl -4 ifconfig.me iets heel anders laat zien, dan zit er nog een NAT-laag tussen jou en het internet. Een traceroute naar een willekeurige server laat dan vaak ook een hop met een 100.64.x.x-adres zien. Bij mobiel internet is dit meestal de normale situatie.
Port forwarding werkt in dat geval niet. Wil je toch iets thuis bereikbaar maken, dan zijn er een paar routes: je provider vragen om een eigen publiek IPv4-adres, IPv6 gebruiken, of een tunnel naar buiten opzetten, bijvoorbeeld met WireGuard of Cloudflare Tunnel.
Hoe ver is IPv6?
Op 28 maart 2026 bereikte volgens Google voor het eerst meer dan de helft van de gebruikers Google via IPv6: 50,1 procent. Nederland loopt achter. SIDN meldde medio 2025 dat Google hier 36 procent IPv6 meet, tegenover 68 procent in België, 74 procent in Duitsland en 85 procent in Frankrijk. Mijn vermoeden: zolang NAT goed genoeg werkt, merkt de klant niets en heeft een provider weinig haast.
Tot slot
Ik vind NAT een van de mooiste noodgrepen van het internet. Het was nooit bedoeld als blijvende oplossing, maar sinds RFC 1631 uit 1994 houdt het IPv4 al ruim dertig jaar overeind. De keerzijde merk ik bij elk homelab-project: zodra ik iets van buiten wil bereiken, loop ik tegen die ene tabel in mijn router aan.