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:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.3.11
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:
iptables -t nat -A POSTROUTING -d 192.168.3.11 -p tcp --dport 80 -j MASQUERADE
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.