# Network address translation

Network address translation (NAT, ook wel network masquerading of IP-masquerading) is een verzamelnaam voor technieken die gebruikt worden in computernetwerken waarbij de adresinformatie in de datapakketjes veranderd wordt. Zodoende kunnen verschillende netwerken aan elkaar worden verbonden. De techniek wordt hoofdzakelijk in routers ingezet.
Technisch worden IP-adressen veranderd in de header van een IP-bericht dat een router passeert. Vaak wordt ook het TCP/UDP-poortnummer veranderd, opdat men kan bijhouden welke veranderingen hebben plaatsgevonden. Een veel voorkomende toepassing is het toelaten van meerdere gebruikers van een thuisnetwerk tot het internet via één IP-adres.

## Doelstelling

Network address translation zorgt ervoor dat verschillende computers op een LAN gebruik kunnen maken van dezelfde internetverbinding en daarmee hetzelfde internetadres, zonder hun interne netwerkadres te hoeven publiceren. De aangesloten computers mogen dan een adres hebben in een van de gereserveerde adresreeksen die IPv4 ter beschikking stelt voor privé-netwerken, wat op het internet niet is toegestaan.
Dit heeft een aantal voordelen:
* Computers op het lokale net zijn niet bereikbaar vanaf het internet, aangezien het interne adres niet bekend wordt gemaakt.
* Verkeer vanaf verschillende computers op het lokale net kan (extern) niet van elkaar worden onderscheiden zonder deep packet inspection.
* Doordat meerdere computers een openbaar IP-adres delen, wordt de schaarste aan IPv4-adressen enigszins getemperd.

## Indeling
### Functionaliteit
#### Network address port translation

Alle computers op het lokale computernetwerk, inclusief de router, hebben een uniek lokaal IP-adres en een lokale poort. De router beschikt over minimaal één mondiaal IP-adres. Optioneel kunnen dit er meerdere zijn, zodat het mogelijk is dat er verschillende computers tegelijk bronnen op het internet/mondiale netwerk raadplegen. Er zijn echter vaak meer computers op het lokale netwerk dan er mondiale IP-adressen zijn voorzien voor de router. Om dus nog meer connecties mogelijk te maken, is het vereist dat men gebruikmaakt van network address port translation, of kortweg NAPT.
NAPT biedt een uitbreiding op address translation door in meerdere verbindingen te voorzien voor een mondiaal adres. Wanneer alle mondiale IP-adressen opgebruikt zijn zal de NAPT-driver aan port-mapping doen. De poorten in het TCP- en UDP-protocol zijn allebei 16 bits lang, waardoor er twee keer 65.535 verbindingen mogelijk zijn (poort 0 is gereserveerd voor TCP en UDP).

##### Dynamic mapping

Dynamic mapping is hierboven beschreven en wordt dus gedefinieerd met het opzetten van een verbinding op het lokale netwerk van een computer. Wanneer dit gebeurt, zal de NAT-router een 5-voudige entry maken in zijn tabel: (protocol (TCP/UDP), bron-adres, bronpoort, bestemmingsadres, bestemmingspoort). Het aantal verbindingen wordt beperkt door 16bits-poorten van de TCP/UDP-protocollen en de hardware-beperkingen van de router. Hierdoor zullen er regelmatig verbindingen verwijderd worden uit de NAT-tabel. Dit wordt vaak door de netwerkbeheerder gespecificeerd.

##### Static mapping

Dynamic mapping voldoet zolang de verbinding wordt opgesteld door een computer van het lokale netwerk. Wanneer een computer vanuit het mondiale netwerk een verbinding probeert te openen zal de NAT-driver kijken in zijn tabel. Maar aangezien er geen verbinding opengesteld is, zal de aanvraag van die computer geweigerd worden.
Wanneer het echter noodzakelijk is dat een computer vanaf een mondiaal adres een verbinding kan maken zal men aan static mapping doen. Dit houdt in dat een netwerkbeheerder een poort zal openstellen voor inkomende verbindingen zonder dat deze zich al in de NAT-tabel hoeven te bevinden. Vanwege het grote aantal mogelijke combinaties is het nut hiervan echter beperkt. In tegenstelling tot dynamic mapping blijft een verbinding bestaan totdat de netwerkbeheerder deze verwijdert.
Bij beide methoden is het nodig dat de NAT-driver de TCP- of UDP-checksums controleert en opnieuw aanpast.

#### Basic NAT

Wanneer een computer ergens ter wereld verbinding wil maken met een computer op het lokale netwerk, is er nog een alternatief voor NAPT, namelijk het direct koppelen van een lokaal IP aan een mondiaal IP: basic NAT (BNAT) genaamd of soms kortweg address translation. Er is dus meer sprake van een open verbinding tussen het privaat netwerk en het internet voor deze computer.
BNAT is eigenlijk alleen maar nuttig (tenzij de gebruiker niet zonder de extra voordelen van NAT kan) wanneer de gebruiker over meerdere mondiale IP-adressen beschikt. Indien er meer gebruikers zijn op het netwerk dan IP-adressen is het niet mogelijk dat alle gebruikers een verbinding met het externe netwerk kunnen maken. Het is dan ook aan te raden om NAPT te verkiezen boven BNAT aangezien de eerste over meer unieke combinaties beschikt doordat er ook gebruikgemaakt wordt van de UDP/TCP-poorten. Daarentegen is BNAT nuttig voor protocollen die niet steeds gebruikmaken van dezelfde TCP/UDP-poorten of er zelfs helemaal geen gebruik van maken.
Wanneer een computer van het lokale netwerk, waaraan een address translation verbonden is, verbinding wil maken met een computer van het mondiaal netwerk, dan zal er geen gebruik gemaakt worden van NAPT.
De inhoud van een BNAT-tabel bestaat uit twee adressen: lokaal adres en mondiaal adres.
Dynamic en static mapping zijn strikter dan BNAT omdat er bij de beide mappingmethodes voldaan moet worden aan 5 onderdelen uit de NAT-tabel terwijl dit er bij BNAT maar 2 zijn.
Aan deze methoden is echter wel een beperking verbonden: het netwerk mag maar één NAT-router hebben die het eindpunt vormt voor het netwerk; meer specifiek: er mag slechts één enkele NAT-tabel aanwezig zijn. Dus als er gebruikgemaakt wordt van meerdere routers dan moet er een methode voorzien worden waardoor deze hun NAT-tabellen kunnen synchroniseren. Is dit niet het geval dan zou, wanneer een van de routers niet meer bereikbaar is, de adressering verloren gaan. Als gevolg zouden de externe gebruikers niet meer kunnen communiceren met de interne gebruikers die voordien een verbinding hadden opgezet met de router die inmiddels niet meer bereikbaar is.

### Richting

Bij source NAT wordt het bronadres aangepast (d.i. het IPv4-adres en/of de TCP/UDP-poort). De gebruiker verandert hier met andere woorden waar het pakket vandaan komt. Tenminste, zo lijkt het voor de andere netwerken. Source NAT wordt dus gebruikt voor uitgaande pakketten.
In het geval van destination NAT wordt het bestemmingsadres aangepast. Dit type wordt gebruikt voor binnenkomende pakketten. Destination NAT wordt gedaan zodra het pakket het netwerk binnenkomt; voor de routing dus.

### Voorbeeld

De functionaliteit van een NAT-router wordt hier beschreven aan de hand van een kort voorbeeld. Er is een beperkt aantal lokale computers die verbonden zijn met een NAT-router, die op zijn beurt weer verbonden is met het internet. Deze lokale computers en router beschikken over een lokaal IP-adres dat niet zichtbaar is voor de buitenwereld. Dit is in het voorbeeld van een thuisnetwerk vaak een klasse-C-adres dat begint met 192.168. Wanneer een van deze lokale computers verbinding probeert te maken zal de NAT-router het lokale adres vertalen naar het mondiale adres. Het TCP/UDP-nummer wordt hier dan ook vaak gewijzigd maar dit hoeft niet expliciet. We spreken hier over address translation, er is nog geen port translation ter sprake gekomen.
| Voor NAT | Na NAT |
| Protocol: TCP | Protocol: TCP |
| bronadres: 192.168.1.10 | bronadres: 87.54.38.19 |
| bronpoort: 3312 | bronpoort: 3312 |
| bestemmingsadres: 54.38.42.1 | bestemmingsadres: 54.38.42.1 |
| bestemmingspoort: 21 | bestemmingspoort: 21 |
Als er nog een verbinding wordt opgezet (van een andere broncomputer of naar een andere doelcomputer) dan zal er een nieuwe regel worden toegevoegd aan de tabel van de NAT-router. Indien er nog een mondiaal adres beschikbaar is, zal dit worden gebruikt. Zo niet dan wordt er gebruikgemaakt van port translation. In dit voorbeeld hebben we slechts één mondiaal IP-adres en moet er dus gebruikgemaakt worden van port translation.
| Voor NAT | Na NAT |
| Protocol: TCP | Protocol: TCP |
| bronadres: 192.168.1.11 | bronadres: 87.54.38.19 |
| bronpoort: 3312 | bronpoort: 5001 |
| bestemmingsadres: 131.38.42.1 | bestemmingsadres: 131.38.42.1 |
| bestemmingspoort: 80 | bestemmingspoort: 80 |

## Voordelen
### Administratieve voordelen

NAT heeft een aantal voordelen buiten het omzetten van IP-adressen. Het geeft de mogelijkheid om een groot netwerk op te delen in meerdere, kleinere netwerken. Door het netwerk op te delen kan men veranderingen doorvoeren aan het netwerk zonder daarmee de rest van het netwerk in gevaar te brengen. NAT vereenvoudigt het management van het netwerk, omdat het opgedeeld kan worden in logische en functionele eenheden.
Vele NAT-klare routers bieden de mogelijkheid tot extra opties zoals:
* filteren van netwerkverkeer
* loggen van netwerkverkeer

### Firewall

NAT voorziet in een basis firewallfunctionaliteit, er kunnen alleen maar pakketten binnenkomen als een gebruiker van een netwerk dit eerst aangevraagd heeft, er zijn dus in principe alleen maar antwoorden mogelijk. Een uitzondering is natuurlijk IP reservation waarbij een bepaald IP wordt opengezet voor alle binnenkomende pakketten. De firewallfunctionaliteit heeft zijn beperkingen, zo is het bijvoorbeeld niet mogelijk om van de uitgaande pakketten te controleren deze van het eigen netwerk afkomstig zijn of niet. Bovendien biedt NAT-bescherming tegen low-level-aanvallen zoals een SYN flood of ping-of-death.

## Nadelen

* Het beperkt de end-to-end-connectiviteit die zo centraal staat in de gehele internetfilosofie. Er is dan ook een aantal protocollen waarmee NAT niet goed samenwerkt.
* Het heeft de acceptatie en noodzaak van IPv6 vertraagd, wat een betere oplossing is voor de huidige problemen.
* Incompatibiliteit met een aantal protocollen kan ervoor zorgen dat deze niet meer correct functioneren.
* Afscherming van het lokale netwerk van het mondiale netwerk; dit kan uiteraard ook als een voordeel beschouwd worden.
* De firewallfunctionaliteit kan misbruikt worden: als er een gebruiker in het lokale deel van de NAT-router een aanval doet op een externe gebruiker zal het ook moeilijker zijn om te achterhalen welke gebruiker dit is omdat het IP-adres verborgen wordt door de router.
* Intensief voor de computatieve capaciteiten van de router aangezien er checksums aangepast moeten worden per datapakket.
* NAT heeft echter ook een aantal beveiligingsproblemen, omdat TCP-headers niet gecodeerd mogen worden zodat de NAT-router zijn functionaliteit kan behouden.

## Problemen met protocollen

NAT vertaalt dus de IP-adressen en UDP-/TCP-poortnummers van een privaat netwerk naar die van het mondiale netwerk. Een probleem ontstaat wanneer informatie uit deze velden ook wordt opgenomen in de data van een ander protocol, vaak boven de netwerklaag. Meestal moet er ook rekening worden gehouden met de controlesom van een protocol. Doordat het IP-adres en/of de TCP-/UDP-poortnummers worden aangepast is het noodzakelijk dat de controlesom opnieuw berekend wordt. Dit komt voor bij het TCP- en UDP-protocol. Al deze berekeningen zorgen ervoor dat NAT computatief intensief is.
NAT is protocol-onafhankelijk ontworpen en biedt dus ook geen oplossing voor dit probleem. Om dit probleem toch te kunnen verwerpen, wordt er gebruikgemaakt van application layer gateways (ALG). De payload van zo'n protocol mag dan ook niet gecodeerd worden tenzij de ALG beschikt over de decoderingsleutel.

## ICS

Internet Connection Sharing (ICS) is een protocol dat netwerkvertaling doet en daardoor vergelijkbaar is met NAT. ICS wordt typisch gebruikt op een Windows XP-workstation of op een Windows Server 2003-server. Vanwege de gedeelde functionaliteit is het niet mogelijk dat ICS en NAT samen op hetzelfde netwerk bestaan. ICS is simpeler in installatie maar ook beperkter in mogelijkheden en wordt daarom meer in thuisnetwerken gebruikt om een kleine groepering computers internettoegang te verschaffen.