RRSet типа CNAME с DNS-именем foo.com. не разрешается на вершине в зоне bar.com


Я владею foo.com и bar.com. Я управляю обоими в Route53. foo.com размещен мой сайт, и я хотел бы направить трафик с bar.com до foo.com. Я пытался настроить CNAME рекорд bar.com указывая на foo.com, но я получил сообщение об ошибке:

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

почему это не работает, и что я могу сделать вместо этого?

5 72

5 ответов:

согласно разделу 2.4 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

RFC имеет смысл, поскольку сервер имен не знает, нужно ли ему следовать CNAME или отвечать с фактической записью, с которой пересекается CNAME. bar.com - это зона, поэтому она неявно имеет запись SOA для bar.com имя. Вы не можете иметь как запись SOA, так и CNAME с тем же именем.

однако, учитывая, что записи SOA обычно используются только для обслуживания зоны, эти ситуации, когда вы хотите предоставление CNAME на вершине зоны довольно распространено. Несмотря на то, что RFC запрещает это, многие инженеры хотели бы такое поведение, как: "следуйте CNAME, если запрос явно не запрашивает запись SOA". Вот почему маршрут 53 обеспечивает alias records. Это специфическая функция Route 53, которая предлагает точную функциональность, которую вы требуете. Взгляните на http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

  1. создайте ведро S3 под названием bar.com. (Имя должно совпадать с доменом, который вы хотите перенаправить, чтобы это работало!)
  2. на bar.com ведро S3 перейти к Properties>Static Website Hosting выберите Redirect all requests to another host name и вводим foo.com в текстовое поле.
  3. назад в маршрут 53, в ваш Hosted Zone на bar.com, нажмите кнопку Create Record Set. Выберите A - IPv4 address для типа. Нажмите Yes на Alias. Щелкните текстовое поле для Alias Target. bar.com должны быть перечислены в разделе -- S3 Website Endpoints --. Спасать запись. Подождите несколько минут, и у вас должна быть настройка перенаправления для перенаправления запросов от bar.com к foo.com.

вы можете использовать этот же метод для перенаправления голого домена в поддомен (например, www). Я использую это в случаях, когда www.foo.com должен быть CNAME, поэтому я перенаправляю из foo.com к www.foo.com с помощью этого же метода. Если foo.com является ли запись A, вы можете использовать эту технику для перенаправления с www.foo.com к foo.com.

Примечание: этот метод будет дальше с полный путь. то есть http://bar.com/test будем переадресовывать наhttp://foo.com/test.

на Route53, вам нужно создать A запись Не a CNAME запись, и создать псевдоним под этим.

из комментария @ewalshe к ответу Александру Куку, если вы пришли сюда, пытаясь настроить API Gateway с пользовательским доменным именем и иметь url-адрес распространения Cloudfront.

вы должны использовать DNAME вместо CNAME. Запись CNAME может только перенаправить метку на другую метку.

когда вы говорите о перенаправлении доменных имен вместо меток, вы должны использовать DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

Это также означает, что все a, NS и любые другие записи должны быть удалены. Это должно быть настроено в foo.com домен.

tldr; вы должны передать полное доменное имя в качестве имени ResourceRecordSet.

у меня была такая же проблема, используя этот оператор 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);
        }

в этом случае image.Name = = "слушатель"

Как только я изменил его на:

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

теперь передается значение: "Listener.fully.qualified.com"

Он работает сейчас.