Esposizione di più server dietro NAT utilizzando un unico indirizzo IP pubblico


17

Questa è una domanda canonica su NAT e DNS

Attualmente sto cercando di configurare una rete con una DMZ contenente un server Web e un server di posta elettronica separati da Internet da un firewall NAT (Translation Address Translating).

Ho installato il firewall NAT con le seguenti interfacce:

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

Sulla mia DMZ ho i miei due host:

Web server - 192.168.124.30
E-mail server - 192.168.124.32

Io so che ho bisogno di configurare il DNS per il example.comdominio di risolvere sia example.come mail.example.comal mio indirizzo IP pubblico.

Vorrei che il mio firewall NAT inoltrasse tutte le richieste in arrivo al example.comserver Web a 192.168.124.30 e tutte le richieste in arrivo al mail.example.comserver di posta elettronica a 192.168.124.32. Vedo una funzione di "port forwarding" nella configurazione del mio firewall NAT ma non riesco a raggiungere quello che sto cercando.


3
Ho modificato la tua domanda per rimuovere riferimenti a tecnologie specifiche. La domanda pone ancora la stessa cosa di base, ma in modo neutro dal punto di vista tecnologico. Allo stesso modo, la mia risposta si applica alla tua domanda originale, ma si applicherà anche se altre persone con situazioni diverse di firewall e host di servizi vengono alla ricerca di risposte qui.
Evan Anderson,

Risposte:


18

Ti stai confondendo nel pensare a come fluiscono le informazioni tra i livelli dello stack del protocollo TCP / IP, tra i protocolli DNS e dei livelli applicazione, in particolare.

Hai un indirizzo IP pubblico. Il tuo DNS può certamente risolvere entrambi mail.example.come example.comallo stesso indirizzo IP pubblico.

In generale, i datagrammi IP contenenti richieste al tuo indirizzo IP pubblico, che saranno ricevuti dall'interfaccia esterna del firewall, non contengono il nome dell'host a cui il client remoto sta tentando di accedere. Il tuo firewall non può "sapere" magicamente quale nome host è stato risolto dal client remoto, poiché entrambi i nomi host risolvono allo stesso indirizzo IP. Il livello IP non è a conoscenza del nome host utilizzato a livello dell'applicazione.

I protocolli TCP e UDP differenziano i servizi specifici offerti da un host utilizzando i numeri di porta. Nel caso del tuo esempio, potrebbe essere possibile utilizzare la funzionalità di port forwarding (detta anche traduzione dell'indirizzo della porta o PAT) del firewall NAT per inviare richieste in ingresso alla porta TCP 80 (HTTP) al server Web durante l'invio della porta TCP in entrata 25 (SMTP) al tuo server di posta elettronica.

Se, tuttavia, prevedi di ospitare lo stesso servizio su entrambe le macchine, questa strategia diventa problematica. Supponiamo che stai per ospitare sia un sito Web sicuro sul tuo server Web (per l'accesso del Cliente) sia un sito Web sicuro sul tuo server di posta elettronica (per la webmail). Le richieste che arrivano all'indirizzo IP pubblico del firewall NAT alla porta TCP 443 (HTTPS) possono essere indirizzate solo a un server o all'altro.

La soluzione generalizzata a questa situazione è avere più indirizzi IP pubblici. Perché gli indirizzi IPv4 stanno diventando scarsi che possono anche essere problematici.

Finiamo per ovviare alla scarsità di indirizzi IP pubblici in alcuni protocolli a livello di applicazione. Ad esempio, HTTP / 1.1 ha aggiunto l' Host:intestazione specificatamente per consentire a un server Web di ospitare più siti Web sullo stesso indirizzo IP pubblico. TLS aggiunge l' estensione SNI ( Server Name Indication ) per consentire la selezione del certificato appropriato in base al nome host inserito dal client remoto.

Fare questo tipo di soluzione nel livello dell'applicazione significa che ogni protocollo del livello applicazione avrebbe bisogno della propria "correzione" (e quindi tutti i software server e client dovrebbero implementare quella "correzione"). Questo è un ordine elevato.

Invece di modificare il protocollo del livello applicazione, alcuni protocolli sono facilmente suscettibili di essere "multiplexati" tra più host utilizzando un software in grado di "instradare" le richieste. Questo probabilmente va oltre ciò di cui è capace un semplice firewall NAT perché i pacchetti devono essere controllati a livello di applicazione. L'uso di un proxy inverso come nginx è un buon esempio di questo tipo di "multiplexing" (o regole di pubblicazione Web su Forefront TMG o ISA Server in un ambiente Microsoft) per il protocollo HTTP. In teoria, qualsiasi protocollo potrebbe essere multiplexato tramite un proxy inverso, ma più esoterico è il protocollo, più è probabile che si parlerebbe di scrivere codice personalizzato.

Quando è necessario offrire lo stesso servizio da due host diversi su un unico indirizzo IP pubblico, è sempre possibile spostare uno degli host su una porta non standard. Ciò richiederà tuttavia che i client siano a conoscenza della porta non standard. Nel caso di HTTP (S) ciò si traduce in URL con la http://example.com:XXXnotazione (dove si XXXtrova il numero di porta non standard). Se questo sarebbe problematico nella tua situazione è qualcosa che solo tu puoi decidere. (La mia esperienza ha dimostrato che praticamente nessun utente finale è in grado di gestire la :XXXnotazione delle porte in qualsiasi URL che deve inserire manualmente.)


1
Soluzione alternativa, non "correzione". :)
Michael Hampton

@MichaelHampton - Ti sento! > smile <
Evan Anderson,

@EvanAnderson Grazie per la risposta. Immagino di aver fatto un casino perché ero abituato a lavorare con ForeFront, un compito del genere mi sembrava normale. Sei a conoscenza di eventuali distribuzioni di firewall Linux con questa funzionalità che funzionano a livello di applicazione? Ho già guardato Shorewall, ma non sono sicuro che sia in grado di farlo perché si basa su iptables che è, come hai detto, sul livello ip.
Atrotygma,

5

La funzione "Port Forwarding" può consentire di inviare il traffico destinato a: 80 e: 443 a 192.168.124.30 e le porte rimanenti (o solo quelle che il server di posta elettronica è configurato per utilizzare) a 192.168.124.32. Se per qualche motivo hai bisogno di una di queste due porte per il server di posta elettronica e per il server Web, sei nei guai. Perché questo metodo funzioni, qualsiasi accesso web al tuo server di posta elettronica dovrebbe essere su una porta diversa (molto probabilmente non standard). Probabilmente avresti anche impostato il web server per reindirizzare tutto ciò che dice " mail.example.com" da usare , invece, per gli utenti che non sanno come aggiungere il numero di porta e / o specificare una connessione sicura. (Si sta andando ad utilizzare connessioni web sicure solo al server di posta, giusto?)https://mail.example.com:other_port

Questo è a livello di trasporto piuttosto che a livello di applicazione, il che significa che non deve fare affidamento sull'ispezione approfondita dei pacchetti. Invece può guardare una posizione facile da trovare nell'intestazione TCP per la porta.


3

Se le tue "richieste in arrivo" sono diverse, ad esempio il traffico web (HTTP) per il server web e il traffico di posta (SMTP) per il server di posta, ciò può effettivamente essere fatto: HTTP utilizza la porta TCP 80 (443 per HTTPS), mentre SMTP utilizza la porta TCP 25; quindi, dallo stesso indirizzo IP pubblico, puoi inoltrare il traffico HTTP al tuo server web e il traffico SMTP al tuo server di posta; questo è ciò che significa "port forwarding". Qualsiasi firewall decente è in grado di farlo.

Tuttavia, se per caso i due server devono essere in grado di accettare il SAME tipo di traffico, ad esempio se il tuo server di posta ospita anche un servizio di webmail, allora sei nei guai, perché puoi inoltrare porte specifiche (80 e / o 443) solo per un singolo server; per separare il traffico Web in base al nome utilizzato dal client per richiederlo, è necessario qualcosa che funzioni a un livello superiore rispetto a TCP / IP, ad esempio un proxy inverso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.