
Ich lerne etwas über private/öffentliche IPs, Portweiterleitung und NAT, finde aber immer noch keine Antwort auf eine einfache Frage:
Angenommen, zwei Benutzer im selben Netzwerk kommunizieren mit einem einzigen Server außerhalb ihres Netzwerks (sagen wir, meine Frau und ich senden HTTP-Anfragen an yahoo.com). Der Server sieht beide Benutzer als eine einzige öffentliche IP-Adresse und häufig – wie in diesem Fall – kommunizieren sie über denselben Port. Wie leitet der Router die Pakete entsprechend den beiden unterschiedlichen Verbindungen weiter? Gibt es im Paket Routing-Informationen über IP/Port hinaus? Wird irgendwo eine „Sitzungstabelle“ verwaltet? Von wem und was genau enthält sie?
Antwort1
Innerhalb eines Computers zwischen Prozessen
Sehen wir uns zunächst an, wie eineinzelDer Computer unterscheidet zwischen gleichzeitigen Verbindungen.
Die meisten Transportprotokolle wie TCP, UDP, SCTPverwendenzweiHäfen, Quelle und Ziel– also an jedem Ende der Verbindung. Das heißt, Paketenichteinfach nur „durch“ einen Hafen gehen, sondernausAnschluss XZuAnschluss Y.
DerZielPort ist normalerweise bekannt (80 für HTTP, 53 für DNS…), aber derQuelleDer Port wird normalerweise zufällig vom Betriebssystem selbst ausgewählt, wodurch auch sichergestellt wird, dass die Quelle/Ziel-Kombination eindeutig ist.
Wenn Ihr Browser also mehrere Verbindungen "zu Yahoos Port 80" herstellt, haben alle Verbindungen tatsächlich unterschiedlicheQuellports, und das Betriebssystem führt eine Socket-Tabelle wie die folgende:
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 es der spezifischen Verbindung zuordnen, die von Firefox hergestellt wurde.
Wichtig zu beachten: Dies hat nichts mit NAT zu tunnoch, und geschieht auf die gleiche Weise, auch wenn Sie direkt verbunden sind. (NAT wird es jedoch nutzen.)
(Sie können diese Tabelle mithilfe von netstat -n
oder verschiedenen grafischen Tools unter Windows anzeigen. „Lokal/Remote“ wird häufig als „Quelle/Ziel“ bezeichnet, obwohl dies nicht ganz korrekt ist.)
Innerhalb eines NAT-Netzwerks zwischen Computern
Die Antwort auf Ihre Frage zu NAT ist sehr ähnlich, nur dass alles in einem größeren Maßstab erfolgt.
Der Router, der NAT durchführt, führt eine „Status“-Tabelle, die sowohl die internen als auch die externen Adressen und Ports enthält. Wenn Ihre beiden HTTP-Anfragen beispielsweise separate TCP-Verbindungen verwenden, können sie wie folgt verfolgt werden:
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 dierealUm das NAT rückgängig zu machen, muss das Ziel aus der Spalte ORIG-SRC übernommen werden.
(Wenn kein übereinstimmender Status vorliegt, werden manuell konfigurierte Portweiterleitungsregeln verarbeitet. Wenn immer noch keine Übereinstimmung vorliegt, war das Paket tatsächlich für den Router selbst bestimmt.)
Beachten Sie, dass die Statustabelle enthältAdressenUndHäfen, sodass mehrere Verbindungen zum selben Server anhand der Portkombination unterschieden werden können. In meinem Beispiel verwendeten zwei Computer versehentlich dieselbe Portkombination, sodass auch die Ports der zweiten Verbindung übersetzt wurden.
(Tatsächlich sehen einige NATsnuram Port und ignorieren Sie die Quelladresse vollständig; dies reduziert die Anzahl möglicher Verbindungen, macht es für Peer-to-Peer-Programme jedoch viel einfacher, „NAT Hole Punching“ durchzuführen.)
Dieser Status bleibt sogar bei verbindungslosen Protokollen wie UDP oder ICMP erhalten, sodass die Einträge nach einer gewissen Zeit der Inaktivität verfallen, auch wenn kein explizites „Verbindung schließen“-Paket vorhanden ist. (Die Statustabelle ist eigentlich Teil der Firewall, sodass der Router sie auch dann verwenden kann, wenn kein NAT durchgeführt wird, um zwischen „aktiven“ Verbindungen und Streupaketen zu unterscheiden.)
(Wenn Ihr Router Linux-basiert ist, conntrack -L
würde cat /proc/net/nf_conntrack
diese Tabelle angezeigt werden. Für OpenBSD oder pfSense versuchen Sie pfctl -s state
.)