RRSet de type CNAME avec le nom DNS foo.com. n'est pas autorisé au sommet de la zone bar.com


102

Je possède foo.comet bar.com. Je gère les deux dans Route53. foo.comhéberge mon site et j'aimerais diriger le trafic de bar.comvers foo.com. J'ai essayé de créer un CNAMEenregistrement pour bar.compointer vers foo.com, mais j'ai reçu le message d'erreur:

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

Pourquoi cela ne fonctionne-t-il pas et que puis-je faire à la place?

Réponses:


90

Conformément à la section 2.4 de la RFC1912:

 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

Le RFC est parfaitement logique car le serveur de noms ne saurait pas s'il doit suivre le CNAME ou répondre avec l'enregistrement réel avec lequel le CNAME chevauche. bar.comest une zone, il a donc implicitement un enregistrement SOA pour le bar.comnom. Vous ne pouvez pas avoir à la fois un enregistrement SOA et un CNAME portant le même nom.

Cependant, étant donné que les enregistrements SOA sont généralement utilisés uniquement pour la maintenance de zone, ces situations dans lesquelles vous souhaitez fournir un CNAME au sommet de la zone sont assez courantes. Même si la RFC l'interdit, de nombreux ingénieurs souhaiteraient un comportement tel que: "suivre le CNAME sauf si la requête demande explicitement l'enregistrement SOA". C'est pourquoi Route 53 fournit alias records. Il s'agit d'une fonctionnalité spécifique à Route 53 qui offre la fonctionnalité exacte dont vous avez besoin. Jetez un œil à http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html


8
Lors de la création d'un enregistrement dans Route 53 afin qu'un sommet de domaine soit dirigé vers un ELB classique, vous créez un alias vers un enregistrement A plutôt que vers un CNAME. Les instructions détaillées peuvent être trouvées ici: docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
ewalshe

@ewalshe peut-être en faire une réponse pour donner plus de visibilité à cela?
Jonathan le

Mais le CNAMES n'est-il pas censé masquer d'autres domaines? c'est-à-dire foo.com à bar.com, mais le navigateur de l'utilisateur afficherait toujours foo.com? Que rechercherais-je pour cette fonctionnalité?
Ben A. Hilleli

mon certificat SSL a expiré et AWS m'a envoyé un e-mail pour créer CNAME pour les hôtes que j'ai, mais j'ai déjà un Aenregistrement, que faire maintenant?
eugene le

@eugene Je suppose que vous faites référence à la vérification de la propriété de domaine basée sur DNS d'AWS: docs.aws.amazon.com/acm/latest/userguide / ... Si tel est le cas, Amazon vous demande d'ajouter un CNAME pour un SUBDOMAIN du domaine que vous prétendez posséder. La première étiquette du CNAME qu'ils vous demandent de créer est générée de manière aléatoire, il ne devrait donc pas y avoir de problème de chevauchement avec un autre enregistrement.
Ioan Alexandru Cucu le

58
  1. Créez un compartiment S3 appelé bar.com. (Le nom doit être le même que le domaine à partir duquel vous souhaitez rediriger pour que cela fonctionne!)
  2. Dans le bar.comcompartiment S3, accédez à Properties> Static Website Hosting, sélectionnez Redirect all requests to another host nameet entrez foo.comdans la zone de texte.
  3. De retour dans Route 53, dans votre Hosted Zonepour bar.com, cliquez sur Create Record Set. Sélectionnez A - IPv4 addresspour le type. Cliquez Yespour Alias. Cliquez sur la zone de texte pour Alias Target. bar.comdoit être répertorié sous -- S3 Website Endpoints --. Sauvegardez l'enregistrement. Attendez quelques minutes et vous devriez avoir une configuration de redirection pour rediriger les demandes de bar.com vers foo.com.

Vous pouvez utiliser cette même méthode pour rediriger un domaine nu vers un sous-domaine (comme www). J'utilise ceci dans les cas où www.foo.com doit être un CNAME donc je redirige de foo.com vers www.foo.com avec cette même méthode. Si foo.com est un enregistrement A, vous pouvez utiliser cette technique pour rediriger de www.foo.com vers foo.com.

REMARQUE: cette méthode transmettra avec le chemin complet. c'est-à-dire que http://bar.com/test sera transféré vers http://foo.com/test .


1
J'ai trouvé que le nom de mon compartiment s3 ne se charge pas lorsque AWS Route 53 affiche les noms disponibles à lier. J'ai lu quelque part que l'utilisateur de la console AWS que vous créez peut avoir une importance et peut-être quelle région ...
bjm88

foo.com/test fonctionne pour moi, mais l'accès à bar.com/test me donne une erreur AccessDenied. Quelqu'un a des suggestions? Je n'ai pas pu modifier la politique de seau sur le compte shell bar.com.
Sean

10

Sur Route53, vous devez créer un enregistrement A PAS un enregistrement CNAME et créer un alias sous celui-ci.

D'après le commentaire de @ ewalshe sur la réponse d'Alexandru Cucu, si vous êtes venu ici pour essayer de configurer API Gateway avec un nom de domaine personnalisé et avoir une URL de distribution Cloudfront.


J'ai un Aenregistrement, et le renouvellement du certificat a échoué et aws m'a envoyé un e-mail suggérant de créer CNAME... que faire?
eugene le

1

tldr; Vous devez transmettre un nom de domaine complet comme nom ResourceRecordSet.

J'ai eu ce même problème en utilisant cette instruction 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);
        }

Dans ce cas image.Name == "Listener"

Une fois que je l'ai changé en:

 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);
        }

maintenant la valeur transmise est: "Listener.fully.qualified.com"

Ça fonctionne maintenant.


0

Vous devez utiliser le DNAME au lieu d'un CNAME. Un enregistrement CNAME ne peut rediriger l'étiquette que vers une autre étiquette.

Lorsque vous parlez de rediriger des noms de domaine au lieu d'étiquettes, vous devez utiliser DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

Cela signifie également que tous les enregistrements A, NS et tout autre enregistrement doivent être supprimés. Cela doit être configuré dans le domaine foo.com.


1
DNAMEest défini dans la RFC 2672 . Pouvez-vous expliquer comment cela se rapporte à OP? Route53 n'autorise pas la suppression d'enregistrements SOA ou NS, du moins à partir de l'interface standard et DNAME n'est pas une option disponible.
Josh Habdas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.