Wie viele IP-Adressen kann ein DNS-A-Eintrag maximal haben?


30

Ich habe eine seltsame Idee: Lassen Sie mehrere Personen / Organisationen dieselbe Anwendung hosten und lassen Sie alle ihre Knoten über einen einzigen Domainnamen erreichbar sein. Das ist, um zum Beispiel ein wirklich verteiltes soziales Netzwerk zu haben, in dem die Benutzerfreundlichkeit nicht beeinträchtigt wird (dh Benutzer müssen sich keine unterschiedlichen Anbieter-URLs merken und dann, wenn ein Anbieter ausfällt, zu einem anderen wechseln).

Um dies zu erreichen, dachte ich, dass ein DNS-Eintrag mit mehreren IPs verwendet werden kann.

Wie viele IPs kann ein einzelner DNS-A-Eintrag enthalten? Diese Antwort besagt, dass es ungefähr 30 ist, aber der Verwendungszweck dort ist unterschiedlich. Für das obige Szenario ist es mir egal, ob ein gegebener ISP nur 30 cacht, solange ein anderer ISP weitere 30 cacht, und so weiter.


2
Nehmen Sie über Anycast ?
Lie Ryan

4
Ich habe vor einiger Zeit erfahren, dass, wenn Sie jemals fragen müssen "Was ist die maximale Anzahl von X?" Sie verwenden es wahrscheinlich falsch ...
LordOfThePigs

Nicht unbedingt;) Aber im Allgemeinen ja
Bozho

Antworten:


78

Haftungsausschluss: Keine Beleidigung, aber das ist eine wirklich schlechte Idee. Ich rate niemandem, dies im wirklichen Leben zu tun.

Aber wenn Sie einem gelangweilten IT-Mitarbeiter ein Labor geben, passieren lustige Dinge!

Für dieses Experiment habe ich einen Microsoft DNS-Server verwendet, der auf Server 2012 R2 ausgeführt wird. Aufgrund der Schwierigkeiten beim Hosten einer DNS-Zone in Active Directory habe ich eine neue primäre Zone mit dem Namen testing.com erstellt, die nicht in AD integriert ist.

Verwenden dieses Skripts:

$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
        }
    }
}

Ich fuhr fort, ohne Fehler 65025 Hosteinträge für den Namen testing.testing.com.mit buchstäblich jeder IPv4-Adresse von 1.1.1.1 bis 1.1.255.255 zu erstellen.

Dann wollte ich sicherstellen, dass ich 65536 (2 ^ 16 Bit) A-Datensätze fehlerfrei durchbrechen konnte, und ich konnte, also nehme ich an, dass ich wahrscheinlich bis 16581375 (1.1.1.1 bis 1.255) hätte durchstarten können .255.255,) aber ich wollte nicht hier sitzen und dieses Skript die ganze Nacht laufen sehen.

Zu viele Datensätze

Ich kann also mit Sicherheit sagen, dass die Anzahl der A-Einträge, die Sie einer Zone mit demselben Namen und unterschiedlichen IP-Adressen auf Ihrem Server hinzufügen können, praktisch unbegrenzt ist.

Aber wird es tatsächlich aus Sicht des Kunden funktionieren ?

Folgendes erhalte ich von meinem Kunden aus Sicht von Wireshark:

zwei Abfragen (Öffnen Sie das Bild in einem neuen Browser-Tab, um es in voller Größe anzuzeigen.)

nslookup

TCP-Abfrage

Wie Sie sehen, werden bei Verwendung von nslookup oder Ping von meinem Client automatisch zwei Abfragen ausgegeben - eine UDP- und eine TCP-Abfrage. Wie Sie bereits wissen, kann ich maximal 512 Byte in ein UDP-Datagramm schreiben. Wenn diese Grenze überschritten ist (z. B. 20-30 IP-Adressen), muss stattdessen TCP verwendet werden. Aber selbst mit TCP erhalte ich nur eine sehr kleine Teilmenge von A-Datensätzen für testing.testing.com. Pro TCP-Abfrage wurden 1000 Datensätze zurückgegeben. Die Liste der A-Datensätze wird bei jeder nachfolgenden Abfrage ordnungsgemäß um 1 gedreht, genau so, wie Sie es von Round-Robin-DNS erwarten würden. Es würde Millionen von Abfragen erfordern, um alle diese Fragen zu beantworten.

Ich verstehe nicht, wie dies Ihnen dabei helfen wird, Ihr Social Media-Netzwerk massiv skalierbar und belastbar zu machen, aber es gibt trotzdem Ihre Antwort.


Bearbeiten: In Ihrem Folgekommentar fragen Sie, warum ich denke, dass dies im Allgemeinen eine schlechte Idee ist.

  • Angenommen, ich bin ein durchschnittlicher Internetnutzer und möchte eine Verbindung zu Ihrem Dienst herstellen. Ich tippe www.bozho.biz in meinen Webbrowser. Der DNS-Client auf meinem Computer erhält 1000 Einträge zurück. Nun, Pech, die ersten 30 Datensätze in der Liste reagieren nicht, weil die Liste der A-Datensätze nicht auf dem neuesten Stand gehalten wird, oder weil es einen großen Ausfall gibt, der einen Teil des Internets betrifft. Angenommen, mein Webbrowser hat eine Zeitüberschreitung von 5 Sekunden pro IP, bevor er weitergeht und den nächsten versucht. Jetzt sitze ich hier und starre zweieinhalb Minuten lang auf eine sich drehende Sanduhr und warte darauf, dass Ihre Site geladen wird. Dafür hat niemand Zeit. Ich gehe nur davon aus, dass mein Webbrowser oder eine andere Anwendung, mit der ich auf Ihren Dienst zugreife, mehr als die ersten 4 oder 5 IP-Adressen versuchen wird. Das wird es wahrscheinlich nicht.

  • Wenn Sie die automatische Bereinigung verwendet haben und nicht validierte oder anonyme Aktualisierungen der DNS-Zone zulassen, um die Liste der A-Datensätze auf dem neuesten Stand zu halten, stellen Sie sich vor, wie unsicher das wäre! Selbst wenn Sie ein System entwickelt haben, in dem die Clients ein Client-TLS-Zertifikat benötigen, das sie zuvor von Ihnen erhalten haben, um die Zone zu aktualisieren, wird ein kompromittierter Client auf der ganzen Welt ein Botnetz starten und Ihren Dienst zerstören. Traditionelles DNS ist so unsicher wie es ist, ohne Crowd-Sourcing.

  • Enorme Bandbreitennutzung und Verschwendung. Wenn für jede DNS-Abfrage mindestens 32 Kilobyte Bandbreite erforderlich sind, ist die Skalierung überhaupt nicht gut.

  • DNS Round-Robin ist kein Ersatz für einen ordnungsgemäßen Lastenausgleich. Es bietet keine Möglichkeit, sich von einem Knoten zu erholen, der gerade ausfällt oder nicht mehr verfügbar ist. Wirst du deine Benutzer anweisen, eine ipconfig / flushdns auszuführen, wenn der Knoten, mit dem sie verbunden waren, ausfällt? Solche Probleme wurden bereits von Dingen wie GSLB und Anycast gelöst.

  • Etc.


15
Langsam ... klatschen ..., Sir.
Mfinni

4
Wenn die A-Datensätze über BIND abgefragt werden (was auf den meisten DNS-Servern der Fall ist), werden die A-Datensätze gemischt und eine bestimmte Anzahl von A-Datensätzen daraus zurückgegeben. Diese bestimmte Nummer ist im MAX_SHUFFLEBIND-Quellcode definiert (standardmäßig 32).
ub3rst4r

1
Warum würden Sie es aus Neugier nicht empfehlen? Es ist sicherlich eine sehr seltsame Sache, aber abgesehen davon, dass böswillige Knoten Anfragen unter einer "guten" Domain
bearbeiten

Würde sich die Benutzererfahrung nicht ständig ändern? Ist jeder Knoten eine vollständige Replik? Wie würden Sie sicherstellen, dass dies der Fall ist, wenn sie unter der Kontrolle anderer Personen stehen? Wenn sie unterschiedlich sind, erhalten die Leute heute eine Site und morgen eine andere Site. Persönlich würde mich das verrückt machen!
Brandon

18

Um die Frage zu beantworten, wie sie gestellt wurde ("Wie viele IPs kann ein einzelner DNS-A-Eintrag enthalten?"), Ist die Antwort sehr einfach: Ein einzelner AEintrag enthält genau eine Adresse. Es können jedoch mehrere ADatensätze für denselben Namen vorhanden sein.


10

Jede IPv4-Adresse belegt 16 Byte in der Antwort. Jede IPv6-Adresse belegt in der Antwort 28 Byte.

Es wird dringend empfohlen, dass Sie sicherstellen, dass die Antwort in 512 Byte passt. Dies würde ungefähr 25 IPv4-Adressen und 14 IPv6-Adressen ermöglichen (vorausgesetzt, dass Sie im Paket auch einige andere Informationen benötigen). Das genaue Limit hängt von der Länge Ihres Domainnamens ab.

Wenn Sie sowohl 25 IPv4-Adressen als auch 14 IPv6-Adressen haben, zählen Sie darauf, dass die Clients IPv4- und IPv6-Adressen in separaten Abfragen anfordern. Sollte der Client in einer einzigen Abfrage nach beiden Adresstypen fragen (was selten vorkommt), müssten Sie nach unten gehen.

Sollte die Antwortgröße 512 Byte überschreiten, funktioniert dies möglicherweise immer noch über UDP, wenn Client und Server EDNS unterstützen. Ohne EDNS würde der Client eine abgeschnittene Antwort erhalten und müsste es über TCP erneut versuchen. Dies erhöht die Kommunikation von 1 auf 4 Roundtrips. Aber noch schlimmer, manchmal gibt es Fehlkonfigurationen, die verhindern, dass DNS über TCP funktioniert.

Selbst wenn Sie mehr als 14 Adressen in die Antwort drücken könnten, ohne Probleme auf der DNS-Ebene zu verursachen, ist dies wahrscheinlich nicht sehr nützlich. Das vom Client verwendete Zeitlimit, bevor eine Adresse aufgegeben und zur nächsten weitergegangen wird, ist häufig erheblich.

Das einmalige Warten auf dieses Timeout kann zu einer schlechten Benutzererfahrung führen. Wenn der Client 14 Adressen durchgehen müsste, bevor er eine Antwort erhalten würde, müsste der Benutzer auf 13 Zeitüberschreitungen warten.


2
Jedes DNS sollte heutzutage EDNS unterstützen. Das 512-Byte-Limit für DNS-Antworten ist aufgrund von DNSSEC nicht mehr praktikabel.
Barmar

@Barmar Wenn Sie es jedoch aktiviert haben, besteht ein erhebliches Risiko, dass Ihr Server für Verstärkungsangriffe verwendet wird. Das letzte Mal, als ich nachgesehen habe, stellte ich fest, dass das Ausschalten beim Binden das einzige war, was getan werden konnte, um Amplifikationsangriffe abzuschwächen. Bis EDNS um ein Cookie-Feld erweitert wird und die Unterstützung dafür weit verbreitet ist, wird nach wie vor empfohlen, die Unterstützung für Antworten zu deaktivieren, die größer als 512 Byte sind.
Kasperd

1
Die Suchergebnisse für die Deaktivierung von EDNS sind nicht besonders gut. Zitate bitte? Amplification-Angriffe mit rekursiven Servern werden unabhängig davon durchgeführt, ob EDNS aktiviert ist oder nicht, wenn Ihr Netzwerk keine Überprüfung der Quelladresse durchführt. Selbst wenn es sich um einen autorisierenden Server handelt, wird dieser erst relevant, wenn Sie ihn so konfiguriert haben , dass er so viele Daten in einer einzigen Antwort zurückgibt. Wenn Sie ihn dann deaktivieren, hilft er Ihnen nicht weiter.
Andrew B

@ AndrewB Ich kann mich nicht erinnern, wo ich diese Empfehlung gelesen habe. Ich habe viele verschiedene Empfehlungen zur Vermeidung von Amplifikationsattacken gelesen, und alle sind zum Kotzen. Es ist schade, dass EDNS kein Cookie eingeführt hat, das eine effiziente Lösung für die Amplifikationsangriffe mit DNS hätte sein können. In meiner Antwort empfehle ich, nicht so viele Datensätze in eine Abfrage einzufügen, dass Sie sich darauf verlassen können, dass andere EDNS aktivieren, damit die Antworten effizient sind.
Kasperd

@AndrewB Wenn ich A-Einträge mit mehr als 512 Byte in eine Zone lege und sicherstelle, dass sie auf einem autorisierenden DNS-Server gehostet werden, auf dem EDNS aktiviert ist, kann dies ein Problem für Benutzer von rekursiven Resolvern sein, die keine so großen Antworten zulassen. Aus diesem Grund empfehle ich, die Anzahl der A-Datensätze zu verringern. Außerdem habe ich erklärt, warum der wahrgenommene Nutzen von so vielen A-Datensätzen nicht so relevant ist.
Kasperd

5

Was Sie beschreiben, ist keine besonders neue Idee. Wie bereits in anderen Antworten erläutert, ist die Anzahl der A-Datensätze, die in einer Antwort enthalten sein können, begrenzt. Dies sagt jedoch nichts darüber aus, wie viele A-Datensätze möglicherweise insgesamt vorhanden sind.

Sie können beispielsweise einen DNS-Server implementieren, der alle Anfragen nach einem A-Eintrag mit einer zufälligen IP beantwortet. Dies würde zu 4294967296 eindeutigen A-Einträgen führen: einem für jede IPv4-Adresse.

Wie gesagt, das ist keine neue Idee. Tatsächlich ist es zum Teil so, wie Akamai funktioniert (und wahrscheinlich viele andere CDNs). Der A-Datensatz, den Sie für jede Akamai-Domain erhalten, wird durch deren Black-Magic-DNS-Server bestimmt. Ich wette, die Antwort hängt vom dynamischen Lastenausgleich und geografischen Gesichtspunkten ab.

Zum Beispiel habe ich a338.g.akamaitech.net ausgewählt. Wenn ich mir das gerade auf meinem Computer ansehe, der einen DHCP-zugewiesenen Nameserver von Comcast verwendet:

$ 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

Was ist, wenn ich nach dem DNS von Google frage?

$ 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

Ich wette, wenn Sie es versuchen, werden Sie eine andere Antwort bekommen. Wie viele Edgeserver hat Akamai für eine bestimmte Ressource? Ich wette, mehr als zwei.


Vielen Dank. Ja, ich weiß, dass CDNs so funktionieren, aber meiner Meinung nach haben sie eine begrenzte Anzahl von Datensätzen pro Subdomain (2 in Ihrem Beispiel). Meine andere aktuelle Frage bezieht sich genau auf CDNs und deren DNS-Implementierung :-)
Bozho

2

Andere haben es als Detail erwähnt, aber aus praktischer Sicht ist die harte Grenze die UDP-Paketgrößengrenze von 512 Bytes. Während es möglich ist, zu TCP zu wechseln, wenn eine Kürzung erkannt wird, werden dies in der Praxis viele / die meisten Clients nicht tun (und dies sollten sie wohl auch nicht tun). Dies würde für die meisten Anwendungen zu einer schlechten Benutzererfahrung führen, und ich würde nur mit Zonentransfers oder anderem rechnen spezielle Suchvorgänge zur Unterstützung von TCP). Bei IPv4 (A-Datensätzen) liegt die Grenze bei etwa 30 Adressen, bei IPv6 (AAAA) bei etwas weniger Adressen, da diese größer sind. Die Länge des Domainnamens trägt dazu bei und schränkt die Anzahl weiter ein.


1
Sie haben völlig Recht, dass es viele fehlerhafte Clients und Resolver gibt, die DNS-Antworten, die nicht in ein einzelnes UDP-Datagramm passen, nicht ordnungsgemäß verarbeiten. Bitte geben Sie jedoch die Idee auf, dass nur Zonenübertragungen oder ungewöhnliche Anforderungen größere Antwortgrößen erfordern. Aus Ihrer Antwort geht eindeutig hervor, dass Sie keine DNSSEC-Validierung verwenden, dies jedoch bei vielen Personen der Fall ist (und DNSSEC auch nicht der einzige Grund, warum größere Antworten erforderlich sind, aber dies ist sehr wichtig.)
Michael McNally

@MichaelMcNally: DNSSEC ist nicht dafür vorgesehen (zumindest nicht von Implementierern, basierend auf Threads auf den Glibc-Mailinglisten, an denen ich beteiligt war), auf Endpunkten (Anwendungen, die DNS-Lookups durchführen), sondern auf dem lokalen rekursiven Nameserver, der dies tun wird Suchen im Namen von Anwendungen. Daher gibt es auch bei einer DNSSEC-Einrichtung keinen Grund zu der Annahme, dass Anwendungen DNS über TCP sprechen. UDP funktioniert einwandfrei.
R ..

1

Die kurze Antwort: In ein UDP-Paket passen ca. 25 A-Einträge. Darüber hinaus wechselt DNS zu TCP und es wird nicht so schnell sein. Sie haben auch Probleme mit Clients, die keine DNS-Resolver verwenden, die in der Lage sind, die "nächstgelegene" IP-Adresse zu ermitteln. Mit WLAN und Mobilfunk ist der "nächste" oft nicht der richtige Server.

Längere Antwort:

Mach das nicht. Besser wäre es, für jeden Benutzer einzelne CNAME-Einträge einzurichten, die auf den entsprechenden Server verweisen. Angenommen, Sie haben zwei Server server-fund server-rwerden für IMAP verwendet. Konfigurieren Sie den IMAP-Client jeder Person mit dem Servernamen USERNAME.imap.example.com, wobei "USERNAME" durch ihren E-Mail-Benutzernamen ersetzt wird. Jetzt können Sie Personen zwischen Servern verschieben, ohne ihren E-Mail-Client neu konfigurieren zu müssen.

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.

Wenn Sie dies jedoch tun, EMPFEHLE ICH HOCH, dass Sie die DNS-Einträge automatisch aus einer Datenbank von Benutzern generieren. Sie möchten sicherstellen, dass beim Erstellen und Löschen von Konten auch die DNS-Einträge erstellt und gelöscht werden. Andernfalls kommt es zu Unordnung und viel Verwirrung.

Ich habe dies in Unternehmen mit buchstäblich Tausenden von Benutzern gesehen, und da die Dinge automatisiert waren, lief es sehr gut.


0

Wie andere betont haben, ist es eine schreckliche Idee für den realen Gebrauch.

In der realen Welt gibt es fehlerhafte Clients und Resolver, die Probleme mit Antworten haben, die nicht in ein einzelnes UDP-Datagramm passen, und es gibt Firewalls, die bestimmte, aber nicht protokollkonforme Ideen zu DNS-Nachrichtengrößenbeschränkungen durchsetzen.

Und selbst wenn Sie sich darauf verlassen können, dass Ihre große Resonanz in jedem Fall erfolgreich ist (was Sie nachdrücklich nicht können), gibt es einen weiteren Grund, warum dies eine sehr schlechte Idee ist. Je größer Ihre DNS-Antwort ist, desto verlockender ist sie als Nutzlast für Reflexionsangriffe, da Sie einen enormen Verstärkungsfaktor bereitstellen. Bei dieser Art von Denial-of-Service-Angriff, die in DNS üblich ist, wird eine UDP-Abfrage an einen offenen rekursiven Resolver gesendet. Die Quelladresse von UDP-Abfragen kann normalerweise leicht gefälscht werden, und der Angreifer setzt die Abfragequelle auf die IP des beabsichtigten Ziels. Es werden zwei wünschenswerte (für den Angreifer) Effekte erzielt: Erstens: Ein relativ geringer Sendeaufwand (aufgrund einer kleinen gefälschten Abfrage) führt dazu, dass ein vergleichsweise großer Strom unerwünschten Verkehrs am Ziel ankommt (dies ist der Verstärkungsfaktor). und zweitens - die eigentliche Angriffsquelle ist vor dem Ziel verborgen; Das Ziel kennt nur die Adressen der rekursiven Resolver, die als Reflektoren verwendet werden.


0

Interessanter Punkt der historischen Wissenswertes zu diesem Thema. In den 90er Jahren erweiterte AOL seine DNS-Einträge so, dass eine MX-Abfrage> 512 Byte zurückgab. Das hat gegen RFC verstoßen, viele SMTP-Server beschädigt (qmail war zu dieser Zeit sehr beliebt) und Sysadmins viel Kopfzerbrechen bereitet. Das Update erforderte entweder das Patchen oder das Hinzufügen statischer Routen.

Ich weiß nicht, wie es derzeit aussieht, aber vor ein paar Jahren, als ich qmail das letzte Mal berührt habe, waren die Patches noch vorhanden.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.