Qual è il numero massimo di IP che un record DNS A può avere?


30

Ho una strana idea: consentire a più persone / organizzazioni di ospitare la stessa applicazione e consentire a tutti i loro nodi di essere accessibili tramite un singolo nome di dominio. Questo per avere, diciamo, un social network realmente distribuito, in cui l'usabilità non viene sacrificata (cioè gli utenti non devono ricordare i diversi URL del provider e quindi quando un provider si interrompe, passa a un altro)

Per raggiungere questo obiettivo, ho pensato che fosse possibile utilizzare un record DNS con più IP.

Quindi, quanti IP può contenere un singolo record DNS A? Questa risposta dice che sono circa 30, ma il caso è diverso. Per lo scenario di cui sopra non mi importerebbe se un determinato ISP memorizza nella cache solo 30, purché un altro ISP ne memorizzi nella cache altri 30 e così via.


2
Stai prendendo Anycast ?
Lie Ryan,

4
Ho imparato qualche tempo fa che se mai dovessi chiedere "Qual è il numero massimo di X?" probabilmente lo stai usando male ...
LordOfThePigs il

Non necessariamente;) Ma in generale sì
Bozho,

Risposte:


78

Disclaimer: nessuna offesa, ma questa è una pessima idea. Non consiglio a nessuno di farlo nella vita reale.

Ma se dai a un ragazzo IT annoiato un laboratorio, accadranno cose divertenti!

Per questo esperimento, ho usato un server DNS Microsoft in esecuzione su Server 2012 R2. A causa delle complicazioni legate all'hosting di una zona DNS in Active Directory, ho creato una nuova zona primaria denominata testing.com che non è integrata con AD.

Usando questo 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
        }
    }
}

Ho proceduto a creare, senza errori, 65025 record host per il nome testing.testing.com., con letteralmente ogni indirizzo IPv4 dall'1.1.1.1 all'1.1.255.255.

Quindi, volevo assicurarmi di poter superare 65536 (2 ^ 16 bit) numero totale di record A senza errori, e potrei, quindi suppongo che probabilmente avrei potuto arrivare fino al 16581375 (dall'1.1.1.1 al 1.255 .255.255), ma non volevo sedermi qui e guardare questa sceneggiatura girare tutta la notte.

Troppi record

Quindi penso che sia sicuro affermare che non esiste un limite pratico al numero di record A che è possibile aggiungere a una zona con lo stesso nome con IP diversi sul server.

Ma sarà davvero lavorare dal punto di vista di un cliente?

Ecco cosa ottengo dal mio cliente visto da Wireshark:

due domande (Apri l'immagine in una nuova scheda del browser per ingrandirla.)

nslookup

Query TCP

Come puoi vedere, quando utilizzo nslookup o il ping dal mio client, genera automaticamente due query: una UDP e una TCP. Come già sapete, il massimo che posso inserire in un datagramma UDP è di 512 byte, quindi una volta superato tale limite (come 20-30 indirizzi IP), è necessario utilizzare TCP. Ma anche con TCP, ho solo un piccolo sottoinsieme di record A per testing.testing.com. Sono stati restituiti 1000 record per query TCP. L'elenco dei record A ruota di 1 correttamente con ogni query successiva, esattamente come ci si aspetterebbe dal funzionamento del DNS round robin. Ci vorrebbero milioni di domande per completare il robin in tutti questi modi.

Non vedo come questo ti aiuterà a rendere la tua rete di social media estremamente scalabile e resiliente, ma c'è comunque la tua risposta.


Modifica: nel tuo commento di follow-up, chiedi perché penso che questa sia generalmente una cattiva idea.

  • Supponiamo che io sia un utente medio di Internet e vorrei collegarmi al tuo servizio. Digito www.bozho.biz nel mio browser web. Il client DNS sul mio computer ottiene 1000 record. Bene, sfortuna, i primi 30 record dell'elenco non rispondono perché l'elenco dei record A non è aggiornato, o forse c'è un'interruzione su larga scala che colpisce un pezzo di Internet. Supponiamo che il mio browser abbia un timeout di 5 secondi per IP prima di andare avanti e provare quello successivo. Quindi ora sono seduto qui a fissare una clessidra rotante per 2 minuti e mezzo in attesa che il tuo sito si carichi. Nessuno ha tempo per quello. E sto solo supponendo che il mio browser o qualsiasi altra applicazione che utilizzo per accedere al tuo servizio tenterà persino di più dei primi 4 o 5 indirizzi IP. Probabilmente no.

  • Se hai utilizzato lo scavenging automatico e consenti aggiornamenti non convalidati o anonimi alla zona DNS nella speranza di mantenere aggiornato l'elenco dei record A ... immagina quanto sarebbe insicuro! Anche se hai progettato un sistema in cui i client necessitavano di un certificato TLS client che ti avevano ricevuto in anticipo per aggiornare la zona, un client compromesso in qualsiasi parte del pianeta avvierà una botnet e distruggerà il tuo servizio. Il DNS tradizionale è precariamente insicuro com'è, senza procurarsi il crowdsourcing.

  • Enorme utilizzo e spreco della larghezza di banda. Se ogni query DNS richiede 32 kilobyte o più di larghezza di banda, questo non si ridimensionerà affatto.

  • Il round robin DNS non sostituisce il corretto bilanciamento del carico. Non fornisce alcun modo per recuperare da un nodo che scende o diventa non disponibile nel mezzo delle cose. Istruirai i tuoi utenti a fare un ipconfig / flushdns se il nodo a cui erano connessi si spegne? Questo tipo di problemi sono già stati risolti da cose come GSLB e Anycast.

  • Eccetera.


15
Lento .... applauso ....., signore.
mfinni,

4
Per aggiungere questo, se i record A vengono interrogati tramite BIND (che è ciò che è in esecuzione sulla maggior parte dei server DNS), rimescolerà i record A e restituirà una certa quantità di record A da quello. Quel certo numero è definito nel MAX_SHUFFLEcodice sorgente BIND (che per impostazione predefinita è 32).
ub3rst4r,

1
Per curiosità, perché non lo consiglieresti? È certamente una cosa molto strana, ma a parte avere nodi dannosi che servono richieste in un dominio "buono" e nodi non riusciti ricevono ancora richieste, cos'altro può andare storto :-)
Bozho,

Inoltre, l'esperienza dell'utente non cambierebbe? Ogni nodo è una replica completa? Come assicureresti che sia se sono sotto il controllo di altre persone? Se sono diversi, le persone avranno un sito oggi e un altro sito domani. Personalmente, questo mi farebbe impazzire!
Brandon,

18

Per rispondere alla domanda come è stato indicato ("quanti IP può contenere un singolo record DNS A?") La risposta è molto semplice: un singolo Arecord contiene esattamente un indirizzo. Tuttavia, possono esserci più Arecord con lo stesso nome.


10

Ogni indirizzo IPv4 occuperà 16 byte nella risposta. Ogni indirizzo IPv6 occuperà 28 byte nella risposta.

Si consiglia vivamente di assicurarsi che la risposta si adatti a 512 byte. Ciò consentirebbe circa 25 indirizzi IPv4 e 14 indirizzi IPv6 (considerando che nel pacchetto sono necessarie anche altre informazioni). Il limite esatto dipende dalla lunghezza del tuo nome di dominio.

Se si dispone di 25 indirizzi IPv4 e 14 indirizzi IPv6, si contano i client che richiedono indirizzi IPv4 e IPv6 in query separate. Se il client richiede entrambi i tipi di indirizzi in una singola query (cosa rara), dovresti andare più in basso.

Se la dimensione della risposta supera 512 byte, potrebbe funzionare su UDP se client e server supportano EDNS. Senza EDNS, il client riceverebbe una risposta troncata e dovrebbe riprovare su TCP. Ciò aumenta la comunicazione da 1 a 4 andata e ritorno. Ma ancora peggio, a volte ci sono configurazioni errate che impediscono il funzionamento di DNS su TCP.

Anche se è possibile inserire più di 14 indirizzi nella risposta senza causare problemi a livello DNS, è improbabile che sia molto utile. Il timeout utilizzato dal client prima di rinunciare a un indirizzo e procedere al successivo è spesso significativo.

Dover aspettare quel timeout anche una volta può portare a un'esperienza utente scadente. Se il client dovesse passare attraverso 14 indirizzi prima di ottenere una risposta, l'utente dovrebbe attendere 13 timeout.


2
Oggigiorno ogni DNS dovrebbe supportare EDNS. Il limite di 512 byte per le risposte DNS non è più pratico a causa di DNSSEC.
Barmar il

@Barmar Ma se lo hai acceso, c'è un rischio abbastanza significativo che il tuo server verrà utilizzato negli attacchi di amplificazione. L'ultima volta che ho controllato ho scoperto che al bind la disattivazione era l'unica cosa, che poteva essere fatta per mitigare gli attacchi di amplificazione. Fino a quando EDNS non viene esteso con un campo cookie e il supporto per questo viene ampiamente diffuso, la disattivazione del supporto per risposte superiori a 512 byte è ancora pratica consigliata.
Kasperd,

1
Non sto davvero ottenendo molto in termini di risultati di ricerca per disabilitare la EDNS come best practice. Citazioni per favore? Gli attacchi di amplificazione che sfruttano i server ricorsivi si verificheranno indipendentemente dal fatto che EDNS sia abilitato o meno se la rete non sta eseguendo la convalida dell'indirizzo di origine. Anche se stiamo parlando di un server solo autorevole, questo diventa rilevante solo dopo averlo configurato per restituire tutti quei dati in una singola risposta, a quel punto disabilitarlo non ti aiuterà.
Andrew B,

@AndrewB Non ricordo dove ho letto quella raccomandazione. Ho letto molti consigli diversi su come evitare gli attacchi di amplificazione e tutti fanno schifo. È un peccato che EDNS non abbia introdotto un cookie, che avrebbe potuto essere una soluzione efficace agli attacchi di amplificazione tramite DNS. Quello che sto raccomandando nella mia risposta è di evitare di inserire così tanti record in una query, che ti affidi ad altri per abilitare EDNS affinché le risposte siano efficienti.
Kasperd,

@AndrewB Se inserisco più di 512 byte di record A in una zona e mi assicuro che sia ospitato su un server DNS autorevole in cui EDNS è abilitato, potrebbe essere un problema per gli utenti di resolver ricorsivi che non consentono risposte così grandi. Ed è per questo che consiglio di mantenere il numero di record A più basso. Inoltre ho spiegato perché il beneficio percepito di così tanti record A non è così rilevante.
Kasperd,

5

Quello che stai descrivendo non è un'idea particolarmente nuova. Come altre risposte hanno già trattato, sei limitato al numero di record A che puoi avere in una risposta, ma questo non dice nulla sul numero di record A che potrebbero esserci in totale.

Ad esempio, è possibile implementare un server DNS che risponde a qualsiasi query per un record A con un IP casuale. Interrogato abbastanza volte, ciò comporterebbe 4294967296 record A univoci: uno per ciascun indirizzo IPv4.

Come ho già detto, questa non è una nuova idea. In realtà, è in parte come funziona Akamai (e probabilmente molti altri CDN). Il record A che ottieni per qualsiasi dominio Akamai è determinato dai loro server DNS black-magic. Scommetto che la risposta che ricevi dipende dal bilanciamento del carico dinamico e dalle preoccupazioni geografiche.

Ad esempio, ho scelto a338.g.akamaitech.net. Se lo guardo sul mio computer in questo momento, che utilizza un server dei nomi assegnato da 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 chiedessi il DNS di 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

Scommetto che se lo provi, scommetto che otterrai una risposta diversa. Quanti server perimetrali Akamai offre una particolare risorsa? Più di due, scommetto.


Grazie. Sì, so che i CDN funzionano in questo modo, ma a mio avviso hanno un numero limitato di record per sottodominio (2 nel tuo esame).
Un'altra

2

Altri lo hanno menzionato come un dettaglio, ma da un punto di vista pratico, il limite rigido è il limite della dimensione del pacchetto UDP di 512 byte. Sebbene sia possibile passare a TCP quando viene rilevato il troncamento, in pratica molti / la maggior parte dei client non lo farà (e probabilmente non dovrebbe farlo; darebbe un'esperienza utente negativa per la maggior parte delle applicazioni e mi aspetterei solo trasferimenti di zona o altro ricerche speciali per supportare TCP). Quindi stai osservando un limite di circa 30 indirizzi per IPv4 (record A) e un po 'meno per IPv6 (AAAA) poiché sono più grandi. La lunghezza del nome di dominio lo riduce e limiterà ulteriormente il numero.


1
Hai ragione nel dire che ci sono molti client e resolver che si comportano male e che non gestiscono correttamente le risposte DNS che non rientrano in un singolo datagramma UDP, ma ti preghiamo di abbandonare l'idea che solo i trasferimenti di zona o richieste insolite richiedono dimensioni di risposta maggiori. Dalla tua risposta, chiaramente non stai usando la convalida DNSSEC, ma molte persone sono (né DNSSEC è l'unica ragione per cui sono necessarie risposte più grandi, ma è molto importante.)
Michael McNally,

@MichaelMcNally: DNSSEC non è destinato (almeno non dagli implementatori, basato su thread nelle mailing list di glibc in cui sono stato coinvolto) da utilizzare agli endpoint (applicazioni che effettuano ricerche DNS) ma al nameserver ricorsivo locale che farà ricerche per conto delle applicazioni. Pertanto, anche con una configurazione DNSSEC, non c'è motivo di aspettarsi che le applicazioni parlino DNS su TCP. UDP funziona perfettamente.
R ..

1

La risposta breve: circa 25 record A rientrano in un pacchetto UDP. Oltre a ciò, DNS passerà a TCP e non sarà così veloce. Avrai anche problemi con i client che non utilizzano resolver DNS in grado di scegliere l'IP "più vicino". Inoltre, con wifi e mobile, il "più vicino" spesso non sarà il server giusto.

Risposta più lunga:

Non farlo. Un modo migliore sarebbe quello di impostare i singoli record CNAME per ciascun utente che punta al server appropriato. Supponiamo che tu abbia due server server-fe server-rutilizzato per IMAP. Configura il client IMAP di ogni persona con il nomeserver come USERNAME.imap.example.com dove "USERNAME" è sostituito dal loro nome utente e-mail. Ora puoi spostare le persone tra i server senza dover riconfigurare il loro client di posta elettronica.

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.

Tuttavia, se lo fai, consiglio vivamente di generare automaticamente i record DNS da un database di utenti. Vuoi assicurarti che quando gli account vengono creati ed eliminati, anche i record DNS vengono creati ed eliminati. Altrimenti finirai con un casino e molta confusione.

L'ho visto fatto in aziende con letteralmente migliaia di utenti e, poiché le cose sono state automatizzate, è andato molto bene nel mondo.


0

Come altri hanno sottolineato, è un'idea terribile per l'uso nel mondo reale.

Nel mondo reale ci sono client e resolver non conformi che hanno problemi con le risposte che non si adattano a un singolo datagramma UDP, e ci sono firewall che imporranno idee specifiche ma non conformi al protocollo sui limiti di dimensione dei messaggi DNS.

E anche se potessi contare sulla tua enorme risposta che arriva in ogni caso (cosa che non puoi assolutamente enfatizzare) c'è un'altra ragione per cui questa è una pessima idea. Maggiore è la dimensione della risposta DNS, più è allettante come carico utile per gli attacchi di riflessione perché fornisci un enorme fattore di amplificazione. In questo tipo di attacco denial-of-service, che è comune nel DNS, una query UDP viene inviata a un risolutore ricorsivo aperto. L'indirizzo di origine delle query UDP è in genere facilmente falsificato e l'attaccante imposta l'origine della query sull'IP della destinazione prevista. Si ottengono due effetti desiderabili (per l'attaccante): primo - uno sforzo di invio relativamente piccolo da parte loro (da una piccola query falsificata) porta a un torrente relativamente grande di traffico indesiderato che arriva al bersaglio (questo è il fattore di amplificazione), e in secondo luogo - la fonte effettiva dell'attacco è nascosta dal bersaglio; il bersaglio conosce solo gli indirizzi dei resolver ricorsivi utilizzati come riflettori.


0

Punto interessante di curiosità storiche su questo argomento. Negli anni '90, AOL espande i propri record DNS in modo tale che una query MX restituisca> 512 byte. Questo ha violato la RFC, ha rotto molti server SMTP (qmail era molto popolare in quel momento) e ha causato un sacco di mal di testa agli amministratori di sistema. La correzione richiedeva l'applicazione di patch o l'aggiunta di route statiche.

Non so quale sia la situazione attuale, ma qualche anno fa, quando ho toccato l'ultima volta Qmail, le patch erano ancora in atto.

http://www.gossamer-threads.com/lists/qmail/users/30503

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.