Wie reagiert ein Internetserver auf eine Anfrage von einer privaten IP?

271
Ofek Shilon

Ich lerne über private / öffentliche IPs, Portweiterleitung und NAT und sehe immer noch keine Antwort auf eine einfache Frage:

Angenommen, zwei Benutzer in demselben Netzwerk kommunizieren mit einem einzigen Server außerhalb ihres Netzwerks (z. B. senden meine Frau und ich meine http-Anfragen an yahoo.com). Der Server sieht beide Benutzer als eine einzige öffentliche IP-Adresse an und kommuniziert häufig - wie in diesem Fall - am selben Port. Wie routet der Router die Pakete gemäß den zwei verschiedenen Verbindungen? Befinden sich innerhalb des Pakets Routing-Informationen außerhalb von ip / port? Gibt es irgendwo einen 'Sitzungstisch'? Von wem und was genau beinhaltet es?

0
Im Router befindet sich eine [NAT-Tabelle] (http://www.firewall.cx/networking-topics/network-address-translation-nat/228-nat-table.html) SpiderPig vor 6 Jahren 0

1 Antwort auf die Frage

2
grawity

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:80lokalen 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 -noder 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 -Loder cat /proc/net/nf_conntrackdiese Tabelle anzeigen würde. Versuchen Sie es unter OpenBSD oder pfSense pfctl -s state.)

Vielen Dank. Sind 52909 und 39163 in Ihren Beispiel-Ports oder etwas anderes? Wenn dies Ports sind, die für http verwendet werden, wie kommt es, dass sie nicht 80 sind? Wie werden Konflikte vermieden? (Oder: Was passiert, wenn beide Ports 40000 sind?) Ofek Shilon vor 6 Jahren 0
@OfekShilon: Sie sind Beispiel-Ports. Beachten Sie, dass TCP und UDP zwei Ports (Quelle und Ziel) verwenden. So unterscheidet ein einzelner Computer zwischen mehreren Verbindungen zu demselben Yahoo-Server. Der _destination_-Port ist "bekannt" (80 für HTTP), der Quellport wird jedoch normalerweise vom Betriebssystem zufällig ausgewählt, wodurch sichergestellt wird, dass die Kombination src + dest eindeutig ist. Wenn zwei Computer versuchen, dieselbe Portkombination zu verwenden, schreibt Ihr NAT-Router schließlich auch die in Konflikt stehenden Ports neu. (Es wird oft genauer als NAPT bezeichnet.) grawity vor 6 Jahren 1