(Im Folgenden werde ich alle DNS-Lookups oder Layer-2-Aktionen ignorieren, da dies nicht der relevante Teil für die NAT-Story ist.)
Jede TCP-Verbindung besteht aus vier Teilen:
<source IP> <source port> <destination IP> <destination port>
Kurz gesagt: Die Ziel-IP wird verwendet, um das Paket an den richtigen Computer zu senden. Der Zielport wird verwendet, um das Paket auf diesem Computer an das richtige Programm / die richtige Sitzung zu senden. Die Quell-IP wird verwendet, um zu wissen, wohin Antworten gesendet werden sollen. Gleiches gilt für den Quellport. Wenn eine Antwort gesendet wird, werden Quelle und Ziel einfach ausgetauscht.
Beginnen wir mit zwei Computern ohne NAT:
- Der Computer hat IP
1.1.1.1
- Der Webserver hat IP
3.3.3.3
- Der Standardport für HTTP ist
80
Wenn ein Computer nach einer Webseite fragt, wählt er zuerst eine zufällige nicht verwendete Portnummer aus dem zufälligen Bereich (1024-65535) aus. Lass uns auswählen 2345
. Dann wird die folgende Sequenz ausgeführt: Der Computer sendet sein Paket mit: Quell-IP 1.1.1.1
, Quell-Port 2345
, Ziel-IP 3.3.3.3
, Ziel-Port 80
. Die Pakete kommen auf dem Webserver an, er sieht seine eigene IP und seinen eigenen Port 80
, sodass er weiß, dass dies eine Anfrage für eine Webseite ist. Der Webserver sendet die Webseite dann in Paketen mit Quell-IP 3.3.3.3
, Quell-Port 80, Ziel-IP 1.1.1.1
, Ziel-Port zurück 2345
. Der Computer empfängt diese Pakete und weiß aufgrund der Portnummer, welche Webseite angefordert wurde 2345
.
Diese Portkombinationen werden häufig als solche geschrieben: 1.1.1.1:2345
und 3.3.3.3:80
.
Jetzt ist die Anzahl der Computer im Internet weitaus größer als die Anzahl der verfügbaren IPv4-Adressen. Um den Adressraum zu erhalten, wurde eine Reihe privater Adressbereiche eingeführt, die frei für die gemeinsame Nutzung von Adressen verwendet werden können. Diese Rangese werden als RFC1918 bezeichnet und sind die folgenden:
- 192.168.0.0 - 192.168.255.255
- 172.16.0.0 - 172.31.255.255
- 10.0.0.0 - 10.255.255.255
Diese Adressen befinden sich nirgends in den Internet-Routing-Tabellen. Wenn Sie also ein Paket mit einem Ziel in diesen Bereichen im Backbone des Internets senden, werden sie einfach verworfen. Dies liegt daran, dass Millionen von Menschen dieselben Adressen verwenden. Diese Adressen müssen in etwas Nützliches für das Internet übersetzt werden. Hier kommt die Netzwerkadressübersetzung ins Spiel:
Wir haben zwei Computer:
- A:
192.168.0.1
und B:192.168.0.2
- Ihr Gateway hat eine öffentliche IP von
1.1.1.1
.
- Wir behalten den gleichen Webserver.
- Beide Computer möchten dieselbe Webseite vom selben Server.
Zuerst wählen beide Computer einen zufälligen Port aus: Sagen wir: 192.168.0.1:2345
und 192.168.0.2:5432
.
Computer A sendet sein Paket mit Quelle 192.168.0.1:2345
und Ziel 3.3.3.3:80
. Das Gateway übersetzt dieses Paket in das 1.1.1.1:2345
Quellziel 3.3.3.3:80
und merkt sich, dass alle Antworten auf diese Kombination an gesendet werden 192.168.0.1
. Wenn eine Antwort mit Quelle 3.3.3.3:80
und Ziel eingeht 1.1.1.1:2345
, übersetzt sie in Quelle 3.3.3.3:80
und Ziel 192.168.0.1:2345
und sendet das Paket weiter.
Computer B sendet sein Paket mit Quelle 192.168.0.2:5432
und Ziel 3.3.3.3:80
. Das Gateway übersetzt dieses Paket in das 1.1.1.1:5432
Quellziel 3.3.3.3:80
und merkt sich, dass alle Antworten auf diese Kombination an gesendet werden 192.168.0.2
. Wenn eine Antwort mit Quelle 3.3.3.3:80
und Ziel eingeht 1.1.1.1:5432
, übersetzt sie in Quelle 3.3.3.3:80
und Ziel 192.168.0.2:5432
und sendet das Paket weiter.
Wenn beide Computer zufällig dieselbe Quellportnummer auswählen, wählt das Gateway einfach eine andere freie zufällige Quellportnummer aus und denkt daran, auch die Portnummer zu übersetzen. Dies wird manchmal als PAT (Port Address Translation) bezeichnet. Dies ist im Grunde eine Teilmenge von NAT.
Hierfür gibt es mehrere Implementierungen. Das Gateway erinnert sich möglicherweise nur an "Computer X hat den Quellport Y verwendet" und leitet alles mit Port Y an Computer X weiter. Es erinnert sich möglicherweise daran, dass Computer X den Quellport Y und das Ziel Z verwendet hat und leitet nur etwas von Port Z an Port Y zurück an Computer X. Oder es gibt die Option, dass das gesamte Tupel gespeichert wird und nur Datenverkehr an Computer X gesendet wird, der der gesamten Quell- / Ziel-IP und dem gesamten Port entspricht.