Wenn ich hier von "normal" schreibe, denke ich an einen durchschnittlichen WLAN-NAT-Router für Endverbraucher mit einer vernünftigen Konfiguration oder an ein einfaches Linux-Netzwerk mit Standardeinstellungen. Dies kann wie üblich so komplex oder kompliziert wie nötig gestaltet werden. Da die Frage sehr einfach ist, scheint dies für mich am sinnvollsten zu sein, anstatt sich für kompliziertere NAT-Lösungen auf Unternehmensebene zu entscheiden.
Sie haben bereits eine Antwort akzeptiert, aber lassen Sie mich versuchen, die von Ihnen gestellte Frage direkt zu beantworten:
Wie entscheidet NAT, welche Verbindungen eingehen und welche ausgehen?
Die Grundlage für die Entscheidung (für jede Entscheidung in einem Router) ist ein Regelwerk in irgendeiner Form oder Weise. In diesem Fall hat der Administrator für jede der beteiligten Schnittstellen (dh die interne LAN-Schnittstelle im Vergleich zur externen WAN / Uplink-Schnittstelle) Regeln implementiert. Diese Regeln sind sehr unterschiedlich, dh die Regeln für eine LAN-Schnittstelle unterscheiden sich erheblich von denen einer WAN-Schnittstelle.
Zu wissen, woher ein Paket kommt und wohin es geht, ist das A und O dessen, was ein Router tut.
Lassen Sie mich mit einem beginnen
Beispiel
Die NAT-Seite von Wikipedia enthält viel Text zu diesem Thema, aber in einem einfachen Fall (ein einfaches Firmen-LAN im Vergleich zu einem einzelnen DSL-Uplink) passiert Folgendes:
- Der Client-PC versucht, eine HTTP-Verbindung zu einem internetbasierten Server herzustellen, z. B. 198.51.100.20. Der PC selbst hat eine nicht geroutete Adresse wie 192.0.2.2. Der billige DSL-Router verfügt über zwei Schnittstellen, eine interne (192.0.2.1) und eine externe (203.0.113.10), die sich sehr wahrscheinlich häufig ändern und vom DLS-Anbieter über ein lokales Verbindungsprotokoll bereitgestellt werden. Der PC sendet also ein SYN-Paket über sein Standard-Gateway, 192.0.2.1, an 198.51.100.20:80.
- Der Router nimmt das Paket an seiner Schnittstelle 192.0.2.1 auf, wie es auch der Fall wäre, wenn überhaupt kein NAT beteiligt wäre. Es wurde für NAT auf dieser Schnittstelle konfiguriert, daher werden die folgenden Schritte ausgeführt:
- Erfinde eine neue Portnummer, die bisher nicht verwendet wurde. Zum Beispiel 12345.
- Ändern Sie die "Absender" -Adresse im IP-Header in 203.0.113.10.
- Merken Sie sich die ursprüngliche Absenderportnummer im TCP-Header (vom PC bereitgestellt). Nennen wir sie 4321.
- Ändern Sie den TCP-Header so, dass er die 12345-Absenderportnummer enthält.
- Fügen Sie einen Eintrag (12345; 192.0.2.2; 4321) in die NAT-Übersetzungstabelle ein.
- Senden Sie das Paket auf seinem fröhlichen Weg an seinen eigenen Uplink / Gateway.
- 198.51.100.20 empfängt schließlich das Paket, stellt fest, dass es sich um eine SYN handelt ("neue Verbindung herstellen"), und sendet eine SYN-ACK-Nachricht an den Absender zurück. Aus seiner Sicht ist dies die IP-Adresse 203.0.113.10 mit dem TCP-Zielport 12345.
- Der Router empfängt dieses Paket über seine WAN-Schnittstelle. Die WAN-Schnittstelle wurde so konfiguriert, dass NATted-Adressen wie folgt aufgelöst werden. Der Router dann ...
- ... überprüft seine NAT-Übersetzungstabelle, findet den Eintrag ...
- ... ändert das Paket auf ein Ziel von 192.0.2.2 ...
- ... behebt den TCP-Zielport wieder auf 4321 ...
- ... und sendet es auf seinem fröhlichen Weg (auf der LAN-Schnittstelle).
- Der PC empfängt das Paket und sieht nichts über die NAT-Prozedur. Das Paket sieht genauso aus, als hätte 198.51.100.20 es gesendet, als ob der NAT-Router überhaupt nicht da wäre.
Zu keinem Zeitpunkt erscheint das Thema einer "Verbindung". Der NAT-Router (in seiner einfachsten Form) muss sich nicht um den Inhalt der Nachrichten kümmern. Es kümmert sich um die IP-Adressen und die Ports des Absenders und Empfängers, aber sonst nichts. (Zugegeben: Hier werden wahrscheinlich alle Arten von Sicherheits- und Leistungsproblemen übersprungen. Dabei geht es jedoch um das Grundprinzip wie das in dieser Frage vorliegende.)
Woher weiß der Router das?
Der Router muss überhaupt nichts über "Verbindungen" wissen. Tatsächlich existieren ähnliche Verfahren wie für TCP für das verbindungslose UDP-Protokoll (UDP Hole Punching) beschrieben oder könnten tatsächlich für jedes Protokoll implementiert werden, das so etwas wie Portnummern in der Transportschicht hat.
Der Grund, warum der Router das Protokoll auf Transportebene (TCP, UDP, ...) in Bezug auf NAT kennen muss, liegt hauptsächlich darin, dass die Ports selbst nicht Teil von IP sind. und Ports machen den "Hack", der (diese Art von) NAT ist, leicht möglich.
Also zu Ihrer Frage:
Wie entscheidet NAT, welche Verbindungen eingehen und welche ausgehen?
Ausgehende Verbindungen sind per Definition diejenigen, die mit einem SYN-Paket (oder einem anfänglichen UDP-Punch im Fall von UDP) beginnen, das an der LAN-Schnittstelle angezeigt wird. Sie im Fall von NAT "Verbindung" zu nennen, ist ein bisschen viel; Sie enden einfach als temporärer Eintrag in einer NAT-Übersetzungstabelle (zuzüglich aller Sicherheits- / Leistungszusätze, die der einzelne NAT-Router möglicherweise ebenfalls verwendet).
Eingehende Verbindungen sind in dem Szenario, das ich bisher in der Antwort verwendet habe, nicht vorhanden. Es gibt natürlich Varianten von NAT, die dies tun; Sie können beispielsweise einen Port auf der WAN-Schnittstelle des Routers statisch mit einer bestimmten IP: PORT auf der LAN-Schnittstelle identifizieren, wodurch ein Server in Ihrem NATted LAN ausgeführt werden kann. Dies wird auch häufig von billigen DSL / WLAN-Routern unterstützt. Und mit "echten" Routern können Sie diese natürlich in jeder gewünschten Form und Weise konfigurieren.
Weitere eingehende / ausgehende IP-Pakete unterscheiden sich nicht von den im Beispiel angegebenen. Sobald der erste SYN-Handshake durchgeführt wurde und der Router den Eintrag in seiner Übersetzungstabelle hat, durchläuft er (mit derselben Übersetzung wie im Beispiel erläutert) alle weiteren Pakete in beide Richtungen.
Wenn der Server im Rahmen einer so hergestellten TCP-Verbindung Daten an den Client senden möchte (was durchaus möglich ist - TCP ist bidirektional), handelt es sich für den NAT-Router nur um weitere IP-Pakete. Der Inhalt dieser Pakete ist nicht so wichtig (dh ob sie bestimmte Nutzdaten enthalten oder nur "Verwaltungs" -Pakete von TCP oder was auch immer sind).
Zu keinem Zeitpunkt "schließt" der Router irgendwie die Röhre, wie Sie es sagen. Offensichtlich hat der Router eine Vorstellung davon, wann er den Eintrag aus der Übersetzungstabelle löschen kann (wahrscheinlich, wenn er einen FIN-Handshake bemerkt, der die Verbindung beendet, oder durch eine Zeitüberschreitung oder einen Fehlerzustand), aber von Anfang bis Ende ist dies der Fall eine ununterbrochene Angelegenheit.