Dies ist eine kanonische Frage zu Hairpin NAT (Loopback NAT).
Die allgemeine Form dieser Frage lautet:
Wir haben ein Netzwerk mit Clients, einem Server und einem NAT-Router. Auf dem Router gibt es eine Portweiterleitung zum Server, sodass einige seiner Dienste extern verfügbar sind. Wir haben DNS, das auf die externe IP zeigt. Lokale Netzwerkclients können keine Verbindung herstellen, aber externe Arbeit.
- Warum schlägt dies fehl?
- Wie kann ich ein einheitliches Benennungsschema erstellen (DNS-Namen, die sowohl lokal als auch extern funktionieren)?
Diese Frage wurde aus mehreren anderen Fragen zusammengeführt. Sie verwiesen ursprünglich auf FreeBSD, D-Link, Microtik und andere Geräte. Sie alle versuchen jedoch, dasselbe Problem zu lösen.
networking
nat
port-forwarding
internet
Adopilot
quelle
quelle
Antworten:
Was Sie suchen, heißt "Haarnadel NAT". Anfragen von der internen Schnittstelle nach einer der externen Schnittstelle zugewiesenen IP-Adresse sollten so behandelt werden, als ob sie von der externen Schnittstelle eingegangen wären.
Ich bin mit FreeBSD überhaupt nicht vertraut, lese aber im "pf" -Handbuch für OpenBSD ( http://www.openbsd.org/faq/pf/rdr.html ) die vorgeschlagenen Lösungen für Split-Horizon-DNS unter Verwendung von DMZ-Netzwerk oder TCP-Proxy lassen mich glauben, dass "pf" kein Haarnadel-NAT unterstützt.
Ich würde die Route des Split-Horizon-DNS einschlagen und nicht die internen IP-Adressen in URLs verwenden, sondern die Namen.
quelle
no nat on $int_if proto tcp from $int_if to $int_net
,nat on $int_if proto tcp from $int_net to $hairpin_int port $hairpin_ports -> $int_if
,rdr on $int_if proto tcp from $int_net to $ext_if port $hairpin_ports -> $hairpin_int
Da dies zur kanonischen Frage zu Haarnadel-NAT erhoben wurde , dachte ich, dass es wahrscheinlich eine allgemein gültige Antwort geben sollte als die derzeit akzeptierte, die sich (obwohl ausgezeichnet) speziell auf FreeBSD bezieht.
Diese Frage bezieht sich auf Dienste, die von Servern in IPv4-Netzwerken mit RFC1918-Adresse bereitgestellt werden und für externe Benutzer verfügbar sind, indem das Ziel-NAT (DNAT) am Gateway eingeführt wird. Interne Benutzer versuchen dann, über die externe Adresse auf diese Dienste zuzugreifen. Ihr Paket geht vom Client zum Gateway-Gerät, das die Zieladresse neu schreibt und sie sofort wieder in das interne Netzwerk einspeist. Es ist diese scharfe Kehrtwende, die das Paket am Gateway macht, die den Namen Haarnadel NAT in Analogie zur Haarnadelkurve hervorruft .
Das Problem tritt auf, wenn das Gateway-Gerät die Zieladresse, nicht jedoch die Quelladresse überschreibt. Der Server empfängt dann ein Paket mit einer internen Zieladresse (seiner eigenen) und einer internen Quelladresse (der des Clients). es weiß, dass es direkt auf eine solche Adresse antworten kann, also tut es das auch. Da diese Antwort direkt ist, wird sie nicht über das Gateway gesendet, sodass es nie möglich ist, die Auswirkung des eingehenden Ziel-NAT auf das ursprüngliche Paket auszugleichen, indem die Quelladresse des zurückgegebenen Pakets neu geschrieben wird.
Der Client sendet somit ein Paket an eine externe IP-Adresse, erhält jedoch eine Antwort von einer internen IP-Adresse. Es ist nicht bekannt, dass die beiden Pakete Teil derselben Konversation sind, daher findet keine Konversation statt.
Die Lösung besteht darin, dass für Pakete, die ein solches Ziel-NAT erfordern und das Gateway vom internen Netzwerk aus erreichen , auch das Quell-NAT (SNAT) für das eingehende Paket ausgeführt wird, indem die Quelladresse in der Regel auf die des Gateways umgeschrieben wird. Der Server glaubt dann, dass der Client das Gateway selbst ist, und antwortet direkt darauf. Dies gibt dem Gateway wiederum die Möglichkeit, die Auswirkungen von DNAT und SNAT auf das eingehende Paket auszugleichen, indem sowohl die Quell- als auch die Zieladresse auf dem Rückpaket neu geschrieben werden.
Der Client glaubt, mit einem externen Server zu sprechen. Der Server glaubt, mit dem Gateway-Gerät zu sprechen. Alle Parteien sind glücklich. Ein Diagramm kann an dieser Stelle hilfreich sein:
Einige Consumer-Gateway-Geräte sind hell genug, um die Pakete zu erkennen, für die der zweite NAT-Schritt erforderlich ist. In einem Haarnadel-NAT-Szenario funktionieren diese Pakete möglicherweise sofort. Andere sind es nicht und werden es auch nicht, und es ist unwahrscheinlich, dass sie zum Arbeiten gebracht werden können. Eine Diskussion darüber, welche Geräte für Endverbraucher geeignet sind, ist für Server Fault nicht relevant.
Ordnungsgemäße Netzwerkgeräte können in der Regel als funktionsfähig eingestuft werden, müssen jedoch - da sie nicht die Aufgabe haben, ihre Administratoren zu erraten - dazu aufgefordert werden, dies zu tun. Linux verwendet
iptables
, um die DNAT zu tun, also:Dadurch wird einfaches DNAT für den HTTP-Port aktiviert, um einen internen Server einzuschalten
192.168.3.11
. Aber um Haarnadel-NAT zu aktivieren, braucht man auch eine Regel wie:Beachten Sie, dass solche Regeln in den relevanten Ketten an der richtigen Stelle sein müssen, damit sie ordnungsgemäß funktionieren. Abhängig von den Einstellungen in der
filter
Kette sind möglicherweise zusätzliche Regeln erforderlich, damit der NAT-Verkehr fließen kann. Alle diese Diskussionen sind nicht Gegenstand dieser Antwort.Aber wie andere bereits gesagt haben, ist es nicht die beste Möglichkeit, das Problem durch Aktivieren von Haarnadel-NAT zu lösen. Das Beste ist Split-Horizon-DNS , bei dem Ihre Organisation unterschiedliche Antworten für die ursprüngliche Suche bereitstellt, je nachdem, wo sich der anfordernde Client befindet. Dies geschieht entweder durch unterschiedliche physische Server für interne und externe Benutzer oder durch die Konfiguration des DNS-Servers, um entsprechend unterschiedlich zu reagieren die Adresse des anfragenden Kunden.
quelle
iptables
, können Sie dies auf jeden Fall konfigurieren, wenn Sie dies wünschen.Das Problem hierbei ist, dass Ihr Router die Adresse Ihres internen Clients nicht NAT-fähig macht. Daher schlägt der TCP-Handshake fehl.
Nehmen wir folgende IPs an
Hier ist was passiert:
quelle
Warum nicht überall Split-Horizon-DNS anstelle von fest codierten IP-Adressen verwenden? Sie hätten eine externe Domain, die außen auf 217.xxx und innen auf 192.xxx zeigt.
quelle
Wenn es sich um einen Original-D-Link-Router handelt (dh nicht um Rev. D / Firmware Version 1.00VG von Virgin Media), sollten Sie in der Lage sein, die Einstellungen anzupassen, um dies zu umgehen. (Ich stimme jedoch aus vielen anderen Gründen dem Vorschlag des Vorgängers von DD-WRT zu!)
Dieser Screenshot stammt aus dem Rev. C-Modell. deine kann etwas anders sein.
quelle
Kürzlich beantwortete eine ähnliche Frage: Cisco Static NAT funktioniert nicht auf LAN-Seite und hat gerade festgestellt, dass dies eine Canonical Question ist. Lassen Sie mich die Lösung hier zusammenfassen.
Zuallererst: Vergessen Sie NAT (wenn Sie können) - es geht überhaupt nicht um die Konfiguration von NAT. Es geht darum, über das Internet und das LAN auf einen Server zuzugreifen, der sich hinter NAT befindet. Der Einsatz von zwei DNS-Zonen ist eine praktikable Alternative, aber nicht immer die Lösung. Aber die Lösung existiert und ist unglaublich einfach (obwohl wahrscheinlich nicht perfekt):
(1) Auf dem Server: Fügen Sie die öffentliche IP-Adresse als sekundäre IP-Adresse in die Netzwerkschnittstelle des Servers mit der Maske 255.255.255.255 ein (der Webdienst oder was auch immer Sie auf dem Server möchten, sollte auch diese IP-Adresse überwachen). Dies ist in allen modernen Betriebssystemen möglich (oder es kann eine Loopback-Schnittstelle mit der zugewiesenen öffentlichen IP-Adresse verwendet werden, anstatt der primären Schnittstelle eine sekundäre IP-Adresse hinzuzufügen).
(2) Auf den LAN-Hosts: Fügen Sie eine Hostroute für die öffentliche IP-Adresse hinzu. Verwenden Sie beispielsweise für Windows-Hosts den folgenden Befehl: route -p add 203.0.113.130 mask 255.255.255.255 192.168.1.11 (Sie können auch DHCP verwenden.) statische Route "Option zum Verteilen der Route). Wenn sich zwischen den Clients und dem mit dem Internet verbundenen Router ein oder mehrere L3-Switches / Router befinden, konfigurieren Sie diese Hostroute auf diesen Zwischen-Switches / Routern, nicht auf die Kunden.
Für diejenigen, die mit dem TCP-Drei-Wege-Handshake zu tun haben: In der vorgeschlagenen Konfiguration funktioniert dies in Ordnung.
Bitte geben Sie Feedback (mindestens, Abstimmung).
quelle
Ich beantworte meine Fragen nur, um den Horizont für Menschen mit ähnlichen Problemen zu erweitern.
Ich werde von meinem ISP kontaktiert und gebeten, meine Probleme zu lösen. Was sie mir angeboten hatten, ist eine andere öffentliche IP-Adresse nur für Server. Jetzt habe ich lokalen Datenverkehr auf der WAN-Seite von FreeBSD und wir haben spezielle Pipes für einen schnelleren Durchsatz nach lokalem Datenverkehr zur öffentlichen IP des Servers erstellt
quelle
Aus technischer Sicht besteht die beste Lösung für dieses Problem darin, IPv6 in Ihrem Netzwerk zu aktivieren. Wenn IPv6 aktiviert ist, müssen Sie einen AAAA-Eintrag für Ihre Domain erstellen. Behalten Sie den vorhandenen A-Eintrag bei, der auf das externe IPv4 des Routers verweist . Erstellen Sie einen AAAA-Eintrag, der auf die IPv6-Adresse des Servers verweist .
IPv6 verfügt über genügend Adressen, um NAT zu vermeiden, sodass Sie für IPv6 kein Haarnadel-NAT benötigen. Sobald Sie IPv6 aktiviert und AAAA-Datensätze erstellt haben, versucht jeder Client, der RFC 8305 unterstützt , IPv6 vor IPv4. Dies bedeutet, dass Sie auch für IPv4 kein Haarnadel-NAT benötigen, da die Clients es nicht verwenden.
Sie benötigen weiterhin Ihr vorhandenes IPv4-NAT für ausgehende Verbindungen und die Portweiterleitung für eingehende Verbindungen, bis der Großteil der Welt auch IPv6 aktiviert hat.
Es ist auch schneller.
Wenn Sie IPv6 verwenden, erhalten Sie eine bessere Leistung als mit Haarnadel-NAT.
Mit Haarnadel-NAT sendet Ihr Client ein Paket über einen Switch an den Router. Anschließend führt der Router zwei Übersetzungsrunden durch und sendet das Paket schließlich über den Switch an den Server. Pakete vom Server zum Client durchlaufen den gesamten Pfad in umgekehrter Reihenfolge.
Mit IPv6 vermeiden Sie NAT, stattdessen werden Pakete direkt über den Switch zwischen Client und Server gesendet. Dies bedeutet, dass Sie bei einer Rundreise die Anzahl der Durchgänge durch den Switch von 4 auf 2 reduzieren und 2 Durchgänge durch den Router und die 4 vom Router durchgeführten Übersetzungen vermeiden. Dies führt zu einer besseren Leistung.
Dies gilt auch, wenn Sie einen Switch verwenden, der in der gleichen Box wie der Router eingebaut ist.
Was ist, wenn der ISP kein IPv6 hat?
Wenn Sie einen ISP verwenden, der IPv6 nicht unterstützt, werde ich Sie fragen, ob Sie Server in diesem Netzwerk hosten sollten. Dies sind meine Vorschläge, was zu tun ist, wenn der ISP derzeit IPv6 nicht unterstützt.
Teilen Sie dem ISP zunächst mit, dass Sie IPv6 benötigen . Und erinnern Sie sie vielleicht daran, dass es das IPv6-Protokoll seit 20 Jahren gibt. Wenn dies für den ISP nicht ausreicht, um Sie ernst zu nehmen, suchen Sie nach anderen ISPs.
Wenn Sie einen Internetdienstanbieter mit IPv6-Unterstützung finden, können Sie mit beiden Internetdienstanbietern für eine Übergangszeit zusammenarbeiten. Auf dem mit dem neuen ISP verbundenen Router können Sie IPv4 auf der LAN-Seite deaktivieren und dann die LAN-Seiten beider Router mit demselben Switch verbinden. IPv4 und IPv6 sind zwei unabhängige Protokolle und daher ist es überhaupt kein Problem, wenn diese Verbindungen über verschiedene Router laufen. Als Nebeneffekt erhalten Sie eine gewisse Redundanz, wenn eine der Verbindungen ausfällt.
Wenn Sie keinen ISP mit IPv6-Unterstützung finden, sollten Sie in Betracht ziehen, Ihren Server auf eine Hosting-Einrichtung zu verschieben. Mit einem Server in einer Hosting-Einrichtung sind Sie weniger abhängig von einem geografischen Standort. Aus diesem Grund gibt es mehr Wettbewerb zwischen Anbietern, um sicherzustellen, dass es einen gibt, der Ihre Anforderungen erfüllt.
Wenn Sie den Server auf eine Hosting-Einrichtung verschieben, erhalten Ihre Clients kein IPv6. Wenn Sie den Server jedoch verschieben, benötigen Sie kein Haarnadel-NAT mehr, um ihn zu erreichen.
Was du nicht tun solltest
Aktivieren Sie IPv6 nicht und erstellen Sie AAAA-Einträge, wenn Sie keine Möglichkeit haben, den IPv6-Verkehr weiterzuleiten. Wenn Ihr ISP IPv6 nicht unterstützt, Sie jedoch IPv6 in Ihrem LAN aktivieren (möglicherweise mithilfe von RFC 4193-Adressen) und AAAA-Einträge erstellen, funktioniert dies für Clients in Ihrem LAN, die den Server in Ihrem LAN erreichen. Die Kommunikation zwischen Ihrem LAN und der Außenwelt würde jedoch zuerst IPv6 versuchen (was nicht funktionieren würde), und Sie würden sich darauf verlassen, auf IPv4 zurückzugreifen, das im besten Fall etwas langsamer ist oder im schlimmsten Fall nicht funktioniert.
quelle
Da ich auch diese Frage gestellt habe (siehe Wie greife ich auf einen Netzwerkdienst zu, der hinter einer Firewall von innen mit seiner externen IP-Adresse NATed ist? ) Und hier umgeleitet wurde, lieferte die Antwort hier (im Gegensatz zu allgemeinen Erklärungen ) keine Lösung Biete hier meine Linux ( spezifische) Lösung an, um allen ein paar Stunden Experimentieren zu ersparen. Diese Datei hat ein Format und kann direkt in iptables eingelesen werden (nach dem Bearbeiten der IP-Adressen natürlich). Dies gilt für einen Webserver (Port 80) und nur für IPv4 - die Regeln für IPv6 und für SSL (Port 443) sind analog.
iptables
iptables-restore
Ersetzen
lan.local
,web.local
undweb.public.com
mit Ihrem lokalen Netzwerk (z. B. 10.0.x.0 / 24), der Webserver die lokale IP (zB 10.0.1.2), und der Router die öffentliche IP (zB. 4.5.6.7). Dies-4
dient nur dazu, IPv6- und IPv4-Regeln in derselben Datei zuzulassen (solche Zeilen werden von ignoriertip6tables
). Denken Sie auch daran, IPv6-Adressen in [Klammern] einzutragen, wenn sie Portdeklarationen enthalten, z[fe0a:bd52::2]:80
.Das waren alles Dinge, die mich veranlassten, mir die Haare auszureißen, als ich versuchte, die Erklärungen in dieser Frage tatsächlich umzusetzen . Ich hoffe, ich habe nichts ausgelassen.
quelle
Ich werde hier eine Antwort hinzufügen, da die Kommentare hier nicht mein spezielles Problem angesprochen haben. Ich vermute, das liegt daran, dass ich einen bösen Linux-Kernel-Bug habe. Das Setup ist:
Trotz des komplex aussehenden Bildes ist die einzige relevante Änderung der in anderen Kommentaren behandelten Situationen die Hinzufügung der Software-Brücke br0. Es ist da, weil die Gateway-Box auch ein drahtloser Zugangspunkt für das LAN ist.
Unsere Gateway-Box führt weiterhin NAT-Aufgaben für die Computer im LAN aus. Da es nur 1 Ethernet-Port hat, ist es gezwungen, Haarnadel-NAT durchzuführen. Ich vermute, es sollte nur mit den iptables-Regeln funktionieren, die in anderen Kommentaren hier angegeben sind, aber auf dem Linux-Kernel 4.9 zumindest nicht. Unter 4.9 können unsere Computer im LAN, die versuchen, über NAT darauf zuzugreifen, nicht auf das Internet zugreifen.
tcpdump
Zeigt Antworten auf eingehende Pakete an, die eth0 treffen, aber nicht aus br0 herauskommen. Das Ausführen dieses Befehls behebt Folgendes:Bevor dieser Befehl ausgeführt wird, werden eingehende Pakete gemäß dem Standardverhalten des Kernels verarbeitet. Dabei werden sie an die Bridge übergeben und dann an den Routing-Modulen des Kernels weitergeleitet. Der Befehl zwingt Pakete, die nicht aus dem LAN stammen, die Bridge zu umgehen und direkt zum Routing zu gelangen. Dies bedeutet, dass die Bridge keine Chance hat, sie zu verwerfen. Broadcast- und Multicast-Adressen müssen überbrückt werden, sonst funktionieren Dinge wie DHCP und mDNS nicht. Wenn Sie IPv6 verwenden, müssen Sie auch Regeln dafür hinzufügen.
Sie könnten versucht sein, das Problem folgendermaßen zu beheben:
Ich war auf jeden Fall so versucht - es war mein erster Versuch. Sobald ich es geschafft habe, haben Maschinen im LAN Zugang zum Internet, so dass es für eine Weile funktioniert. Dann geschah Folgendes (und ich wollte das Experiment nicht wiederholen):
Der einzige Ausweg bestand darin, jede Maschine im Gebäude neu zu starten. Die einzige Ausnahme waren die Hardware-Switches, die nicht neu gestartet werden konnten. Sie mussten aus- und wieder eingeschaltet werden.
quelle
Wie es eine kanonische Frage ist. Ich werde antworten, wenn Sie einen Sonicwall-Router haben.
Der zu erkennende Ausdruck ist NAT-Loopback-Richtlinie
Loopback-Richtlinie unter Verwendung der IP-Adresse der WAN-Schnittstelle
Die Sonicwall erkennt den externen Dienst, den Sie kontaktieren möchten, und schreibt die Zieladresse so, dass sie der internen Adresse des Servers entspricht, sodass sie für den Computer transparent ist.
quelle
In FreeBSD mit PF ist es so einfach (in Ihrer pf.conf-Datei):
192.168.20.8 wäre der interne Webserver.
quelle