Meu registro DNS só pode apontar para um endereço IP. Como faço para alcançar uma porta?

10

Eu sou bastante novo na administração de rede e, portanto, já estou empolgado por ter configurado com êxito um registro DNS.

Agora estou um pouco confuso, porque gostaria de ter este URL:

http://www.example.org:8080/fetch/characters/

ser realmente alcançado por este

http://www.example.org/fetch/characters/

Assim, os usuários podem acessar o serviço na porta 8080 sem precisar definir explicitamente a porta.

Como posso fazer isso? Preciso de algum aplicativo especial no meu servidor? Ou algum material de redirecionamento a ser aplicado a solicitações?

xetra11
fonte
4
O navegador por padrão não acessa a porta 8080. Isso é um erro ao digitar a pergunta?
Džuris
equívoco do que é um DNS e o que ele faz.
CONvid19
@ Džuris Na que foi um erro de me pensar 8080 é o http padrão em vez de 80
xetra11

Respostas:

32

Os registros DNS não podem apontar para portas (com algumas exceções especiais de casos que não se aplicam aqui).

Se você tiver um serviço da Web que escuta na porta 8080 e deseja alcançá-lo sem especificar essa porta, você tem 3 opções:

  • Faça realmente ouvir na porta 80 (ou 443 com https).
  • Configure o que já está escutando na porta 80 para encaminhar solicitações ao seu serviço na porta 8080 (proxy reverso).
  • Se você pode viver com um redirecionamento, use-o em vez de um proxy, mas seus clientes verão a :8080parte em suas barras de endereço após o redirecionamento.
Sven
fonte
10
E se pudéssemos usar registros SRV e especificar portas para serviços ... Navegadores muito ruins não usam isso.
27418 Jacob Jacob Evans
4
@ JacobEvans: Registros SRV para tudo é um velho sonho meu. Não faria coisas muito mais fácil (exceto para administradores de firewall, que agora pode simplesmente bloquear tudo, exceto 80 e 443)
Sven
Registros SRV funcionam muito bem para alguns serviços, como XMPP ... mas infelizmente não muitas (e não HTTP com certeza)
Josh
Opção 4: porta para a frente por um firewall
Joel Coei
10

Servidores da Web escutam a porta TCP 80 por padrão. Se você não deseja digitar o número da porta no URL explicitamente, você tem algumas opções:

  • Você pode reconfigurar seu servidor da web para usar a porta 80 em vez da porta 8080. Isso é recomendado para servidores da web como nginx ou Apache, mas não para servidores da web como o Gunicorn. Essa opção também nem sempre é possível, pois essa porta já pode estar em uso por um servidor da web diferente.

    Além disso, quando o servidor está atrás de um gateway NAT, ele não possui o endereço IP público e a combinação desse endereço NAT público e da porta 80 já pode ser encaminhada para um servidor Web diferente.

  • Você pode colocar um servidor proxy reverso na frente do servidor da Web que aceita o tráfego na porta TCP 80 e o envia para o servidor da Web na porta 8080 TCP. Isso também funcionará se a porta 80 já estiver em uso. Basta colocar o servidor proxy reverso na frente dos dois servidores Web, fazendo com que ambos escutem portas diferentes de 80.

Para fornecer ajuda melhor e mais detalhada sobre qual opção pode ser melhor e as limitações, etc., precisamos saber mais sobre sua configuração. Espero que essa explicação já tenha esclarecido um pouco as coisas.

Tommiie
fonte
Já tenho as informações de que preciso! Eu confundi a porta da web padrão 80 com 8080
xetra11 17/11
7

Resposta simples, relacionada ao nível da pergunta

Ignorando usos exóticos do DNS e também revertendo a pesquisa do DNS (não relevante para a pergunta), quase todo o uso do DNS é da forma:

  1. O cliente envia o nome de domínio (totalmente qualificado ou não) para um servidor DNS
  2. Servidor DNS retorna informações de domínio de seus registros. Normalmente, as principais informações solicitadas são o endereço IP para se comunicar com a web / email nesse domínio ou o endereço IP de outro servidor DNS com maior capacidade de fornecer essas informações.

Depois que o cliente entrar em contato com o servidor, o próprio servidor assumirá o controle e o sistema DNS desaparecerá de cena.

O que isso significa é que o sistema DNS não precisa fornecer informações de porta e quase nunca o faz. Portanto, embora o objetivo da pergunta seja válido, e com frequência feito, não é realmente o sistema DNS que o faz. É por isso que você não consegue resolver isso :)

A idéia é que, uma vez que seu cliente possa localizar a máquina ou servidor específico que ele está procurando, cabe a ela escutar as portas que escolher e aceitar / negar / responder a quaisquer protocolos nas portas configuradas.

Por exemplo, os serviços web HTTP geralmente são fornecidos na porta 80. Isso significa que, uma vez que o cliente conheça o IP de uma máquina, é possível assumir que o envio de uma mensagem para a porta 80 fará com que a mensagem seja lida / respondida pelo serviço web da máquina. Mas não precisa ser assim. Se o servidor estiver configurado para receber solicitações de entrada da Web na porta 9000, qualquer cliente capaz de acessar a porta 9000 poderá acessar seu serviço da Web. Se o servidor estiver protegido por um proxy / NAT / roteador que redirecione a porta 10000 para a porta 9000 e o cliente enviar uma solicitação da Web na porta 10000, o servidor receberá na porta 9000 e responderá também.

Redirecionar / mapear dentro do servidor web

Você perguntou sobre o mapeamento de redirecionamento ou reescrita em um comentário. Essas são funções que um servidor da web pode executar. Basicamente, você pode configurar o servidor da Web (ou a maioria / muitos servidores da Web) para gerenciar como ele lida com a URL que recebe em uma solicitação. Portanto, ele pode modificar internamente o URL no recebimento para fazer com que URLs diferentes sejam manipulados da mesma maneira, ou corrigir erros de digitação comuns (mapeamento), ou pode realmente responder para pedir ao próprio cliente que peça uma segunda vez, usando algum URL de substituição diferente (redirecionar).

Eles têm seus usos e, em princípio, podem lidar com seu caso de uso, mas não parecem a solução "certa" para você, por estes motivos:

  1. Eu não acho que o mapeamento ajudaria em tudo . O mapeamento é quase totalmente interno ao servidor da web, diz "trate esse URL como se fosse esse URL". Por exemplo, você pode usar o mapeamento de URL do servidor da Web para permitir que um usuário consulte um fórum usando URLs muito antigos, antigos e atuais (para conveniência do usuário) usando " https://example.com/index.php?area-=forum&topic = 2 ", também" https://example.com/forum.php?topic=2 "e também" https://forum.example.com?topic=2"e lide com isso apenas uma vez, mapeando os dois primeiros para o terceiro URL internamente, como a primeira etapa no tratamento da consulta. Como isso afeta o caminho da consulta e não o IP / porta, o mapeamento não é muito útil para gerenciamento de portas e, no seu caso, o cliente nunca realmente consulta o 8080.
  2. Redirecionar funcionaria, mas pode não ser o que você deseja . O redirecionamento no servidor da Web depende do servidor da Web realmente recebendo a consulta (porque essas são funções internas do servidor da Web). Portanto, o servidor da Web precisaria escutar na porta 80 de qualquer maneira para obter a consulta original, para responder com o redirecionamento / mapa. Seria também tem que escutar na porta 8080. Funcionalmente, seria necessário uma regra de redirecionamento ter que dizer qualquer porta consulta cliente 80, para consultá-lo novamente usando o ": 8080" URL, que não soa como o que você quer Faz. O usuário também veria o novo URL com ": 8080", enquanto parece que você deseja que ele seja "transparente" e não mostrado.
  3. O redirecionamento também funcionaria apenas para redirecionar uma porta padrão (80 ou 443) - você não pode redirecionar a porta 2000 para 8080, por exemplo, porque o cliente não consultaria o 2000 por padrão, em primeiro lugar, portanto nunca acesse o servidor da Web, mesmo que estivesse ouvindo em 2000. Porém, isso pode não ser um problema para você.

No entanto, se você desejar o redirecionamento "inteligente", onde apenas determinadas consultas são redirecionadas para 8080, esse pode ser o caminho a seguir, porque o redirecionamento pode incluir lógica para decidir quais URLs devem ser redirecionados, enquanto o mapeamento de portas (abaixo) mapeia tudo .

Como fazê-lo corretamente

A resposta para sua pergunta é: você deseja que o servidor da Web responda às solicitações da Web que o cliente envia para a porta padrão (80/443), mas que o servidor realmente recebe na porta 8080.

Isso significa que, como você pode ver, você precisa de algo que mapeie as portas entre cliente e servidor . Dessa forma, o cliente envia na porta 80 (porta padrão usada pelos navegadores da web), mas na verdade é recebida na porta 8080 pelo servidor da web. É claro que você precisará configurar o servidor da Web para escutar na porta 8080, pois isso não é padrão, mas é fácil e qualquer servidor da Web deve poder ter suas portas de escuta especificadas.

A maneira mais comum de fazer isso seria dentro do roteador / firewall, através do mapeamento de portas.

Em termos simples, para fazer isso, é dada ao roteador uma regra: qualquer coisa recebida que possua um IP de destino e uma porta de destino = 80 deve ser passada para a LAN com a porta de destino alterada para 8080. Nem o servidor da Web nem o cliente estarão cientes da alteração (ela é 100% tratada pelo roteador), portanto será 100% transparente para os dois. O cliente não terá ": 8080" em sua URL e não precisará redirecionar nada, pois consulta a porta 80 e o servidor da Web pode ignorar a porta 80 e escutar apenas no 8080, pois nunca recebe consultas na porta 80 .

Se você deseja uma maneira simples e direta, semelhante ao que um "DNS para portas" faria, esse provavelmente é o equivalente mais próximo do que você está solicitando na sua pergunta.

Stilez
fonte
Costumo ouvir sobre o mapeamento de redirecionamento ou reescrever? estas soluções também?
xetra11
Essas são modificadores que chutar em dentro do servidor web, no processamento de ordem do cliente. Portanto, se o servidor da Web suportar, você poderá responder automaticamente a qualquer consulta na porta 80, com um redirecionamento HTTP para o mesmo URL na porta 8080 - afinal, o redirecionamento HTTP / 80 -> HTTPS / 443 é praticamente a mesma coisa. Mas ele deve receber a consulta primeiro, para que não funcione nas portas que não foram configuradas para escutar, e o cliente provavelmente vê a URL modificada: 8080. Fazê-lo por meio de mapeamento da porta faz com que seja 100% invisível para o cliente, uma vez que sempre apenas utilizar a porta 80 (8080 é de 100% apenas interno)
Stilez
Adicionei a seção "Redirecionamento / mapeamento no servidor da web" e ampliei a última seção para cobrir sua pergunta com mais detalhes. Espero que eles ajudem!
Stilez
3

Você não pode.

Quero dizer, tecnicamente isso poderia ser feito. O DNS é famoso por poder enviar um nome de domínio e obter um endereço IP. No entanto, estudei um pouco o protocolo DNS, e realmente o DNS é tecnicamente capaz de agir como um mecanismo de consulta / resposta para muito mais do que apenas nomes de domínio e endereços IP. Uma abordagem possível seria usar um registro de recurso DNS que não seja do tipo A ou AAAA típico, como um registro TXT (que é tecnicamente apenas texto e poderia ser usado para qualquer coisa) ou talvez um registro SRV ou qualquer outro novo tipo de registro de recurso que você escolher.

Se você estiver criando seu próprio software (cliente e servidor), pode não haver razão técnica para não fazer isso, exceto saber que algumas pessoas usam empresas de hospedagem DNS e limitam-nas a usar apenas determinados tipos de registro. Isso é lamentável, pois as pessoas que executam seus próprios servidores DNS certamente têm flexibilidade suficiente para essas coisas.

No entanto, se você não está criando seu próprio protocolo de rede (por exemplo, se deseja usar HTTP), é provável que encontre um problema grave: o software existente não usará sua solução personalizada, a menos que você use soluções já estabelecidas. Essa será a barreira. Não é uma impossibilidade técnica. Uma barreira social: você pode convencer todos a fazer as coisas do seu jeito?

Agora que expliquei por que você não pode fazer isso, posso ter uma solução para o que você procura. Primeiro, vamos dar uma olhada no porquê de termos endereços e portas IP.

Endereços IP e portas fazem coisas diferentes. O objetivo do endereço IP é cumprir os objetivos das Camadas 2 e 3 do Modelo OSI de comunicações em rede. O objetivo do endereço IP é identificar para qual computador o tráfego deve ir. O fato de podermos usar um número de porta para esse fim, fazendo com que firewalls / roteadores investigem os números de porta para executar o NAPT (tradução baseada em porta de endereço de rede, também chamada de PNAT ou apenas NAT), é uma técnica mais recente que utiliza um recurso (informações), mas não fazia parte do design original. Se nos afastarmos desse "abuso" dos números de porta por um minuto e considerarmos o design original, poderemos encontrar uma solução mais fácil. Pelo design da Internet, as máquinas foram feitas para serem encontradas usando endereços IP.

O ponto de um "número da porta", usado pelo TCP e UDP e algumas alternativas, é poder acompanhar as conversas individuais. Isso ajuda a alinhar a comunicação com os programas em execução. Portanto, se uma máquina receber tráfego na porta TCP 80, ela saberá que o tráfego de rede deve ser usado pelo programa que é o servidor da web. Se um navegador da Web baixa vários gráficos simultaneamente, combinações de números de "porta de origem" e "porta de destino" podem rastrear quais dados se destinam a cada gráfico, para que essas conversas simultâneas possam ocorrer sem misturar os dados.

Agora, meu palpite é que você tem acesso a um servidor DNS, e parece que você acha que a administração do DNS seria conveniente para lidar com um pouco mais do roteamento de tráfego. Mas o DNS não parece capaz de ajudá-lo a obter um número de porta. O que você pode fazer?

Considere o IPv6. O IPv6 permite que você tenha muito mais endereços IP. Além disso, diferentemente de algumas implementações do IPv4, os dispositivos que usam o IPv6 geralmente podem suportar facilmente vários endereços IPv6 ativos ao mesmo tempo. Portanto, se você quiser ter três protocolos de rede diferentes em um computador, poderá atribuir pelo menos três endereços IPv6 diferentes ao mesmo computador. E então você pode fazer as travessuras de roteamento que desejar com esses endereços IPv6.

Em seguida, você pode usar o tipo de registro de recurso AAAA para atribuir um nome ao endereço IPv6, que seu design de rede pode tratar como sendo efetivamente dedicado ao serviço específico no computador específico que você deseja.

Wallah, agora você tem o DNS apontando efetivamente para o software e cumpriu esse objetivo sem precisar confiar em apontar o DNS para um número de porta, o que não funciona bem simplesmente porque essa funcionalidade simplesmente não é comum. suportado.

Possível objeção:
E se você se sentir preso ao IPv4 e achar que o IPv6 de alguma forma não é suportado, eu o encorajaria a tentar resolver esse problema. Esse problema provavelmente será mais fácil de corrigir (talvez usando algum tipo de encapsulamento) e provavelmente acabará sendo uma correção mais gratificante depois que você o implementar.

TOOGAM
fonte
O IPv6 é sempre bom para oferecer suporte, mas não ajudará se, por algum motivo, você tiver permissão para usar a porta 80 (ou 443).
Paŭlo Ebermann 17/11
Isso é verdade, mas se o DNS conseguisse transmitir um número de porta, isso também não funcionaria em um firewall que bloqueia o tráfego em um número de porta específico. Além disso, minha explicação de como usar o IPv6 foi realmente apenas uma parte da resposta, e acredito que as partes anteriores da minha resposta abordam a questão.
TOOGAM