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

17

This is a Canonical Question about NAT and DNS

Atualmente, estou tentando configurar uma rede com uma DMZ contendo um servidor da Web e um servidor de e-mail separado da Internet por um firewall NAT (conversão de endereço de rede).

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 eu 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 domínio example.com para resolver os example.com e mail.example.com do meu endereço IP público.

Gostaria que meu firewall NAT enviasse todas as solicitações recebidas para example.com para o servidor da web em 192.168.124.30 e todas as solicitações recebidas para mail.example.com para o servidor de e-mail em 192.168.124.32. Eu vejo um recurso "encaminhamento de porta" na configuração do meu firewall NAT, mas parece que não consigo alcançar o que estou procurando.

    
por Atrotygma 08.07.2013 / 15:57

3 respostas

17

Você está ficando confuso ao pensar sobre como a informação flui entre as camadas da pilha do protocolo TCP / IP - entre o DNS e os protocolos da camada de aplicação, especificamente.

Você tem um endereço IP público. Seu DNS certamente pode resolver os mail.example.com e example.com para o mesmo endereço IP público.

Em geral, os datagramas IP contendo solicitações para o 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 magicamente "saber" qual hostname o cliente remoto resolveu, já que ambos os nomes de host resolvem o mesmo endereço IP. A camada IP não está ciente do nome do host usado na camada do 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 seu firewall NAT para enviar solicitações recebidas para a porta TCP 80 (HTTP) para o servidor da Web enquanto envia porta TCP de entrada 25 (SMTP) para o seu servidor de email.

Se, no entanto, você planeja hospedar o mesmo serviço em ambas as máquinas, essa estratégia se torna problemática. Suponha que você irá hospedar um site seguro em seu servidor da Web (para acesso do Cliente) e um site seguro em seu servidor de e-mail (para webmail). As 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 esta situação é ter mais endereços IP públicos. Porque os endereços IPv4 estão se tornando escassos, o que também pode ser problemático.

Acabamos trabalhando em torno da escassez de endereços IP públicos em alguns protocolos na camada de aplicação. Por exemplo, o HTTP / 1.1 adicionou o cabeçalho Host: 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 Indicação do nome do servidor (SNI) 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 aplicativo significa que todo protocolo da camada de aplicativo precisaria de sua própria "correção" (e, em seguida, todo o software do servidor e do 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 múltiplos hosts usando software que pode "rotear" requisições. Isso provavelmente vai além do que um simples firewall NAT é capaz, porque os pacotes precisam ser inspecionados na camada de aplicação. Usando um proxy reverso como nginx é um bom exemplo desse tipo de "multiplexação" (ou regras de publicação na Web no Forefront TMG ou no ISA Server em um ambiente Microsoft) para o protocolo HTTP. Em teoria, qualquer protocolo poderia ser multiplexado por meio de um proxy reverso, mas quanto mais esotérico for o protocolo, maior a probabilidade de você estar falando sobre como ter código personalizado escrito.

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 notação http://example.com:XXX (em que XXX é o número de porta não padrão). Se isso seria problemático na sua situação é algo que só você pode decidir. (Minha experiência mostrou que praticamente nenhum usuário final é capaz de manipular a notação :XXX port em qualquer URL que tenha que inserir manualmente.)

    
por 08.07.2013 / 17:11
5

Seu recurso "Port Forwarding" permite que você envie tráfego destinado a: 80 e: 443 a 192.168.124.30 e as portas restantes (ou apenas aquelas que seu 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 e-mail, bem como para o servidor da Web, estará com problemas. Para esse método funcionar, qualquer acesso da Web ao seu servidor de e-mail teria que estar em uma porta diferente (provavelmente não-padrão). Provavelmente, você também configuraria o servidor da Web para redirecionar qualquer coisa que dissesse " mail.example.com " para usar https://mail.example.com:other_port , para os usuários que não sabem como anexar o número da porta e / ou especificar a conexão segura. (Você está usando apenas conexões seguras da Web com o servidor de e-mail, certo?)

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

    
por 08.07.2013 / 17:45
3

Se suas "solicitações de entrada" forem coisas diferentes, ou seja, tráfego da web (HTTP) para o servidor web e tráfego de email (SMTP) para o servidor de email, isso pode ser feito: HTTP usa a porta TCP 80 (443 para HTTPS) , enquanto o SMTP usa a porta TCP 25; assim, a partir do mesmo endereço IP público, você pode encaminhar o tráfego HTTP para o seu servidor web e o tráfego SMTP para o seu servidor de email; isso é o 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, por exemplo, se o seu servidor de e-mail também hospedar um serviço de webmail, você terá 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.

    
por 08.07.2013 / 19:29