Innerhalb eines Computers zwischen Prozessen
Lassen Sie uns zunächst sehen, wie ein einzelner Computer zwischen gleichzeitigen Verbindungen unterscheidet.
Die meisten Transportprotokolle wie TCP, UDP und SCTP verwenden zwei Ports, Quelle und Ziel, dh einen an beiden Enden der Verbindung. Das heißt, Pakete gehen nicht einfach "durch" einen Port; Stattdessen fahren sie von Hafen X nach Hafen Y.
Der Zielport ist in der Regel bekannt (80 für HTTP, 53 für DNS ...), der Quellport wird jedoch normalerweise vom Betriebssystem selbst zufällig ausgewählt. Dadurch wird auch sichergestellt, dass die Kombination src / dst eindeutig ist.
Wenn Ihr Browser also mehrere Verbindungen "zum Yahoo-Port 80" herstellt, haben alle tatsächlich unterschiedliche Quellports, und das Betriebssystem führt eine Socket-Tabelle wie:
PROCESS PROTO LOCAL REMOTE STATE 9894/firefox tcp 192.168.6.175:39163 google.server:80 established 9894/firefox tcp 192.168.6.175:52909 yahoo.server:80 established 17463/chrome tcp 192.168.6.175:64981 yahoo.server:80 established 9894/firefox udp 192.168.6.175:4984 8.8.8.8:53 --
Wenn das Betriebssystem also ein TCP-Paket vom yahoo.server:80
lokalen Port 52909 empfängt, kann es der spezifischen Verbindung von Firefox zugeordnet werden.
Wichtig zu beachten, dass dies nichts mit NAT zu tun hat, noch, und geschieht auf die gleiche Weise, auch wenn Sie direkt verbunden ist. (NAT macht davon Gebrauch.)
(Sie können diese Tabelle mit netstat -n
oder mit verschiedenen grafischen Werkzeugen unter Windows anzeigen. Oft werden "local / remote" als "Quelle / Ziel" bezeichnet, obwohl dies nicht ganz genau ist.)
Innerhalb eines NAT-Netzwerks zwischen Computern
Die Antwort auf Ihre Frage zu NAT ist sehr ähnlich, es wird nur alles in größerem Maßstab durchgeführt.
Der Router, der NAT ausführt, führt eine "Status" -Tabelle, die sowohl die internen als auch die externen Adressen und Ports enthält. Wenn Ihre beiden HTTP-Anforderungen beispielsweise separate TCP-Verbindungen verwendeten, werden sie möglicherweise wie folgt verfolgt:
PROTO ORIG-SRC ORIG-DST REPLY-SRC REPLY-DST 6/tcp 192.168.6.42:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:52909 6/tcp 192.168.6.175:39163 yahoo.server:80 yahoo.server:80 your.public.ip.addr:39163 6/tcp 192.168.6.175:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:28330 17/udp 192.168.6.175:4984 8.8.8.8:53 8.8.8.8:53 your.public.ip.addr:4984
Wenn der Router ein Paket von REPLY-SRC (Yahoo) empfängt, das an REPLY-DST (Ihre öffentliche IP-Adresse) adressiert ist, weiß er, dass das reale Ziel aus der Spalte ORIG-SRC entnommen werden muss, um den NAT rückgängig zu machen.
(Wenn kein Übereinstimmungsstatus vorhanden ist, werden manuell konfigurierte Regeln für die Portweiterleitung verarbeitet. Wenn noch keine übereinstimmen, war das Paket wirklich für den Router selbst gedacht.)
Beachten Sie, wie die Statustabelle enthält Adressen und Ports, sodass mehrere Verbindungen zu demselben Server durch die Portkombination unterschieden werden können. In meinem Beispiel haben zwei Computer versehentlich dieselbe Portkombination verwendet, daher wurden die Ports der 2. Verbindung ebenfalls übersetzt.
(In der Tat sehen einige NATs aus nur den Port und ignorieren die Quelladresse vollständig; dies verringert die Anzahl möglicher Verbindungen, macht es jedoch für Peer-to-Peer-Programme wesentlich einfacher, "NAT-Lochen" durchzuführen.)
Dieser Status wird auch für verbindungslose Protokolle wie UDP oder ICMP beibehalten, so dass die Einträge nach einem bestimmten Inaktivitätsintervall ablaufen, obwohl es kein explizites "Close Connection" -Paket gibt. (Die Statustabelle ist eigentlich Teil der Firewall. Selbst wenn NAT nicht ausgeführt wird, kann der Router sie dennoch verwenden, um zwischen "aktiven" Verbindungen und verirrten Paketen zu unterscheiden.)
(Wenn Ihr Router auf Linux basiert conntrack -L
oder cat /proc/net/nf_conntrack
diese Tabelle anzeigen würde. Versuchen Sie es unter OpenBSD oder pfSense pfctl -s state
.)