Sollte CNAME für Subdomains verwendet werden?

84

Ich verwalte mehrere Websites mit der folgenden DNS-Konfiguration:

example.com      - A Record - Production Server IP
test.example.com - A Record - Test Server IP
www.example.com  - CNAME    - example.com
beta.example.com - CNAME    - test.example.com
dev.example.com  - CNAME    - test.example.com

Ist dies eine angemessene Verwendung von CNAME-Einträgen? Ich habe online gesucht und keine klare Antwort gefunden. Einige Leute behaupten, dass CNAME-Einträge fehlerhaft sind (es ist jedoch nicht klar, warum dies der Fall ist) und schlagen das folgende Setup vor:

example.com      - A Record - Production Server IP
test.example.com - A Record - Test Server IP
www.example.com  - A Record - Production Server IP
beta.example.com - A Record - Test Server IP
dev.example.com  - A Record - Test Server IP

Welches davon ist der bessere Ansatz (und warum)?

Hinweis: Für die Subdomains sind keine eigenen MX-Einträge erforderlich, sodass dies hier kein Problem darstellt.

Joseph Sturtevant
quelle
1
Ich denke, das sollte eine Wiki-Antwort sein. DNS ist so schwer zu finden und ist diese akzeptierte Antwort auch nach 6 Jahren noch gut?
the0ther
1
@ the0ther Ja, auch heute noch ist die validierte Antwort von Jesper Mortensen gültig (auch wenn man über die Benennung von Dingen oder die korrekten zu verwendenden TTL-Werte streiten könnte, aber dies sind separate Punkte von der Frage der Verwendung von CNAME-Datensätzen oder nicht ). DNS ist ein 30 Jahre altes Protokoll, sodass sich grundlegende Dinge wie CNAME-Einträge im Laufe der Zeit nicht ändern.
Patrick Mevzek

Antworten:

85

Ja, das ist eine angemessene Verwendung von CNAMEs. In den Diskussionen, an denen ich teilgenommen habe, lauten die Argumente in der Regel folgendermaßen:

Gegen CNAMEs:

  • Es gibt eine (winzige) Leistungsbeeinträchtigung, da die Downstream-DNS-Caches zwei DNS-Suchvorgänge ausführen müssen, einen für den CNAME und einen für den A-Record, auf den der CNAME verweist.
  • Vage, falsche Argumente über CNAMEs mit weniger "Autorität" oder Kompatibilitätsproblemen.

Für CNAMEs:

  • Sie bieten eine saubere Abstraktion zwischen Hardware (physischen Servern) und Diensten.
  • Sie vereinfachen die DNS-Verwaltung. Wenn ein Server verschoben wird, müssen Sie nur einen Datensatz ändern.

Nachdem ich ein paar verschiedene Möglichkeiten ausprobiert habe, habe ich jetzt einen persönlichen Lieblingsstil. Es ist:

  • Ein A-Datensatz für jeden physischen Server; mit einer ziemlich niedrigen TTL (vielleicht 30 Minuten); Geben Sie dem Server einen benutzerfreundlichen Namen .
  • Ein CNAME für jeden Dienst; mit einer hohen TTL (vielleicht 24 Stunden); auf die oben genannten Servernamen verweisen.
  • Als einzige Ausnahme zu den obigen Regeln ist der Domain-Stamm ein A-Record, der auf den Webserver / Web Load Balancer verweist. (Das @ muss ein A-Datensatz sein.)

Ich finde, dass dieses Setup gut funktioniert. Zusätzliche DNS-Suchvorgänge für die CNAMES werden nicht ausgeführt. und wenn ein Server abstürzt, kann ich das öffentliche DNS immer noch ziemlich schnell ändern.

Hier ist ein (improvisiertes) Beispiel in BIND-Syntax:

;name     ttl   class rr     value 
server01  30m   IN    A      192.168.0.3
server02  30m   IN    A      192.168.0.4

webmail   24h   IN    CNAME  server01
extranet  24h   IN    CNAME  server02
ftp       24h   IN    CNAME  server02
Jesper Mortensen
quelle
1
Vielen Dank, endlich eine vernünftige Meinung zu CNAMEs, die klar und knapp formuliert ist.
Tyler
@Jesper Mortensen: Könnten Sie bitte die Antwort ein wenig mit einem kleinen Beispiel aktualisieren? Insbesondere habe ich Ihren dritten Punkt nicht verstanden, als Sie sagten: "Als einzige Ausnahme zu den obigen Regeln ist der Domain-Stamm ein A-Datensatz" Im ersten Punkt wurde gesagt, dass Sie einen A-Datensatz für jeden physischen Layer-Server verwenden. (Übrigens, die Links sind weg)
Marco Demaio
2
@Marco Demaio: Über den "Domain Root A-Record": Eine Second Level Domain wie company.comist ein Zonen-Apex. Es benötigt eine SOA-Aufzeichnung. Es muss also ein A Record und kein CNAME sein - siehe serverfault.com/questions/170194/…
Jesper Mortensen
4
@ ist nicht erforderlich, um einen A-Datensatz zu haben. Vielmehr ist ein CNAME verboten.
Michael Hampton
1
Ich wollte nur hinzufügen, dass CNAMEs besonders nützlich sind, wenn Ihre Server auch IPv6-Adressen unterstützen, da Sie mindestens zwei Einträge pro Server benötigen (jeweils einen A- und einen AAAA-Eintrag) und daher einen CNAME für Sub-Domains verwenden In diesem Fall ist es sehr viel einfacher. Wenn Sie die Empfehlungen von Jesper für TTL verwenden (oder Ihr DNS-Anbieter über eine gute automatische Verarbeitung verfügt), sollte es keine echten Leistungseinbußen geben.
Haravikk
13

Ja, das ist angemessen.

Meine Best Practices, die viele Menschen teilen, sind, 1 A-Eintrag für jede Server-IP zu erstellen; und benutze CNAMES für alles andere.

Ein häufiges Beispiel wäre:

server1.example.com.      IN A      192.168.0.1
server2.example.com.      IN A      192.168.5.2
www                       IN CNAME  server1
ftp                       IN CNAME  server1
beta                      IN CNAME  server2
Chris S
quelle
Ich weiß, in dieser Frage hieß es, Mail sei hier kein Problem, aber nehmen wir an, Sie verwenden auch Mail, wie würden Sie mit MX-Datensätzen umgehen? Vielen Dank!
Marco Demaio
1
Der MX-Eintrag würde auch auf den Servernamen verweisen. IN MX server1und der Einfachheit halber würde ich empfehlen, auch imapoder popund smtpCNAMEs einzurichten, möglicherweise auch mail, da dies von vielen E-Mail-Programmen vermutet wird . Das Einrichten der richtigen SRV-Datensätze ist ebenfalls eine gute Idee. Da dies jedoch eine relativ grundlegende Frage ist, sind SRV-Datensätze für eine einfache Konfiguration möglicherweise ein wenig zu viel.
Chris S
1
Ein kurzer Kommentar, MXDatensätze dürfen keine CNAMEs sein, siehe serverfault.com/a/232243/2874. In der Praxis funktioniert das wahrscheinlich einwandfrei - es ist jedoch besser, dies nicht zu tun.
Jesper Mortensen
BIND weigert sich, die Zone zu laden, wenn Sie einen MX- ​​oder SRV-Datensatz auf einen CNAME verweisen ... Ich hätte wahrscheinlich klarstellen müssen, dass der MX-Datensatz auf den A-Datensatz verweisen muss. Danke.
Chris S
@ChrisS, wie wäre es, wenn Sie Ihre Antwort bearbeiten und klar erwähnen, dass ein MX-Eintrag nicht auf einen CNAME-Eintrag verweisen kann?
Alexis Wilke