Offenlegen mehrerer Server hinter NAT mithilfe einer einzigen öffentlichen IP-Adresse

17

Dies ist eine kanonische Frage zu NAT und DNS

Ich versuche derzeit, ein Netzwerk mit einer DMZ einzurichten, die einen Webserver und einen E-Mail-Server enthält, die durch eine NAT-Firewall (Network Address Translation) vom Internet getrennt sind.

Ich habe die NAT-Firewall mit folgenden Schnittstellen installiert:

WAN - x.x.x.x (redacted public IP address)
DMZ - 192.168.124.5/24
LAN - 192.168.123.5/24

In meiner DMZ habe ich zwei Hosts:

Web server - 192.168.124.30
E-mail server - 192.168.124.32

Ich weiß, dass ich den DNS für die example.comDomain konfigurieren muss , um beide example.comund mail.example.commeine öffentliche IP-Adresse aufzulösen .

Ich möchte, dass meine NAT-Firewall alle eingehenden Anforderungen an example.comden Webserver unter 192.168.124.30 und alle eingehenden Anforderungen mail.example.coman den E-Mail-Server unter 192.168.124.32 weiterleitet. Ich sehe eine "Portweiterleitungs" -Funktion in der Konfiguration meiner NAT-Firewall, kann aber scheinbar nicht das erreichen, wonach ich suche.

Atrotygma
quelle
3
Ich habe Ihre Frage bearbeitet, um Verweise auf bestimmte Technologien zu entfernen. Die Frage stellt immer noch die gleiche grundlegende Sache, aber auf technologieneutrale Weise. Ebenso gilt meine Antwort für Ihre ursprüngliche Frage, wird aber auch zutreffen, wenn andere Personen mit anderen Firewall- und Service-Hostsituationen hier nach Antworten suchen.
Evan Anderson

Antworten:

18

Sie sind verwirrt, wenn Sie über den Informationsfluss zwischen den Schichten des TCP / IP-Protokollstapels nachdenken - insbesondere zwischen DNS- und Anwendungsschichtprotokollen.

Sie haben eine öffentliche IP-Adresse. Ihr DNS kann sicherlich beide mail.example.comund example.comdieselbe öffentliche IP-Adresse auflösen .

Im Allgemeinen enthalten die IP-Datagramme, die Anforderungen an Ihre öffentliche IP-Adresse enthalten, die von der externen Schnittstelle Ihrer Firewall empfangen werden, nicht den Namen des Hosts, auf den der Remote-Client zuzugreifen versucht. Ihre Firewall kann nicht auf magische Weise "wissen", welchen Hostnamen der Remoteclient aufgelöst hat, da beide Hostnamen in dieselbe IP-Adresse aufgelöst werden. Der IP-Schicht ist der auf der Anwendungsebene verwendete Hostname nicht bekannt.

Die TCP- und UDP-Protokolle unterscheiden bestimmte Dienste, die von einem Host angeboten werden, anhand von Portnummern. In Ihrem Beispiel ist es möglicherweise möglich, die Portweiterleitungsfunktion (auch als Portadressübersetzung oder PAT bezeichnet) Ihrer NAT-Firewall zu verwenden, um eingehende Anforderungen an TCP-Port 80 (HTTP) an den Webserver zu senden, während eingehende TCP-Ports gesendet werden 25 (SMTP) auf Ihren E-Mail-Server.

Wenn Sie jedoch vorhaben, denselben Dienst auf beiden Computern zu hosten, wird diese Strategie problematisch. Angenommen, Sie hosten sowohl eine sichere Website auf Ihrem Webserver (für den Kundenzugriff) als auch eine sichere Website auf Ihrem E-Mail-Server (für Webmail). Anforderungen, die an die öffentliche IP-Adresse Ihrer NAT-Firewall an den TCP-Port 443 (HTTPS) gesendet werden, können nur an den einen oder anderen Server weitergeleitet werden.

Die allgemeine Lösung für diese Situation besteht darin, mehr öffentliche IP-Adressen zu haben. Da IPv4-Adressen knapp werden, kann dies ebenfalls problematisch sein.

Am Ende arbeiten wir auf der Anwendungsebene an der Knappheit öffentlicher IP-Adressen in einigen Protokollen. Beispielsweise hat HTTP / 1.1 den Host:Header speziell hinzugefügt , damit ein Webserver mehrere Websites unter derselben öffentlichen IP-Adresse hosten kann. TLS fügt die Server Name Indication (SNI) -Erweiterung hinzu, um die Auswahl des geeigneten Zertifikats basierend auf dem vom Remote-Client eingegebenen Hostnamen zu ermöglichen.

Eine solche Problemumgehung in der Anwendungsschicht bedeutet, dass jedes Anwendungsschichtprotokoll eine eigene "Korrektur" benötigt (und dann müsste die gesamte Server- und Client-Software diese "Korrektur" implementieren). Das ist eine große Aufgabe.

Anstatt das Anwendungsschichtprotokoll zu modifizieren, können einige Protokolle leicht zwischen mehreren Hosts "gemultiplext" werden, indem Software verwendet wird, die Anforderungen "weiterleiten" kann. Dies geht wahrscheinlich über das hinaus, was eine einfache NAT-Firewall kann, da die Pakete auf Anwendungsebene überprüft werden müssen. Die Verwendung eines Reverseproxys wie nginx ist ein gutes Beispiel für diese Art von "Multiplexing" (oder für Webveröffentlichungsregeln in Forefront TMG oder ISA Server in einer Microsoft-Umgebung) für das HTTP-Protokoll. Theoretisch könnte jedes Protokoll über einen Reverse-Proxy gemultiplext werden. Je esoterischer das Protokoll, desto wahrscheinlicher ist es, dass Sie über das Schreiben von benutzerdefiniertem Code sprechen.

Wenn Sie denselben Dienst von zwei verschiedenen Hosts auf einer einzigen öffentlichen IP-Adresse anbieten müssen, haben Sie immer die Möglichkeit, einen der Hosts auf einen nicht standardmäßigen Port zu verschieben. Dies setzt jedoch voraus, dass Clients den nicht standardmäßigen Port kennen. Im Fall von HTTP (S) führt dies zu URLs mit der http://example.com:XXXNotation (wobei XXXdie nicht standardmäßige Portnummer ist). Ob dies in Ihrer Situation problematisch ist, können nur Sie selbst entscheiden. (Meine Erfahrung hat gezeigt, dass praktisch kein Endbenutzer in der Lage ist, die :XXXPortnotation in einer URL zu verarbeiten, die er manuell eingeben muss.)

Evan Anderson
quelle
1
Problemumgehung, nicht "beheben". :)
Michael Hampton
@MichaelHampton - Ich höre dich! > smile <
Evan Anderson
@EvanAnderson Danke für deine Antwort. Ich glaube, ich habe die Dinge durcheinander gebracht, weil ich es gewohnt war, mit ForeFront zu arbeiten. Eine solche Aufgabe fühlte sich für mich einfach normal an. Kennen Sie Linux-Firewall-Distributionen mit dieser Funktion, die auf Anwendungsebene funktionieren? Ich habe mir Shorewall noch angeschaut, bin mir aber nicht sicher, ob es dazu in der Lage ist, da es auf iptables basiert, was, wie Sie bereits sagten, auf der IP-Ebene liegt.
Atrotygma
5

Mit der Funktion "Portweiterleitung" können Sie möglicherweise Datenverkehr für: 80 und: 443 an 192.168.124.30 und die verbleibenden Ports (oder nur die Ports, für die Ihr E-Mail-Server konfiguriert ist) an 192.168.124.32 senden. Wenn Sie aus irgendeinem Grund einen dieser beiden Ports sowohl für den E-Mail-Server als auch für den Webserver benötigen, sind Sie in Schwierigkeiten. Damit diese Methode funktioniert, muss sich jeder Webzugriff auf Ihren E-Mail-Server auf einem anderen (höchstwahrscheinlich nicht standardmäßigen) Port befinden. Sie würden wahrscheinlich auch den Webserver so einrichten, dass er alles umleitet, was " mail.example.com" sagt , um stattdessen für die Benutzer verwendet zu werden, die nicht wissen, wie die Portnummer angehängt und / oder eine sichere Verbindung angegeben wird. (Sie werden nur sichere Webverbindungen zum Mailserver verwenden, oder?)https://mail.example.com:other_port

Dies erfolgt eher auf der Transportebene als auf der Anwendungsebene, was bedeutet, dass keine eingehende Paketprüfung erforderlich ist. Stattdessen kann ein leicht zu findender Speicherort im TCP-Header für den Port angezeigt werden.

Monty Harder
quelle
3

Wenn es sich bei Ihren "eingehenden Anfragen" um verschiedene Dinge handelt, z. B. um Webdatenverkehr (HTTP) für den Webserver und um Maildatenverkehr (SMTP) für den Mailserver, kann dies in der Tat erfolgen: HTTP verwendet TCP-Port 80 (443 für HTTPS), während SMTP Verwendet TCP-Port 25; Auf diese Weise können Sie von derselben öffentlichen IP-Adresse aus HTTP-Datenverkehr an Ihren Webserver und SMTP-Datenverkehr an Ihren Mailserver weiterleiten. Das ist, was "Portweiterleitung" bedeutet. Jede anständige Firewall ist dazu in der Lage.

Müssen die beiden Server jedoch zufällig den gleichen Datenverkehr akzeptieren können, z. B. wenn Ihr Mailserver auch einen Webmail-Dienst hostet, sind Sie in Schwierigkeiten, weil Sie bestimmte Ports (80 und / oder 443) weiterleiten können. nur zu einem einzelnen Server; Um den Webdatenverkehr nach dem Namen zu trennen, den der Client für die Anforderung verwendet hat, benötigen Sie einen Dienst, der auf einer höheren Ebene als TCP / IP ausgeführt wird, z. B. einen Reverse-Proxy.

Massimo
quelle