Geschreven door Remco Kersten, 04-04-2022

Categorie: CCNA

Wat is NAT?

NAT staat voor Network Address Translation. De naam zegt het al: een IP adres wordt omgezet naar een ander IP adres. Dit gebeurt door het source of destination address (afhankelijk van het type NAT) in de IP header van een IP pakket aan te passen.

De meeste netwerken gebruiken intern een private IP range (bijvoorbeeld 192.168.0.x). Deze private IP range’s zijn nodig omdat er simpelweg niet genoeg IPv4 adressen beschikbaar zijn om ieder apparaat op de wereld een uniek IP adres te geven. Met IPv6 kan dit echter wel.

Door het tekortkomen aan IPv4 adressen krijgen we op een aansluiting met een ISP vaak slecht 1 of enkele IP adressen toegewezen. Echter hebben we vaak meer dan 1 apparaat in huis welke verbinding wilt maken met het internet. Daarom kiezen we ervoor om interne apparaten een private IP adres toe te kennen, en IP pakketten naar de ISP toe te vertalen naar een toegewezen publieke IP adres.

In onderstaand voorbeeld probeert 192.168.0.1 te pingen naar 213.23.90.12. De interne router (R1) zet het interne IP adres om in een IP adres verkregen van de provider, in dit geval 140.90.21.1. Het IP pakket kan nu naar de ISP worden verzonden. De server antwoordt op de ping en stuurt deze terug naar R1. R1 ontvangt het IP pakket, kijkt in zijn NAT Table en herkent dat dit pakketje voor 192.168.0.1 is. R1 past de destination aan naar 192.168.0.1 en stuurt het over het LAN netwerk weer terug naar de interne host.

NAT voorbeeld 1

NAT configureren op Cisco devices

NAT kan, afhankelijk van de eisen en het aantal toegewezen IP adressen, op 3 manieren worden ingesteld:

Soorten vertalingen / IP adressen hebben eigen benamingen, zie onderstaande tabel

Term Voorbeeld IP Omschrijving
Inside local 192.168.0.1 Het LAN netwerk. Met inside wordt bedoeld dat het gedeelte in eigen beheer is, en local geeft aan dat het op het LAN netwerk is.
Inside global 140.90.21.1 IP adres verkregen bij ISP. Met inside wordt bedoeld dat het gedeelte in eigen beheer is, en global geeft aan dat het gebruikt kan worden op internet
Outside global 213.23.90.12 Destination IP adres. Outside geeft aan dat het gedeelte niet in eigen beheer is, en het IP adres gebruikt kan worden op het internet.
Outside local 213.23.90.12 Wordt niet gebruikt met inside NAT translations

Static NAT

NAT netwerk voorbeeld Static

Static NAT is het statisch instellen van interne IP adressen naar publieke IP adressen. Hiermee geven we dus aan dat een bepaald inside local IP adres altijd wordt vertaald naar een bepaald outside global IP adres.

Stel, we hebben in bovenstaand netwerk van de ISP de range 140.90.21.0 gekregen. We zouden er voor kunnen kiezen om 192.168.0.1 altijd te vertalen naar 140.90.21.100. Dit stellen we in met commando ip nat inside source static intern-ip-adres extern-ip-adres

Alvorens dit te doen, moeten we de router aangeven welke poort op het interne netwerk zit, en welke op het externe netwerk. Dit geven we onder interface config aan met commando ip nat inside|outside.

R1(config)#int g0/0
R1(config-if)#ip nat inside
R1(config-if)#int g0/1
R1(config-if)#ip nat outside
R1(config-if)#exit
R1(config)#ip nat inside source static 192.168.0.1 140.90.21.100
R1(config)#end
R1#show ip nat translations
Pro Inside global      Inside local       Outside local      Outside global
--- 140.90.21.100      192.168.0.1        ---                ---

Met show ip nat translations zien we dus dat 192.168.0.1 wordt vertaald naar 140.90.21.100

Als we een packet capture uitvoeren op een ping van 192.168.0.1 naar 140.90.21.100 zien we dit ook terug:

IP packet capture static NAT intern

IP packet capture static NAT extern

Dynamic NAT

Dynamic NAT werkt hetzelfde als static NAT. Het enige verschil is dat we hier niet per inside local IP adres een inside global IP adres configureren, maar een range opgeven aan inside local en inside global adressen.

Op het moment dat een inside local IP pakket naar het internet gaat, wordt deze door de router tijdelijk vertaald naar een IP adres uit een pool met inside global IP adressen.

Configuratie verloopt op de volgende manier:

  1. Per interface geven we aan of deze inside of outside is
  2. We maken een standaard access list, waarin we een permit statement maken voor inside local IP adressen die vertaald moeten worden.
    access-list x permit netwerkID wildcard
  3. We maken een pool aan waarin wordt aangegeven welke inside global IP adressen gebruikt mogen worden.
    ip nat pool name eerste-IP-adres laatste-IP-adres netmask subnetmask
  4. We configureren inside NAT
    ip nat inside source list listnummer pool poolnaam

In dit voorbeeld hebben we IP adressen 140.90.21.0 t/m 140.90.21.10 toegewezen gekregen. 1490.90.21.1 is al in gebruik door R1, dus we gaan 140.90.21.2 t/m 140.90.21.10 gebruiken als pool.

R1(config)#int g0/0
R1(config-if)#ip nat inside
R1(config-if)#int g0/1
R1(config-if)#ip nat outside
R1(config-if)#access-list 1 permit 192.168.0.0 0.0.0.255
R1(config)#ip nat pool public 140.90.21.2 140.90.21.10 netmask 255.255.255.0
R1(config)#ip nat inside source list 1 pool public
R1(config)#end
R1#show ip nat translations
R1#

Als we na de configuratie in de NAT Table kijken zien we geen entries. Dit omdat er nog geen interne hosts zijn geweest die naar het internet proberen te gaan. Stel we laten host 192.168.0.1 en 192.168.0.2 pingen naar 213.23.90.12, dan ziet de NAT Table er als volgt uit:

R1#show ip nat translations
Pro Inside global      Inside local       Outside local      Outside global
--- 140.90.21.2        192.168.0.1        ---                ---
icmp 140.90.21.3:1     192.168.0.2:1      213.23.90.12:1     213.23.90.12:1
--- 140.90.21.3        192.168.0.2        ---                ---

192.168.0.1 is tijdelijk vertaald naar 140.90.21.2, en 192.168.0.2 is tijdelijk vertaald naar 140.90.21.3.

NAT overload (PAT)

Wat als we maar 1 IP adres hebben gekregen? Dit is tevens ook meestal het geval. In dit geval kunnen we Port Address Translation gebruiken. Als inside global address wordt dan altijd het toegewezen IP adres gekregen (welke ook in gebruik is door de router), en wordt de sourcepoortnummer aangepast om network address translations bij te houden.

In onderstaand voorbeeld probeert 192.168.0.2 naar de webserver (poort 80) van 213.23.90.12 te gaan. Als source adres wordt er door de host een willekeurige uitgaand poort gekozen. Deze uitgaande poort wordt door de router (na eventuele aanpassing indien dezelfde poort als in gebruik is bij een andere host) in de NAT tabel opgeslagen. De webserver stuurt zijn response terug naar R1 met als destinationpoort de sourcepoort van de host. Hierdoor weet de router op zijn beurt weer dat deze bestemd is voor host 192.168.0.2.

Configuratie van overloading NAT verloopt op de volgende manier:

  1. Per interface geven we aan of deze inside of outside is
  2. We maken een standaard access list, waarin we een permit statement maken voor IP adressen die vertaald moeten worden.
    access-list x permit netwerkID wildcard
  3. We configureren inside NAT
    ip nat inside source list listnummer interface interface-outside-poort overload
R1(config)#int g0/0
R1(config-if)#ip nat inside
R1(config-if)#int g0/1
R1(config-if)#ip nat outside
R1(config-if)#access-list 1 permit 192.168.0.0 0.0.0.255
R1(config)#ip nat inside source list 1 interface g0/1 overload
R1(config)#end
R1#show ip nat translations
R1#

Als we na de configuratie in de NAT Table kijken zien we geen entries. Dit omdat er nog geen interne hosts zijn geweest die naar het internet proberen te gaan. Stel we laten host 192.168.0.2 browsen (HTTP, poort 80) naar 213.23.90.12, dan ziet de NAT Table er als volgt uit:

R1#show ip nat translations
Pro Inside global      Inside local       Outside local      Outside global
tcp 140.90.21.1:49682  192.168.0.2:49682  213.23.90.12:80    213.23.90.12:80

Een packet capture tussen de router en de ISP:

IP packet capture PAT extern