Expondo vários servidores atrás do NAT usando um único endereço IP público


17

Esta é uma pergunta canônica sobre NAT e DNS

Atualmente, estou tentando configurar uma rede com uma DMZ contendo um servidor web e um servidor de email separados da Internet por um firewall de conversão de endereço de rede (NAT).

Eu instalei o firewall NAT com as seguintes interfaces:

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

Na minha DMZ, tenho meus dois hosts:

Web server - 192.168.124.30
E-mail server - 192.168.124.32

Sei que precisarei configurar o DNS para o example.comdomínio para resolver o endereço IP público example.come o mail.example.commeu.

Gostaria que meu firewall NAT encaminhasse todas as solicitações recebidas example.compara o servidor web em 192.168.124.30 e todas as solicitações recebidas mail.example.compara o servidor de email em 192.168.124.32. Vejo um recurso de "encaminhamento de porta" na configuração do meu firewall NAT, mas não consigo atingir o que estou procurando.


3
Editei sua pergunta para remover referências a tecnologias específicas. A pergunta ainda faz a mesma coisa básica, mas de maneira neutra em termos de tecnologia. Da mesma forma, minha resposta se aplica à sua pergunta original, mas também se outras pessoas com diferentes situações de firewall e de host de serviços procurarem respostas aqui.
Evan Anderson

Respostas:


18

Você está ficando confuso ao pensar em como as informações fluem entre as camadas da pilha de protocolos TCP / IP - entre os protocolos DNS e da camada de aplicativos, especificamente.

Você tem um endereço IP público. Seu DNS certamente pode resolver ambos mail.example.come example.compara o mesmo endereço IP público.

Em geral, os datagramas IP que contêm solicitações para seu endereço IP público, que serão recebidos pela interface externa do seu firewall, não contêm o nome do host que o cliente remoto está tentando acessar. Seu firewall não pode "saber" magicamente qual nome de host o cliente remoto resolveu, pois os dois nomes de host são resolvidos para o mesmo endereço IP. A camada IP não está ciente do nome do host usado na camada de aplicativo.

Os protocolos TCP e UDP diferenciam serviços específicos oferecidos por um host usando números de porta. No caso do seu exemplo, pode ser possível usar o recurso de encaminhamento de porta (também chamado de conversão de endereço de porta ou PAT) do firewall NAT para enviar solicitações de entrada para a porta TCP 80 (HTTP) para o servidor da Web enquanto envia a porta TCP de entrada 25 (SMTP) para o seu servidor de email.

Se, no entanto, você planeja hospedar o mesmo serviço nas duas máquinas, essa estratégia se torna problemática. Suponha que você hospede um site seguro no servidor da Web (para acesso do Cliente) e um site seguro no servidor de email (para o Webmail). Solicitações que chegam ao endereço IP público do seu firewall NAT para a porta TCP 443 (HTTPS) só podem ser roteadas para um servidor ou outro.

A solução generalizada para essa situação é ter mais endereços IP públicos. Como os endereços IPv4 estão se tornando escassos, isso também pode ser problemático.

Acabamos trabalhando com a escassez de endereços IP públicos em alguns protocolos na camada de aplicação. Por exemplo, o HTTP / 1.1 adicionou o Host:cabeçalho especificamente para permitir que um servidor da Web hospede vários sites no mesmo endereço IP público. O TLS adiciona a extensão SNI ( Server Name Indication ) para permitir a seleção do certificado apropriado com base no nome do host inserido pelo cliente remoto.

Fazer esse tipo de solução alternativa na camada de aplicativos significa que cada protocolo da camada de aplicativos precisaria de sua própria "correção" (e todo o servidor e software cliente precisaria implementar essa "correção"). Essa é uma tarefa difícil.

Em vez de modificar o protocolo da camada de aplicação, alguns protocolos são facilmente passíveis de serem "multiplexados" entre vários hosts usando um software que pode "rotear" solicitações. Isso provavelmente vai além do que um simples firewall NAT é capaz, porque os pacotes precisam ser inspecionados na camada do aplicativo. O uso de um proxy reverso como o nginx é um bom exemplo desse tipo de "multiplexação" (ou regras de publicação na Web no Forefront TMG ou ISA Server em um ambiente Microsoft) para o protocolo HTTP. Em teoria, qualquer protocolo pode ser multiplexado por meio de um proxy reverso, mas quanto mais esotérico o protocolo, maior a probabilidade de você falar sobre a criação de código personalizado.

Quando você precisa oferecer o mesmo serviço de dois hosts diferentes em um único endereço IP público, sempre tem a opção de mover um dos hosts para uma porta não padrão. Isso exigirá que os clientes estejam cientes da porta não padrão, no entanto. No caso de HTTP (S), isso resulta em URLs com a http://example.com:XXXnotação (onde XXXé o número da porta não padrão). Se isso seria problemático em sua situação, é algo que somente você pode decidir. (Minha experiência demonstrou que praticamente nenhum usuário final é capaz de lidar com a :XXXnotação de porta em qualquer URL que precise inserir manualmente.)


1
Solução alternativa, não "corrigir". :)
Michael Hampton

@MichaelHampton - Eu te ouço! > smile <
Evan Anderson

@EvanAnderson Obrigado pela sua resposta. Acho que estraguei tudo porque estava acostumado a trabalhar com o ForeFront, uma tarefa que me pareceu normal. Você conhece alguma distribuição de firewall Linux com esse recurso que funcione na camada de aplicativos? Eu olhei para Shorewall ainda, mas não tenho certeza se ele é capaz de fazer isso porque é baseado em iptables, que é, como você mencionou, na camada de ip.
Atrotygma

5

O recurso "Port Forwarding" pode permitir que você envie o tráfego destinado a: 80 e: 443 a 192.168.124.30 e as portas restantes (ou apenas aquelas que o servidor de email está configurado para usar) para 192.168.124.32. Se, por algum motivo, você precisar de uma dessas duas portas para o servidor de email e para o servidor da Web, você está com problemas. Para que esse método funcione, qualquer acesso da Web ao servidor de email deve estar em uma porta diferente (provavelmente não padrão). Você provavelmente também configuraria o servidor da Web para redirecionar tudo o que diz " mail.example.com" para usar , para os usuários que não sabem como acrescentar o número da porta e / ou especificar a conexão segura. (Você está indo para usar conexões de web única seguras ao servidor de correio, certo?)https://mail.example.com:other_port

Isso está na camada Transporte, e não na camada Aplicativo, o que significa que não precisa depender de inspeção profunda de pacotes. Em vez disso, ele pode procurar um local fácil de encontrar no cabeçalho TCP da porta.


3

Se suas "solicitações de entrada" são coisas diferentes, como tráfego da Web (HTTP) para o servidor da Web e tráfego de email (SMTP) para o servidor de email, isso pode ser feito: o HTTP usa a porta TCP 80 (443 para HTTPS), enquanto o SMTP usa a porta TCP 25; portanto, do mesmo endereço IP público, você pode encaminhar o tráfego HTTP para o servidor da Web e o tráfego SMTP para o servidor de email; é isso que significa "encaminhamento de porta". Qualquer firewall decente é capaz disso.

No entanto, se por acaso os dois servidores precisarem aceitar o mesmo tipo de tráfego, se o servidor de email também hospedar um serviço de webmail, você estará com problemas, pois poderá encaminhar portas específicas (80 e / ou 443) apenas para um único servidor; para separar o tráfego da Web com base no nome que o cliente usou para solicitá-lo, você precisa de algo operando em um nível superior ao TCP / IP, como um proxy reverso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.