Kommt CNAME zuerst oder der A-Record?
(blog.cloudflare.com)- Am 8. Januar 2026 führte ein Service-Update von Cloudflares 1.1.1.1 zu einer Änderung der Record-Reihenfolge in DNS-Antworten, wodurch es bei einigen Nutzern weltweit zu Fehlern bei der DNS-Auflösung kam
- Ursache war eine Codeänderung, durch die CNAME-Records hinter A/AAAA-Records verschoben wurden, weil einige DNS-Client-Implementierungen von der Reihenfolge abhängen
- Betroffen waren insbesondere die
getaddrinfo-Funktion von glibc und der DNSC-Prozess in Cisco-Switches; im letzteren Fall kam es sogar zu Reboot-Schleifen - RFC 1034 legt nur fest, dass eine Antwort durch CNAMEs „eingeleitet werden kann“ („possibly preface“), sodass ein klarer Standard für die Record-Reihenfolge fehlt
- Cloudflare kehrte dazu zurück, CNAMEs immer zuerst zu platzieren, und reichte bei der IETF einen Internet-Draft zur klaren Standarddefinition ein
1. Überblick über den Vorfall
- Am 8. Januar 2026 wurde ein Update zur Reduzierung des Speicherverbrauchs von 1.1.1.1 ausgerollt, das eine Änderung der Record-Reihenfolge in DNS-Antworten verursachte
- Die Änderung wurde am 2. Dezember 2025 in die Codebasis aufgenommen, am 10. Dezember in die Testumgebung ausgerollt und ab dem 7. Januar 2026 global veröffentlicht
- Am 8. Januar wurde der Vorfall um 18:19 UTC erklärt, um 18:27 begann das Rollback, um 19:55 war die Wiederherstellung abgeschlossen
- Die meisten modernen DNS-Clients ignorieren die Reihenfolge der Records in Antworten, einige Implementierungen gehen jedoch davon aus, dass CNAMEs immer zuerst kommen müssen
- Als sich diese Reihenfolge änderte, behandelten einige Clients die Antwort als leer, wodurch die Auflösung fehlschlug
2. CNAME-Ketten und Cache-Verhalten
- Bei einer Domain-Abfrage wird zum Beispiel
www.example.comüber mehrere CNAME-Ketten bis zur endgültigen IP aufgelöst- Beispiel:
www.example.com → cdn.example.com → server.cdn-provider.com → 198.51.100.1
- Beispiel:
- Jedes CNAME-Glied hat einen TTL (Time-To-Live), und nur ein Teil davon kann ablaufen
- 1.1.1.1 fragt nur abgelaufene Teile erneut ab und führt bestehenden Cache und neue Records zusammen, um die Antwort zu bilden
3. Details der Codeänderung
- Im bisherigen Code wurde die CNAME-Kette zuerst eingefügt, danach wurden A/AAAA-Records ergänzt
answer_rrs.extend_from_slice(&self.records); // CNAMEs first
- Im geänderten Code wurden CNAMEs zuletzt hinzugefügt
entry.answer.extend(self.records); // CNAMEs last
- Dadurch wurden CNAMEs innerhalb der Antwort nach unten verschoben, was einige Clients nicht verarbeiten konnten
4. Beispiele betroffener Implementierungen
- Die
getaddrinfo-Funktion von glibc parst Antworten sequentiell und muss daher zuerst auf CNAMEs treffen, um dem nächsten Namen folgen zu können- Wenn CNAMEs hinten stehen, wird der „erwartete Name“ nicht aktualisiert und das Ergebnis bleibt leer
- Auch der DNSC-Prozess in drei Modellen von Cisco Catalyst Switches war betroffen; bei Nutzung von 1.1.1.1 führte dies zu fatalen Fehlern und Reboot-Schleifen
- Cisco veröffentlichte dazu ein entsprechendes Service-Dokument
5. Nicht betroffene Implementierungen
- systemd-resolved parst Antworten in eine
OrderedSet-Struktur, sodass unabhängig von der Position eines CNAME der gesamte Satz durchsucht werden kann- Daher funktionierte es auch nach der Änderung der Record-Reihenfolge normal
6. Die Unschärfe von RFC 1034
- RFC 1034 (1987) beschreibt, dass eine Antwort durch einen oder mehrere CNAMEs „preface“ eingeleitet werden kann
- Es fehlen jedoch normative Schlüsselwörter wie MUST/SHOULD, sodass keine explizite Anforderung daraus entsteht
- Erst mit RFC 2119 (1997) wurden solche Schlüsselwörter standardisiert; dem damaligen Dokument fehlte daher eine klare verpflichtende Formulierung
- Cloudflare platzierte CNAMEs in der ursprünglichen Implementierung zwar zuerst, garantierte dies jedoch nicht durch Tests
7. Unterscheidung zwischen RRset und Message Sections
- RFC 1034 §3.6 stellt klar, dass die Reihenfolge innerhalb eines RRset (Menge von Records mit gleichem Namen, Typ und gleicher Klasse) nicht wichtig ist
- Zur Reihenfolge zwischen unterschiedlichen RRsets gibt es jedoch keine Aussage
- Das Beispiel in §6.2.1 behandelt ebenfalls nur zwei A-Records mit demselben Namen, nicht aber die relative Reihenfolge von CNAME und A
- Damit bleibt die Definition der Reihenfolge zwischen CNAME- und A-Records offen
8. Reihenfolge innerhalb von CNAME-Ketten
- Wenn ein CNAME mehrere Stufen hat, kann auch eine vertauschte Reihenfolge innerhalb der Kette dazu führen, dass sequentielles Parsing fehlschlägt
- Beispiel: Wenn
cdn.example.com CNAME server.cdn-provider.comzuerst kommt, wirdwww.example.com CNAME cdn.example.comnicht gefunden
- Beispiel: Wenn
- RFC 1034 enthält auch keine Anforderungen an die Reihenfolge innerhalb einer CNAME-Kette
9. Maßstab für das Resolver-Verhalten
- RFC 1034 §5.2.2 legt fest: Wenn ein Resolver auf einen CNAME trifft, muss er die Query mit dem neuen Namen neu starten
- Diese Beschreibung bezieht sich jedoch auf den vollständigen Resolver (z. B. 1.1.1.1),
Stub-Resolver wie in glibc implementieren diese Logik dagegen nicht - Dadurch folgen einige Stub-Resolver nicht dem von der RFC erwarteten Verhalten
10. Vergleich mit den expliziten Regeln in DNSSEC
- RFC 4035 (DNSSEC) schreibt die Priorität bei der Einbeziehung von
RRSIG-Records mit MUST ausdrücklich vor- Das betrifft allerdings die Frage der Einbeziehung, nicht die Reihenfolge
- DNSSEC bietet klare Regeln zur Einbeziehung, aber in unsignierten Zonen (Unsigned zones) bleibt die Unschärfe von RFC 1034 weiterhin bestehen
11. Fazit und Maßnahmen von Cloudflare
- Auch wenn die Reihenfolge von CNAMEs laut RFC nicht zwingend vorgeschrieben ist, setzen einige Clients sie implizit voraus, daher
kehrte Cloudflare zu der Richtlinie zurück, CNAMEs immer zuerst zu platzieren - Um ähnliche Probleme künftig zu vermeiden, wurde ein Internet-Draft bei der IETF eingereicht
- Dokument: draft-jabley-dnsop-ordered-answer-section
- Ziel: eine klare Standardisierung der Verarbeitungsreihenfolge von CNAMEs in DNS-Antworten
- Cloudflare sieht in diesem Vorfall eine Bestätigung dafür, dass die Unschärfe eines 40 Jahre alten Protokolls noch immer praktische Auswirkungen hat
12. Zusatzinformationen
- Cloudflare bietet über die Connectivity Cloud einschließlich 1.1.1.1 Unterstützung für
den Schutz von Unternehmensnetzwerken, die Beschleunigung internetweiter Anwendungen, DDoS-Abwehr und die Umsetzung von Zero Trust - Mit der kostenlosen App 1.1.1.1 ist ein schnellerer und sichererer Internetzugang möglich
1 Kommentare
Hacker-News-Kommentare
Ich fand die Formulierung im RFC gar nicht so mehrdeutig
„possibly preface“ lässt sich so lesen, dass „wenn es einen CNAME-Record gibt, dieser zuerst vorangestellt wird“, nicht aber so, dass „man ihn beliebig irgendwo einfügen kann“
Aber es geht hier nicht nur um Satzinterpretation, sondern darum, dass das Team hinter einem der wichtigsten DNS-Server der Welt die CNAME-Antwortlogik geändert hat
Das muss in Tests klar kaputtgegangen sein, und erstaunlich ist, dass niemand gefragt hat: „Ist diese Reihenfolge wichtig?“
Cloudflare legt Probleme in letzter Zeit zwar transparent offen, aber dieser Fall klingt eher wie „ein interessanter Fun Fact“
Dass so etwas in einem System dieser Größenordnung durch die Tests kam, wirkt wie ein ziemlich großer Fehler
Das Beispiel lässt sich verallgemeinern, sodass man es missverstehen kann als „In allen Fällen ist die Reihenfolge egal“
Am Ende kann das, was für den einen „glasklares Verständnis“ ist, für jemand anderen wie „Hast du die Doku überhaupt ganz gelesen?“ wirken
Solche Fälle zeigen, wie wichtig normative Sprache ist
Die zugehörige Diskussion findet sich auf der IETF-Mailingliste
„Unterschiede in der Reihenfolge sind nicht wichtig“ gilt nur für dieses konkrete Beispiel und bedeutet nicht, dass man die allgemeine Regel ignorieren darf
Es heißt zwar, RFC 1034 habe RRset definiert, aber tatsächlich wird der Begriff dort nicht als solcher definiert
Cloudflares Interpretation wirkt wie eine Ausnahmebestimmung, die zur allgemeinen Regel erklärt wurde
Allerdings gibt es keine eindeutige Festlegung zur Reihenfolge innerhalb einer CNAME-Kette, daher bleibt dort ein wenig Mehrdeutigkeit bestehen
Das wirkt wie ein Fall, in dem Hyrum’s Law und Postel’s Law gleichzeitig gegriffen haben
Einerseits: „Wenn es genügend Nutzer einer API gibt, wird jemand von jedem beobachtbaren Verhalten des Systems abhängen“
Andererseits: „Sei konservativ beim Senden und tolerant beim Empfangen“ — und genau diese Prinzipien sind hier kollidiert
Entscheidend ist hier, dass der Resolver in glibc kaputtging — das ist alles andere als ein exotischer Sonderfall
Die eigentliche Nachricht ist, dass Cloudflare offenbar nicht ordentlich getestet hat
Dieser Bug hat bei mir alte Erinnerungen geweckt
2011 hat Cloudflare den RFC ignoriert und CNAME am Domain-Apex zugelassen
Im damaligen Blogpost hieß es sinngemäß: „Wir ignorieren RFCs und lösen lieber reale Probleme“
Aber CNAME ist ein Konzept auf Namensebene (Alias), und wenn man es am Apex platziert, gehen NS-, MX- und SOA-Caching kaputt
Viele Engineers haben damals gewarnt, aber es galt „move fast and break things“
Dass diesmal so fein über die Reihenfolge von CNAME-Ketten und A-Records diskutiert wird, zeigt immerhin Fortschritt
CNAME und das Alias-Konzept sorgen schon seit Langem für Verwirrung, und die nicht-normative Sprache in RFC1034 hat diese noch verstärkt
Das ist das Ergebnis aufgestauter Mehrdeutigkeit, aber dass ein großer Dienstanbieter so einen Fehler macht, bleibt trotzdem schwer akzeptabel
Ich würde eher sagen, die Spezifikation selbst war das Problem
Erstaunlich ist, dass ein normaler DNS-Lookup in glibc von der Record-Reihenfolge abhängt
Kaum zu glauben, dass das über 20 Jahre lang kein größeres Problem verursacht hat
Vermutlich haben die meisten DNS-Betreiber in Tests empirisch gelernt, dass die Reihenfolge wichtig ist
Aufmerksamkeit bekam es erst, als Cloudflare weltweit Hunderte Millionen Geräte betroffen hat
Interessant wäre allerdings, ob Cloudflare diesmal Patches an Open-Source-Resolver wie glibc geschickt hat
CNAME ist wirklich ein unangenehm heikles Konstrukt (siehe DJBs Notizen)
Ein einfacher Resolver wie glibc hat keinen Cache; das umzusetzen würde erhebliche Code-Änderungen erfordern
Dass Cloudflare behauptet hat, „der RFC verlangt keine CNAME-Reihenfolge“, klingt nach Wortklauberei
Nur weil dort kein „MUST“ steht, heißt das nicht, dass jede beliebige Reihenfolge zulässig ist
Fehler einzugestehen und weiterzumachen macht die Welt eher besser
Sich per Sprachdebatte vor Verantwortung zu drücken kostet am Ende eher Vertrauen
Cloudflare scheint RFC1034 nicht richtig verstanden zu haben
In ihrer DNS-Oberfläche blockiert ein vorhandener CNAME nur A und AAAA, andere Records sind weiter erlaubt
Dadurch entstehen bei gemeinsam vorhandenen CNAME- und TXT-Records cacheabhängige Ergebnisse
Auch bei internet.nl wurden solche Probleme gefunden
Einige Nutzer haben anhand des mxtoolbox-Leitfadens konfiguriert, was mit RFC1034 kollidiert
Zum einen „wie man einen DMARC-Dienst per CNAME delegiert“, zum anderen „wie man ihn direkt hostet“
Der Screenshot hat die Verwirrung wohl noch verstärkt
Dass Cloudflare am Ende zu dem Schluss gekommen ist, CNAME müsse vor anderen Records stehen, erscheint vernünftig
Bei der DNS-Verwaltung im Unternehmen habe ich viele Grenzen von DNS direkt erlebt
Besonders bei SERVFAIL kann der Client nicht unterscheiden, welcher Server eigentlich das Problem ist
Das führt dazu, dass mehrere DNS-Server und Cache-Schichten unnötige Retry-Stürme auslösen
Außerdem sorgt der Search Path dafür, dass NXDOMAIN-Anfragen an falsche Domains wiederholt werden
servfail-ttlLaut RFC2308 Abschnitt 7.1 ist es erlaubt, SERVFAIL-Antworten zu cachen
Ein alter Standard, aber weiterhin ein sinnvoller Ansatz
Cloudflare bricht oft Standards und schreibt dann einen neuen RFC, um das zu rechtfertigen
Fälle wie RFC 8482 sind aus meiner Sicht eine Blamage für die Branche
Dass es nun heißt „Diesmal haben wir sogar einen neuen Internet-Draft eingereicht, um Verwirrung zu vermeiden“, wirkt ironisch
Bei einem DNS-Server in der Größenordnung von 1.1.1.1 sollte es Integrationstests mit echten Resolvern wie glibc geben
Warum so ein Problem erst in Produktion entdeckt wurde, ist schwer nachvollziehbar
Die einzelnen Tests sind wohl durchgelaufen, aber der Fall, in dem beide Bedingungen zusammenkommen, hat gefehlt