web-dev-qa-db-fra.com

RRSet de type CNAME avec le nom DNS foo.com. n'est pas autorisé à l'apex dans la zone bar.com

Je possède foo.com et bar.com. Je gère les deux dans Route53. foo.com héberge mon site et j'aimerais diriger le trafic de bar.com à foo.com. J'ai essayé de créer un enregistrement CNAME pour bar.com pointant vers foo.com, mais j'ai le message d'erreur suivant:

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?

86
fredley

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

La RFC est parfaitement logique car le serveur de noms ne sait pas s'il doit suivre le CNAME ou répondre avec l'enregistrement réel avec lequel CNAME se chevauche. bar.com est une zone et a donc implicitement un enregistrement SOA pour l’enregistrement bar.com Nom. Vous ne pouvez pas avoir à la fois un enregistrement SOA et un CNAME du même nom).

Toutefois, étant donné que les enregistrements SOA sont généralement utilisés uniquement pour la maintenance de zone, les 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 comme un comportement tel que: "suivez le CNAME sauf si la requête demande explicitement l'enregistrement SOA enregistrement"). 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. Regardez http://docs.aws.Amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

76
  1. Créez un seau S3 appelé bar.com. (Le nom doit être identique au domaine que vous souhaitez rediriger pour que cela fonctionne!)
  2. Dans le bar.com S3 Bucket aller à Properties> Static Website Hosting, sélectionnez Redirect all requests to another Host name et entrez foo.com dans la zone de texte.
  3. De retour sur la route 53, dans votre Hosted Zone pour bar.com, Cliquez sur Create Record Set. Sélectionnez A - IPv4 address pour le type. Cliquez sur Yes pour Alias. Cliquez sur la zone de texte pour Alias Target. bar.com devrait figurer sous -- S3 Website Endpoints --. Enregistrez 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 la 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 http://bar.com/test sera transféré à http://foo.com/test .

53
Rob Eroh

Sur Route53, vous devez créer un enregistrement A SAUF un enregistrement CNAME , et créer un alias sous cela.

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 de disposer d'une URL de distribution Cloudfront.

7
Jonathan

tldr; Vous devez passer un nom de domaine complet sous le nom ResourceRecordSet.

J'ai eu ce même problème en utilisant cette déclaration 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é pour:

 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.

1
Wjdavis5

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

Lorsque vous parlez de la redirection de noms de domaine au lieu d’étiquettes, vous devez utiliser DNAME

$Origin bar.com
           IN      DNAME   foo.com

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

0
BlahBlah