Qual é o número máximo de IPs que um registro DNS A pode ter?

30

Eu tenho uma ideia estranha - permitir que várias pessoas / organizações hospedem o mesmo aplicativo e deixar todos os seus nós acessíveis por meio de um único nome de domínio. Isso é para ter, digamos, uma rede social realmente distribuída, onde a usabilidade não é sacrificada (ou seja, os usuários não precisam se lembrar de URLs de provedores diferentes e, quando um provedor desce, alternar para outro)

Para conseguir isso, achei que um registro DNS com vários IPs pode ser usado.

Então, quantos IPs podem conter um único registro de DNS? Esta resposta diz que é em torno de 30, mas o usecase lá é diferente. Para o cenário acima, eu não me importaria se um determinado ISP armazenasse apenas 30, contanto que outro ISP armazene outros 30, e assim por diante.

    
por Bozho 12.12.2014 / 22:47

8 respostas

75

Disclaimer: Sem ofensa, mas esta é realmente uma má idéia. Eu não recomendo que alguém faça isso na vida real.

Mas se você der a um cara de TI entediado um laboratório, coisas engraçadas vão acontecer!

Para este experimento, usei um servidor DNS da Microsoft em execução no Server 2012 R2. Devido às complicações de hospedar uma zona DNS no Active Directory, criei uma nova zona primária chamada testing.com que não é não integrada ao AD.

Usando este script:

$Count = 1
for ($x = 1; $x -lt 256; $x++)
{
    for ($y = 1; $y -lt 256; $y++)
    {
        for ($z = 1; $z -lt 256; $z++)
        {
            Write-Host "1.$x.$y.$z't( $Count )"
            $Count++
            dnscmd . /RecordAdd testing.com testing A 1.$x.$y.$z
        }
    }
}

Eu comecei a criar, sem erro, 65025 registros de host para o nome testing.testing.com. , com literalmente todos os endereços IPv4 de 1.1.1.1 a 1.1.255.255.

Então, eu queria ter certeza de que eu conseguiria quebrar 65536 (2 ^ 16 bit) número total de registros A sem erro, e eu poderia, então eu presumo que provavelmente poderia ter ido até 16581375 (1.1. 1.1 a 1.255.255.255,) mas eu não queria sentar aqui e assistir esse roteiro rodando a noite toda.

Então,achoqueésegurodizerquenãohálimitepráticoparaonúmeroderegistrosAquevocêpodeadicionaraumazonaparaomesmonomecomIPsdiferentesnoseuservidor.

Masseráqueelefuncionadaperspectivadocliente?

AquiestáoquerecebodomeuclienteconformevisualizadopeloWireshark:

(Abra a imagem em uma nova guia do navegador para aumentar o tamanho.)

Como você pode ver, quando uso nslookup ou ping do meu cliente, ele emite automaticamente duas consultas - uma UDP e uma TCP. Como você já sabe, o máximo que eu posso colocar em um datagrama UDP é de 512 bytes, então, quando esse limite é excedido (como 20-30 endereços IP), é preciso usar o TCP. Mas, mesmo com o TCP, eu só recebo um pequeno subconjunto de registros A para testing.testing.com. 1000 registros foram retornados por consulta TCP. A lista de registros A gira 1 corretamente com cada consulta sucessiva, exatamente como você esperaria que o DNS round-robin funcionasse. Levaria milhões de consultas para round robin através de todos estes.

Não vejo como isso ajudará você a criar sua rede de mídia social flexível e flexível, mas ainda assim existe a sua resposta.

Editar: No seu comentário de acompanhamento, você pergunta por que eu acho que isso geralmente é uma má ideia.

  • Digamos que eu seja um usuário médio da Internet e gostaria de me conectar ao seu serviço. Eu digito www.bozho.biz no meu navegador. O cliente DNS no meu computador recebe 1000 registros. Bem, má sorte, os primeiros 30 registros da lista não respondem, porque a lista de registros A não é mantida atualizada, ou talvez haja uma interrupção em grande escala afetando uma parte da Internet. Digamos que meu navegador tenha um tempo limite de 5 segundos por IP antes de ser ativado e tente o próximo. Então, agora estou sentado aqui olhando para uma ampulheta giratória por dois minutos e meio esperando que seu site seja carregado. Ninguém tem tempo para isso. E estou apenas supondo que meu navegador da Web ou qualquer aplicativo que eu use para acessar seu serviço tentará mais do que os primeiros 4 ou 5 endereços IP. Provavelmente não vai.

  • Se você usasse a limpeza automática e permitisse atualizações não validadas ou anônimas para a zona DNS, na esperança de manter a lista de registros A atualizada ... imagine como isso seria inseguro! Mesmo se você projetou algum sistema em que os clientes precisavam de um certificado TLS de cliente que recebessem de você antecipadamente para atualizar a zona, um cliente comprometido em qualquer lugar do planeta inicia um botnet e destrói seu serviço. O DNS tradicional é precariamente inseguro como é, sem o crowdsourcing.

  • Uso e desperdício de largura de banda enorme. Se cada consulta de DNS exigir 32 kilobytes ou mais de largura de banda, isso não será bem dimensionado.

  • O round-robin de DNS não substitui o balanceamento de carga adequado. Ele não fornece nenhuma maneira de se recuperar de um nó que desce ou fica indisponível no meio das coisas. Você vai instruir seus usuários a fazer um ipconfig / flushdns se o nó ao qual eles estavam conectados cair? Esses tipos de problemas já foram resolvidos por coisas como GSLB e Anycast.

  • Etc.

por 13.12.2014 / 00:59
18

Para responder à pergunta como foi declarada ("quantos IPs um único registro de DNS pode manter?"), a resposta é muito simples: um único registro A contém exatamente um endereço. No entanto, pode haver vários registros A para o mesmo nome.

    
por 13.12.2014 / 02:04
10

Cada endereço IPv4 ocupará 16 bytes na resposta. Cada endereço IPv6 ocupará 28 bytes na resposta.

É altamente recomendável garantir que a resposta caiba em 512 bytes. Isso permitiria cerca de 25 endereços IPv4 e 14 endereços IPv6 (considerando que você também precisa de outras informações no pacote). O limite exato depende do tamanho do seu nome de domínio.

Se você tiver 25 endereços IPv4 e 14 endereços IPv6, estará contando com os clientes que solicitam endereços IPv4 e IPv6 em consultas separadas. Se o cliente pedir os dois tipos de endereços em uma única consulta (o que é raro), você teria que diminuir.

Se o tamanho da resposta exceder 512 bytes, ele ainda poderá funcionar em UDP se o cliente e o servidor oferecer suporte a EDNS. Sem o EDNS, o cliente receberia uma resposta truncada e teria que tentar novamente pelo TCP. Isso aumenta a comunicação de 1 a 4 roundtrips. Mas, pior ainda, às vezes existem configurações incorretas impedindo o funcionamento do DNS sobre TCP.

Mesmo que você consiga inserir mais de 14 endereços na resposta sem causar problemas na camada DNS, é improvável que seja muito útil. O tempo limite usado pelo cliente antes de desistir de um endereço e prosseguir para o próximo é geralmente significativo.

Ter que aguardar esse tempo limite uma vez pode levar a uma experiência insatisfatória do usuário. Se o cliente tivesse que passar por 14 endereços antes de obter uma resposta, o usuário teria que esperar por 13 timeouts.

    
por 13.12.2014 / 00:57
5

O que você está descrevendo não é uma ideia especialmente nova. Como outras respostas já foram abordadas, você está limitado em quantos registros A você pode ter em uma resposta, mas isso não diz nada sobre quantos registros A podem existir no total.

Você poderia, por exemplo, implementar um servidor DNS que responde a qualquer consulta de um registro A com um IP aleatório. Consultado o suficiente, isso resultaria em 4294967296 registros A únicos: um para cada endereço IPv4.

Como eu disse, isso não é uma ideia nova. De fato, é em parte como a Akamai funciona (e provavelmente muitos outros CDNs). O registro A que você recebe para qualquer domínio da Akamai é determinado por seus servidores DNS de magia negra. Aposto que a resposta obtida depende do equilíbrio dinâmico de carga e das preocupações geográficas.

Por exemplo, eu escolhi a338.g.akamaitech.net. Se eu olhar para isso no meu computador agora, que usa um servidor de nomes atribuído pela DHCP da Comcast:

$ host a338.g.akamaitech.net
a338.g.akamaitech.net has address 23.3.98.65
a338.g.akamaitech.net has address 23.3.98.89

E se eu perguntar ao DNS do Google?

$ host a338.g.akamaitech.net 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

a338.g.akamaitech.net has address 23.3.96.152
a338.g.akamaitech.net has address 23.3.96.120

Aposto que se você tentar, aposto que receberá uma resposta diferente. Quantos servidores de borda a Akamai atende a algum recurso específico? Mais de dois, aposto.

    
por 13.12.2014 / 14:21
2

Outros mencionaram isso como um detalhe, mas do ponto de vista prático, o limite rígido é o limite de tamanho de pacote UDP de 512 bytes. Embora seja possível alternar para o TCP quando o truncamento é detectado, na prática muitos / a maioria dos clientes não o fará (e, sem dúvida, eles não deveriam; isso daria uma experiência ruim para a maioria dos aplicativos, e eu esperaria apenas transferências de zona ou outras pesquisas de propósito especial para suportar TCP). Então você está olhando para um limite de cerca de 30 endereços para IPv4 (registros A) e um pouco menos para IPv6 (AAAA), uma vez que são maiores. O tamanho do nome do domínio é reduzido e isso limitará ainda mais o número.

    
por 14.12.2014 / 02:47
0

Como outros apontaram, é uma ideia terrível para o uso no mundo real.

No mundo real, há clientes e resolvedores que não estão em conformidade e que apresentam problemas com respostas que não podem caber em um único datagrama UDP, e há firewalls que impõem idéias específicas, mas não compatíveis com protocolo, sobre limites de tamanho de mensagem DNS.

E mesmo se você pudesse contar com sua enorme resposta em todos os casos (o que você enfaticamente não consegue) há outra razão pela qual essa é uma Idéia Muito Ruim. Quanto maior o tamanho da resposta do DNS, mais tentadora ela é como carga útil para ataques de reflexão, pois você fornece um grande fator de amplificação. Nesse tipo de ataque de negação de serviço, comum no DNS, uma consulta UDP é enviada para um resolvedor recursivo aberto. O endereço de origem das consultas UDP é geralmente falsificado e o invasor configura a fonte de consulta para o IP do destino pretendido. Dois efeitos desejáveis (para o invasor) são obtidos: primeiro - um esforço de envio relativamente pequeno da parte deles (de uma pequena consulta falsificada) resulta em uma torrente relativamente grande de tráfego indesejado chegando ao alvo (esse é o fator de amplificação), e segundo - a fonte real do ataque está escondida do alvo; o alvo só conhece os endereços dos resolvedores recursivos usados como refletores.

    
por 15.12.2014 / 07:02
0

Ponto interessante de curiosidades históricas sobre este assunto. Nos anos 90, a AOL expandiu seus registros DNS de forma que uma consulta MX retornasse > 512 bytes. Isso violou o RFC, quebrou um monte de servidores SMTP (qmail sendo um popular na época), e causou muita dor de cabeça sysadmins. A correção exigia correção ou adição de rotas estáticas.

Eu não sei qual é a situação atual, mas há alguns anos, quando toquei o qmail pela última vez, os patches ainda estavam no lugar.

link

    
por 17.12.2014 / 14:25
0

A resposta curta: cerca de 25 registros A cabem em um pacote UDP. Além disso, o DNS mudará para TCP e não será tão rápido. Você também terá problemas com clientes que não estão usando resolvedores de DNS capazes de escolher o IP "mais próximo". Além disso, com wifi e celular, o "mais próximo" geralmente não será o servidor certo.

Resposta mais longa:

Não faça isso. Uma maneira melhor seria configurar registros CNAME individuais para cada usuário que apontasse para o servidor apropriado. Digamos que você tenha dois servidores, server-f e server-r usados para o IMAP. Configure o cliente IMAP de cada pessoa com o nome do servidor sendo USERNAME.imap.example.com, em que "USERNAME" é substituído por seu nome de usuário de email. Agora você pode mover pessoas entre servidores sem ter que reconfigurar seu cliente de e-mail.

server-f.example.com. IN A 10.10.10.10 server-r.example.com. IN A 10.20.20.20 wilma.imap.example.com. IN CNAME server-f.example.com. fred.imap.example.com. IN CNAME server-f.example.com. betty.imap.example.com. IN CNAME server-r.example.com. barney.imap.example.com. IN CNAME server-r.example.com.

No entanto, se você fizer isso, ALTAMENTE RECOMENDO QUE você gere os registros DNS automaticamente de um banco de dados de usuários. Você quer ter certeza de que, como contas são criadas e excluídas, os registros DNS também são criados e excluídos. Caso contrário, você vai acabar com uma bagunça e muita confusão.

Eu já vi isso feito em empresas com milhares de usuários e, desde que as coisas foram automatizadas, o mundo está muito bem.

    
por 17.12.2014 / 18:52