Wie können CNAME-Einschränkungen für Stammdomänen überwunden werden?


116

Wir hosten viele Webanwendungen für unsere Kunden. Da es offensichtlich ist, dass sie ihre eigenen Domänen verwenden möchten, um auf diese Anwendungen zu verweisen, möchten sie normalerweise, dass jeder Benutzer entweder seine Webanwendung eingibt http://www.customer1.exampleoder http://customer1.examplezu dieser wechselt.

Die Situation, mit der wir konfrontiert sind, besteht darin, dass wir die Flexibilität haben müssen, IP-Adressen in naher Zukunft zu ändern. Und wir möchten uns nicht darauf verlassen, dass der Kunde die Änderung des A-Datensatzes für seine Domains vornimmt. Wir dachten also, dass die Verwendung von CNAMEDatensätzen funktionieren wird, aber wie wir herausfinden, CNAMEfunktionieren Datensätze für die Stammdomäne nicht.

Grundsätzlich:

customer1.example IN CNAME customer1.mycompanydomain.example //this is invalid as the RFC
www.customer1.example IN CNAME customer1.mycompanydomain.example //this is valid and will work

Wir möchten in der Lage sein, die IP-Adresse customer1.mycompanydomain.exampleoder den ADatensatz zu ändern, und unsere Kunden werden diesem Datensatz folgen, über den wir die Kontrolle haben.

In unserem DNS sieht es so aus:

customer1.mycompanydomain.example IN A 192.0.2.1

Irgendwelche Ideen?


Ich verstehe nicht, warum "customer1.com IN CNAME customer1.mycompanydomain.com" ungültig ist. Ich glaube es sollte funktionieren. Können Sie erklären, wo das Problem mit dieser Lösung lag?
Sleske

3
Ja, bitte lesen Sie die folgende Frage und Antwort. Es ist gemäß DNS-RFC ungültig. stackoverflow.com/questions/655235/…
Geo

2
Ich verstehe den Titel der Frage nicht. Wo ist die "Wurzel" (.) Beteiligt?
Bortzmeyer

2
er meint die Wurzel einer Zone, nicht "die Wurzel"
Alnitak

2
Nun, es ist also kein gewöhnliches DNS-Vokabular. Ist "Apex" nicht das richtige Wort? Oder "Top-Level" für Lisp-Programmierer? :-)
Bortzmeyer

Antworten:


63

Der Grund, warum diese Frage immer noch häufig auftaucht, ist, dass, wie Sie bereits erwähnt haben, irgendwo jemand, der als wichtig angesehen wird, geschrieben hat, dass die RFC-Domänennamen ohne Subdomain vor ihnen nicht gültig sind. Wenn Sie den RFC jedoch sorgfältig lesen, werden Sie feststellen, dass dies nicht genau das ist, was darin steht. In der Tat heißt es in RFC 1912 :

Gehen Sie mit CNAMEs nicht über Bord. Verwenden Sie sie beim Umbenennen von Hosts, planen Sie jedoch, sie zu entfernen (und Ihre Benutzer zu informieren).

Einige DNS-Hosts bieten eine Möglichkeit, mithilfe eines benutzerdefinierten Datensatztyps CNAME-ähnliche Funktionen an der Zonenspitze (der Stammdomänenebene für den nackten Domänennamen) abzurufen. Solche Aufzeichnungen umfassen zum Beispiel:

  • ALIAS bei DNSimple
  • ANAME bei DNS leicht gemacht
  • ANAME bei easyDNS
  • CNAME bei CloudFlare

Das Setup ist für jeden Anbieter ähnlich: Zeigen Sie mit dem ALIAS- oder ANAME-Eintrag für Ihre Apex-Domain auf example.domain.com, genau wie bei einem CNAME-Datensatz. Abhängig vom DNS-Anbieter identifiziert ein leerer oder @ Name-Wert den Zonenscheitelpunkt.

ALIAS oder ANAME oder @ example.domain.com.

Wenn Ihr DNS-Anbieter einen solchen Datensatztyp nicht unterstützt und Sie nicht zu einem solchen wechseln können, müssen Sie die Subdomain-Umleitung verwenden, die je nach Protokoll oder Serversoftware nicht so schwierig ist .

Ich bin mit der Aussage, dass sie nur von "Amateuradministratoren" oder solchen Ideen gemacht wird, überhaupt nicht einverstanden. Es ist ein einfaches "Was müssen der Name und sein Service tun?" handeln und dann Ihre DNS-Konfiguration anpassen, um diese Wünsche zu erfüllen; Wenn Ihre Hauptdienste Web und E-Mail sind, sehe ich keinen GÜLTIGEN Grund, warum das problemlose Löschen der CNAMEs problematisch wäre. Wer würde @ subdomain.domain.org gegenüber @ domain.org bevorzugen? Wer braucht "www", wenn Sie bereits mit dem Protokoll selbst eingestellt sind? Es ist unlogisch anzunehmen, dass die Verwendung eines Root-Domainnamens ungültig wäre.


1
Diese spezielle Antwort war für mich sehr hilfreich, da ich eine Root-Domain auf ein CDN verweisen wollte. Die meisten CDNs sind notwendigerweise ein FQDN, da sie an verschiedenen Orten oder zu verschiedenen Zeiten in verschiedene IPs aufgelöst werden können. Ich verwende DNS Made Easy und konnte den Datensatztyp ANAME verwenden.
Rubix

3
Ich konnte nicht mehr zustimmen. Es ist üblich und logisch, eine Site über den "nackten" Domainnamen zu hosten. Es verwendet weniger Zeichen, sieht besser aus usw. Die Protokollkennung der URL (www) ist ein wesentlicher Bestandteil der URL, wenn dies überhaupt erforderlich war (war es nicht).
Ed Bishop

3
ANAME's sind nett, oder Sie können nur 301 alle nicht-www zu www. über kostenlosen 301 Weiterleitungsdienst 198.251.86.133
Jacob Evans

51

Das CNAME eines Stammdatensatzes ist technisch nicht gegen RFC gerichtet, hat jedoch Einschränkungen, was bedeutet, dass dies eine Vorgehensweise ist, die nicht empfohlen wird.

Normalerweise enthält Ihr Stammdatensatz mehrere Einträge. Sagen wir 3 für Ihre Nameserver und dann einen für eine IP-Adresse.

Pro RFC:

Wenn an einem Knoten ein CNAME RR vorhanden ist, sollten keine anderen Daten vorhanden sein.

Und gemäß IETF-Dokument "Häufige DNS-Betriebs- und Konfigurationsfehler":

Dies wird häufig von unerfahrenen Administratoren versucht, um Ihren Domain-Namen auch als Host zuzulassen. DNS-Server wie BIND sehen jedoch den CNAME und lehnen es ab, weitere Ressourcen für diesen Namen hinzuzufügen. Da keine anderen Datensätze mit einem CNAME koexistieren dürfen, werden die NS-Einträge ignoriert. Daher werden auch alle Hosts in der Domain podunk.xx ignoriert!

Verweise:


17
Aber WARUM gibt es keinen anderen Datensatz, der mit einem CNAME koexistieren darf? Ist dies nur eine vom Autor des RFC hinzugefügte Einschränkung oder gibt es einen technischen Grund dafür? Wenn es keinen technischen Grund dafür gibt, könnte man leicht eine Erweiterung RFC finden.
Sven

Wenn es für mich funktioniert (verwenden Sie CNAME für den Stammdatensatz, andere Subdomänen für diese Domäne funktionieren noch), bedeutet dies, dass ich nur Glück habe und die DNS-Implementierung meines Anbieters nicht ignoriert, dass zusätzliche Datensätze dies könnten? Und es bedeutet auch, dass ich keine Probleme auf der Clientseite befürchten muss, solange der DNS-Server dies so behandelt?
Didi_X8

Dies ist ein Versuch, eine andere Frage zu beantworten: "Warum sind CNAMEs an der Spitze nicht zulässig?", Während die eigentliche Frage lautet: "Wie kann diese Einschränkung überwunden werden?". -1.
Rustyx


Das CNAME eines Stammdatensatzes ist technisch nicht gegen RFC. Sie müssen erklären, wie es nicht gegen RFC1034 ist. Abschnitt 3.6.2: Wenn an einem Knoten eine CNAME-RR vorhanden ist, sollten keine anderen Daten vorhanden sein. Dies stellt sicher, dass die Daten für einen kanonischen Namen und seine Aliase nicht unterschiedlich sein können. . Natürlich die „root“ (die den Scheitelpunkt genau in diesem Zusammenhang ist) haben bereits NSund SOAAufzeichnungen und daher nicht haben können CNAMEAufzeichnungen.
Patrick Mevzek

4

Ich weiß nicht, wie sie damit durchkommen oder welche negativen Nebenwirkungen sie haben können, aber ich verwende Hover.com, um einige meiner Domains zu hosten, und habe dort kürzlich den Scheitelpunkt meiner Domain als CNAME eingerichtet. Ihr DNS-Bearbeitungstool hat sich überhaupt nicht beschwert, und meine Domain wird glücklich über den zugewiesenen CNAME aufgelöst.

Folgendes zeigt mir Dig für diese Domain (tatsächliche Domain, die als mydomain.com verschleiert ist):

; <<>> DiG 9.8.3-P1 <<>> mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2056
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mydomain.com.          IN  A

;; ANSWER SECTION:
mydomain.com.       394 IN  CNAME   myapp.parseapp.com.
myapp.parseapp.com. 300 IN  CNAME   parseapp.com.
parseapp.com.       60  IN  A   54.243.93.102

Wenn die Verschleierung wirklich benötigt wird (der DNS ist öffentlich ...), sollte die RFC2606-Anleitung verwendet werden. Und RFC5737 oder 3849 für IP-Adressen
Patrick Mevzek

3

Mein Unternehmen macht dasselbe für eine Reihe von Kunden, bei denen wir eine Website für sie hosten, obwohl es in unserem Fall eher xyz.company.com als www.company.com ist. Wir veranlassen sie, den A-Eintrag auf xyz.company.com so einzustellen, dass er auf eine IP-Adresse verweist, die wir ihnen zuweisen.

Ich glaube nicht, dass es eine perfekte Lösung gibt, wie Sie mit einer Änderung der IP-Adresse umgehen können. Einige Ideen sind:

  • Verwenden Sie einen NAT- oder IP-Load-Balancer und geben Sie Ihren Kunden eine dazugehörige IP-Adresse. Wenn sich die IP-Adresse des Webservers ändern muss, können Sie das NAT oder den Load Balancer aktualisieren.

  • Bieten Sie auch einen DNS-Hosting-Service an und veranlassen Sie Ihre Kunden, ihre Domain bei Ihnen zu hosten, damit Sie in der Lage sind, die A-Einträge zu aktualisieren.

  • Lassen Sie Ihre Kunden ihren A-Eintrag auf einen Hauptwebserver einstellen und verwenden Sie eine HTTP-Umleitung für die Webanforderungen jedes Kunden.


3

Sipwiz ist korrekt. Der einzige Weg, dies richtig zu machen, ist der HTTP- und DNS-Hybridansatz. Mein Registrar ist ein Wiederverkäufer von Tucows und bietet die Weiterleitung von Root-Domains als kostenlosen Mehrwertdienst an.

Wenn Ihre Domain blah.com ist, werden Sie gefragt, wohin die Domain weitergeleitet werden soll, und Sie geben www.blah.com ein. Sie weisen den A-Eintrag ihrem Apache-Server zu und fügen blah.com automatisch als DNS-vhost hinzu. Der vhost antwortet mit einem HTTP 302-Fehler, der sie zur richtigen URL umleitet. Es ist einfach zu skripten / einzurichten und kann von Low-End-Geräten verarbeitet werden, da sonst Hardware verschrottet wird.

Führen Sie den folgenden Befehl für ein Beispiel aus: curl -v eclecticengineers.com


3

Sie müssen einen Punkt am Ende der externen Domain einfügen, damit Sie nicht customer1.mycompanydomain.com.localdomain meinen.

Also einfach ändern:

customer1.com IN CNAME customer1.mycompanydomain.com

Zu

customer1.com IN CNAME customer1.mycompanydomain.com.

Für mich (BIND 9.8.2) funktioniert dies, wenn die Datensätze für die Domäne bestimmt customer1.comsind ... wird jedoch so interpretiert, dass CNAMe für eine Unterdomäne angegeben wird customer1.com.customer1.com. Wenn ich dem ersten Element einen Punkt hinzufüge, wird der Datensatz korrekt interpretiert, funktioniert aber nicht mehr. Ich sehe hier keine Lösung.
Jussi Hirvi

-2

Ich sehe, dass readytocloud.com auf Apache 2.2 gehostet wird.

Es gibt eine viel einfachere und effizientere Möglichkeit, die Nicht-WWW-Site auf die WWW-Site in Apache umzuleiten.

Fügen Sie den Apache-Konfigurationen die folgenden Umschreiberegeln hinzu (entweder innerhalb des virtuellen Hosts oder außerhalb. Es spielt keine Rolle):

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule ^/$ http://www.readytocloud.com/ [R=301,L]

Oder die folgenden Umschreiberegeln, wenn Sie eine 1-zu-1-Zuordnung von URLs von der Nicht-WWW-Site zur WWW-Site wünschen:

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule (.*) http://www.readytocloud.com$1 [R=301,L]

Beachten Sie, dass das Modul mod_rewrite geladen werden muss, damit dies funktioniert. Glücklicherweise läuft readytocloud.com auf einer CentOS-Box, die standardmäßig mod_rewrite lädt.

Wir haben einen Client-Server, auf dem Apache 2.2 mit knapp 3.000 Domänen und fast 4.000 Weiterleitungen ausgeführt wird. Die Auslastung des Servers liegt jedoch zwischen 0,10 und 0,20.


Die Frage betraf DNS. Nicht über Apache-Webserver.
SamTzu

-7

Vielen Dank an sipwiz und MrEvil. Wir haben ein PHP-Skript entwickelt, das die vom Benutzer eingegebene URL analysiert und wwwoben einfügt. (Wenn der Kunde beispielsweise kiragiannis.com betritt , wird er zu www.kiragiannis.com weitergeleitet. ) Unsere Kunden verweisen also auf ihre Wurzel (z. B. customer1.comum Aaufzuzeichnen, wo sich unser Web-Redirector befindet) und dann www CNAMEauf die Avon uns verwaltete tatsächliche Aufzeichnung.

Unter dem Code für den Fall, dass Sie für zukünftige uns interessiert sind.

<?php
$url = strtolower($_SERVER["HTTP_HOST"]);

if(strpos($url, "//") !== false) { // remove http://
  $url = substr($url, strpos($url, "//") + 2);
}

$urlPagePath = "";
if(strpos($url, "/") !== false) { // store post-domain page path to append later
  $urlPagePath = substr($url, strpos($url, "/"));
  $url = substr($url, 0, strpos($url,"/"));
}


$urlLast = substr($url, strrpos($url, "."));
$url = substr($url, 0, strrpos($url, "."));


if(strpos($url, ".") !== false) { // get rid of subdomain(s)
  $url = substr($url, strrpos($url, ".") + 1);
}


$url = "http://www." . $url . $urlLast . $urlPagePath;

header( "Location:{$url}");
?>

10
Dies beantwortet nicht die Frage, nach der mehr als 69.000 Menschen in diesem Thread gesucht haben. Die Frage bezieht sich mehr auf DNS und hat nichts mit PHP zu tun.
Matt Clark

1
Die Frage betraf DNS. Nicht über PHP-Codierung.
SamTzu

HTTP_HOST ist der Hostname, wie der Name schon sagt, keine URL. Daher gibt es keine http://zu entfernen, noch /( $urlPagePathwird immer leer sein). Cf httpd.apache.org/docs/2.4/expr.html . Aufgrund der Art und Weise, wie der Code versucht, die Subdomain loszuwerden, funktioniert er auch nicht für Dinge, bei www.example.co.ukdenen co.ukals Ganzes betrachtet werden muss. Es behandelt auch kein HTTPS. Und schließlich ist die Verwendung von PHP nur eine HTTP-Umleitung, bei der jeder Webserver dies in der Konfiguration tun kann, überkompliziert. Kurz gesagt, dies sollte sicherlich nicht die validierte Antwort auf diese Frage sein.
Patrick Mevzek

Wenn diese Regel für alle Hosts gelten soll, sollte sie als Apache-Konfiguration durchgeführt werden
Svetoslav Marinov
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.