RRSet vom Typ CNAME mit dem DNS-Namen foo.com. ist an der Spitze in Zone bar.com nicht erlaubt


101

Ich besitze foo.comund bar.com. Ich verwalte beide in Route53. foo.comhostet meine Site und ich möchte den Datenverkehr von bar.comnach leiten foo.com. Ich habe versucht, einen CNAMEDatensatz zum bar.comZeigen einzurichten foo.com, habe jedoch die Fehlermeldung erhalten:

RRSet of type CNAME with DNS name foo.com. is not permitted at apex in zone bar.com.

Warum funktioniert das nicht und was kann ich stattdessen tun?

Antworten:


90

Gemäß RFC1912 Abschnitt 2.4:

 A CNAME record is not allowed to coexist with any other data.  In
 other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you
 can't also have an MX record for suzy.podunk.edu, or an A record, or
 even a TXT record.  Especially do not try to combine CNAMEs and NS 
 records like this!:

           podunk.xx.      IN      NS      ns1
                           IN      NS      ns2
                           IN      CNAME   mary
           mary            IN      A

Der RFC ist absolut sinnvoll, da der Nameserver nicht wissen würde, ob er dem CNAME folgen oder mit dem tatsächlichen Datensatz antworten muss, mit dem sich der CNAME überschneidet. bar.comist eine Zone, daher hat sie implizit einen SOA-Datensatz für den bar.comNamen. Sie können nicht gleichzeitig einen SOA-Datensatz und einen CNAME mit demselben Namen haben.

Da SOA-Datensätze im Allgemeinen nur für die Zonenwartung verwendet werden, sind diese Situationen, in denen Sie einen CNAME am Scheitelpunkt der Zone bereitstellen möchten, häufig. Obwohl der RFC dies verbietet, möchten viele Ingenieure ein Verhalten wie: "Folgen Sie dem CNAME, es sei denn, die Abfrage fragt explizit nach dem SOA-Datensatz". Deshalb bietet Route 53 alias records. Hierbei handelt es sich um eine Route 53-spezifische Funktion, die genau die Funktionalität bietet, die Sie benötigen. Besuchen Sie http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html


8
Wenn Sie einen Datensatz in Route 53 erstellen, sodass ein Domänen-Apex an eine klassische ELB gerichtet ist, erstellen Sie einen Alias ​​für einen A-Datensatz und nicht für einen CNAME. Die detaillierten Anweisungen finden Sie hier: docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
ewalshe

@ewalshe macht dies vielleicht eine Antwort, um dies sichtbarer zu machen?
Jonathan

Aber sollen CNAMES nicht andere Domänen maskieren? dh foo.com zu bar.com, aber der Browser des Benutzers würde immer noch foo.com anzeigen? Was würde ich für diese Funktionalität suchen?
Ben A. Hilleli

Mein SSL-Zertifikat ist abgelaufen und AWS hat mir eine E-Mail gesendet, um einen CNAME für die Hosts zu erstellen, die ich habe. Ich habe jedoch bereits AAufzeichnungen darüber, was ich jetzt tun soll.
eugene

@eugene Ich gehe davon aus, dass Sie sich auf die DNS-basierte Überprüfung des Domainbesitzes von AWS beziehen: docs.aws.amazon.com/acm/latest/userguide/… Wenn dies der Fall ist, fordert Amazon Sie auf, einen CNAME für eine SUBDOMAIN des hinzuzufügen Domain, die Sie zu besitzen behaupten. Das erste Label im CNAME, das Sie erstellen sollen, wird zufällig generiert, sodass es kein Problem geben sollte, das sich mit einem anderen Datensatz überschneidet.
Ioan Alexandru Cucu

58
  1. Erstellen Sie einen S3-Bucket mit dem Namen bar.com. (Der Name muss mit der Domain übereinstimmen, von der Sie umleiten möchten, damit dies funktioniert!)
  2. Im bar.comS3 Bucket gehen Properties> Static Website Hosting, wählen Sie Redirect all requests to another host nameund geben Sie foo.comin das Textfeld ein .
  3. Zurück in Route 53 klicken Sie in Ihrem Hosted Zonefor bar.comauf Create Record Set. Wählen Sie A - IPv4 addressfür Typ. Klicken Sie Yesfür Alias. Klicken Sie auf das Textfeld für Alias Target. bar.comsollte unter aufgeführt sein -- S3 Website Endpoints --. Speichern Sie den Datensatz. Warten Sie einige Minuten und Sie sollten ein Umleitungssetup haben, um Anforderungen von bar.com an foo.com umzuleiten.

Sie können dieselbe Methode verwenden, um eine nackte Domain in eine Subdomain (wie www) umzuleiten. Ich verwende dies in Fällen, in denen www.foo.com ein CNAME sein muss, also leite ich mit derselben Methode von foo.com zu www.foo.com um. Wenn foo.com ein A-Datensatz ist, können Sie diese Technik verwenden, um von www.foo.com zu foo.com umzuleiten.

HINWEIS: Diese Methode leitet den vollständigen Pfad weiter. dh http://bar.com/test wird an http://foo.com/test weitergeleitet .


1
Ich habe festgestellt, dass mein s3-Bucket-Name nicht geladen wird, wenn AWS Route 53 verfügbare Links zum Verknüpfen anzeigt. Ich habe irgendwo gelesen, dass es wichtig sein kann, als welchen AWS Console-Benutzer Sie dies erstellen und in welcher Region ...
bjm88

foo.com/test funktioniert für mich, aber der Zugriff auf bar.com/test gibt mir einen AccessDenied-Fehler. Hat jemand Vorschläge? Ich konnte die Bucket-Richtlinie für das Konto "shell bar.com" nicht ändern.
Sean

10

Auf Route53 müssen Sie einen A- Datensatz NICHT einen CNAME- Datensatz erstellen und darunter einen Alias ​​erstellen.

Aus @ ewalshes Kommentar zu Alexandru Cucus Antwort, wenn Sie hierher gekommen sind und versucht haben, API Gateway mit einem benutzerdefinierten Domainnamen und einer Cloudfront-Verteilungs-URL einzurichten.


Ich habe einen ADatensatz und die Erneuerung des Zertifikats ist fehlgeschlagen. Aws hat mir eine E-Mail mit dem Vorschlag gesendet, CNAME... was zu tun ist?
eugene

1

tldr; Sie müssen einen FQDN als ResourceRecordSet-Namen übergeben.

Ich hatte das gleiche Problem mit dieser Anweisung c # snip:

 private static void RegisterHostWithDns(IAmazonRoute53 ec2,SynoviaImage image)
        {
            var changeBatch = new ChangeBatch();
            var rRs = new ResourceRecordSet(image.Name, RRType.CNAME) {TTL=60,ResourceRecords = new List<ResourceRecord>() { new ResourceRecord(image.PublicDns)} };
            var change = new Change(ChangeAction.UPSERT, rRs);
            changeBatch.Changes.Add(change);
            var request = new ChangeResourceRecordSetsRequest(ConfigurationManager.AppSettings["DnsZoneId"], changeBatch);
            var response = ec2.ChangeResourceRecordSets(request);
            Console.WriteLine("Updated CNAME For {0} setting {1}",image.Name,image.PublicDns);
        }

In diesem Fall image.Name == "Listener"

Einmal habe ich es geändert in:

 private static void RegisterHostWithDns(IAmazonRoute53 ec2,SynoviaImage image)
        {
            var changeBatch = new ChangeBatch();
            var rRs = new ResourceRecordSet(string.Format("{0}.{1}",image.Name, "testing.foo.bar.com"), RRType.CNAME) {TTL=60,ResourceRecords = new List<ResourceRecord>() { new ResourceRecord(image.PublicDns)} };
            var change = new Change(ChangeAction.UPSERT, rRs);
            changeBatch.Changes.Add(change);
            var request = new ChangeResourceRecordSetsRequest(ConfigurationManager.AppSettings["DnsZoneId"], changeBatch);
            var response = ec2.ChangeResourceRecordSets(request);
            Console.WriteLine("Updated CNAME For {0} setting {1}",image.Name,image.PublicDns);
        }

Jetzt lautet der übergebene Wert: "Listener.fully.qualified.com"

Es funktioniert jetzt.


0

Sie sollten das DNAME anstelle eines CNAME verwenden. Ein CNAME-Datensatz kann das Etikett nur auf ein anderes Etikett umleiten.

Wenn Sie über das Umleiten von Domainnamen anstelle von Labels sprechen, sollten Sie DNAME verwenden

$ORIGIN bar.com
           IN      DNAME   foo.com

Dies bedeutet auch, dass alle A-, NS- und weiteren Datensätze gelöscht werden sollten. Dies muss in der Domäne foo.com konfiguriert werden.


1
DNAMEist in RFC 2672 definiert . Können Sie erklären, wie dies mit OP zusammenhängt? Route53 erlaubt das Löschen von SOA- oder NS-Datensätzen nicht, zumindest nicht über die Standardschnittstelle, und DNAME ist keine verfügbare Option.
Josh Habdas
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.