RRSet di tipo CNAME con nome DNS foo.com. non è consentito all'apice in zone bar.com


101

Possiedo foo.come bar.com. Sto gestendo entrambi in Route53. foo.comospita il mio sito e vorrei indirizzare il traffico da bar.coma foo.com. Ho provato a impostare un CNAMErecord per il bar.compuntamento foo.com, ma ho ricevuto il messaggio di errore:

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

Perché non funziona e cosa posso fare invece?

Risposte:


90

Come da RFC1912 sezione 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

L'RFC ha perfettamente senso in quanto il server dei nomi non saprebbe se deve seguire il CNAME o rispondere con il record effettivo a cui si sovrappone il CNAME. bar.comè una zona quindi ha implicitamente un record SOA per il bar.comnome. Non puoi avere sia un record SOA che un CNAME con lo stesso nome.

Tuttavia, dato che i record SOA vengono generalmente utilizzati solo per la manutenzione della zona, queste situazioni in cui si desidera fornire un CNAME all'apice della zona sono abbastanza comuni. Anche se l'RFC lo proibisce, molti ingegneri vorrebbero un comportamento del tipo: "segui il CNAME a meno che la query non richieda esplicitamente il record SOA". Ecco perché Route 53 fornisce alias records. Si tratta di una funzionalità specifica di Route 53 che offre la funzionalità esatta richiesta. Dai un'occhiata a http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html


8
Quando crei un record in Route 53 in modo che l'apice di un dominio sia indirizzato a un ELB classico, crei un alias a un record A anziché a un CNAME. Le istruzioni dettagliate possono essere trovate qui: docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
ewalshe

@ewalshe forse ne fa una risposta per dare più visibilità?
Jonathan

Ma i CNAMES non dovrebbero mascherare altri domini? cioè foo.com a bar.com, ma il browser dell'utente continuerebbe a mostrare foo.com? Cosa cercherò per quella funzionalità?
Ben A. Hilleli

il mio certificato SSL è scaduto e AWS mi ha inviato un'e-mail per creare CNAME per gli host che ho, ma ho già un Arecord, cosa fare ora?
eugene

@eugene Presumo tu stia facendo riferimento alla verifica della proprietà del dominio basata su DNS di AWS: docs.aws.amazon.com/acm/latest/userguide/… Se è così, Amazon ti chiede di aggiungere un CNAME per un SUBDOMAIN del dominio che dichiari di possedere. La prima etichetta nel CNAME che ti chiedono di creare viene generata casualmente, quindi non dovrebbe esserci un problema con la sovrapposizione con qualsiasi altro record.
Ioan Alexandru Cucu

58
  1. Crea un bucket S3 chiamato bar.com. (Il nome deve essere lo stesso del dominio da cui vuoi reindirizzare affinché funzioni!)
  2. Nel bar.comBucket S3 vai a Properties> Static Website Hosting, seleziona Redirect all requests to another host namee inserisci foo.comnella casella di testo.
  3. Di nuovo in Route 53, nel tuo Hosted Zoneper bar.com, fai clic Create Record Set. Seleziona A - IPv4 addressper tipo. ClicYes per Alias. Fare clic sulla casella di testo per Alias Target. bar.comdovrebbe essere elencato sotto -- S3 Website Endpoints --. Salva il record. Attendi qualche minuto e dovresti avere una configurazione di reindirizzamento per reindirizzare le richieste da bar.com a foo.com.

Puoi utilizzare lo stesso metodo per reindirizzare un dominio vuoto a un sottodominio (come www). Lo uso nei casi in cui www.foo.com deve essere un CNAME, quindi reindirizzo da foo.com a www.foo.com con lo stesso metodo. Se foo.com è un record A, puoi utilizzare questa tecnica per reindirizzare da www.foo.com a foo.com.

NOTA: questo metodo verrà inoltrato con il percorso completo. cioè http://bar.com/test inoltrerà a http://foo.com/test .


1
Ho scoperto che il nome del mio bucket s3 non viene caricato quando AWS Route 53 mostra quelli disponibili per il collegamento. Ho letto da qualche parte che potrebbe importare quale utente della console AWS crei e forse quale regione ...
bjm88

foo.com/test funziona per me, ma l'accesso a bar.com/test mi dà un errore AccessDenied. Qualcuno ha suggerimenti? Non sono riuscito a modificare la policy del bucket sull'account shell bar.com.
Sean

10

Su Route53, devi creare un record A NON un CNAME record e creare un alias sotto di esso.

Dal commento di @ ewalshe sulla risposta di Alexandru Cucu, se sei venuto qui provando a configurare API Gateway con un nome di dominio personalizzato e hai un URL di distribuzione Cloudfront.


Ho un Arecord e il rinnovo del certificato non è riuscito e aws mi ha inviato un'e-mail suggerendomi di creare CNAME... cosa fare?
eugene

1

tldr; Devi passare un FQDN come nome ResourceRecordSet.

Ho avuto lo stesso problema usando questa istruzione 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 questo caso image.Name == "Listener"

Una volta modificato 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);
        }

ora il valore passato è: "Listener.fully.qualified.com"

Ora funziona.


0

Dovresti usare DNAME invece di CNAME. Un record CNAME può solo reindirizzare l'etichetta a un'altra etichetta.

Quando parli di reindirizzare i nomi di dominio invece delle etichette, dovresti usare DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

Ciò significa anche che ogni A, NS e qualsiasi altro record devono essere eliminati. Questo deve essere configurato nel dominio foo.com.


1
DNAMEè definito nella RFC 2672 . Potresti spiegare come questo si collega all'OP? Route53 non consente l'eliminazione dei record SOA o NS, almeno dall'interfaccia standard e DNAME non è un'opzione disponibile.
Josh Habdas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.