RRSet типу CNAME з іменем DNS foo.com. заборонено на вершині в зоні bar.com


101

Я є власником 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.

Чому це не працює, і що я можу зробити замість цього?

Відповіді:


90

Згідно з розділом 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. Це особливість маршруту 53, яка пропонує точний функціонал, який вам потрібен. Подивіться на http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html


8
Створюючи запис у маршруті 53 так, що вершина домену спрямована до класичного ELB, ви створюєте псевдонім до запису A, а не до CNAME. Докладні інструкції можна знайти тут: docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
ewalshe

@ewalshe можливо зробити це відповіддю, щоб надати цьому більше наочності?
Джонатан

Але чи не повинні CNAMES маскувати інші домени? тобто foo.com для bar.com, але браузер користувача все одно показуватиме foo.com? Що я шукав би для цієї функціональності?
Бен А. Хіллелі

мій сертифікат SSL закінчився, і AWS надіслав мені електронну пошту, щоб створити CNAME для хостів, які у мене є, але в мене вже є Aзапис, що робити зараз?
Євген

@eugene Я припускаю, що ви посилаєтесь на перевірку права власності на DNS на основі AWS: docs.aws.amazon.com/acm/latest/userguide/… Якщо це так, то Amazon просить вас додати CNAME для SUBDOMAIN домен, яким ви заявляєте. Перша мітка в CNAME, яку вони просять вас створити, генерується випадковим чином, тому не повинно виникнути проблем із її перекриттям з будь-яким іншим записом.
Іоан Олександру Куку

58
  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 .


1
Я знайшов, що ім'я відра s3 не завантажується, коли AWS Route 53 показує доступні для посилання. Я десь читав, це може мати значення, якого користувача AWS Console ви створюєте, і, можливо, який регіон ...
bjm88

foo.com/test працює для мене, але доступ до bar.com/test дає мені помилку AccessDenied. У когось є пропозиції? Я не зміг змінити політику ковшів на акаунті bar.com.
Шон

10

На Route53 вам потрібно створити запис A, а не запис CNAME , і створити псевдонім під цим.

З коментаря @ ewalshe до відповіді Олександру Куку, якщо ви прийшли сюди, намагаючись налаштувати шлюз API зі спеціальним доменним іменем та мати URL-адресу розповсюдження Cloudfront.


У мене є Aзапис, і не вдалося оновити сертифікат, і Aws мені по електронній пошті пропонують створити CNAME... що робити?
Євген

1

tldr; Ви повинні передавати FQDN як ім'я 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"

Це працює зараз.


0

Ви повинні використовувати DNAME замість CNAME. Запис CNAME може лише перенаправити мітку на іншу мітку.

Якщо ви говорите про переадресацію доменних імен замість міток, вам слід використовувати DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

Це також означає, що всі A, NS та будь-які інші записи повинні бути видалені. Це потрібно налаштувати в домені foo.com.


1
DNAMEвизначено в RFC 2672 . Чи можете ви пояснити, як це стосується ОП? Route53 не дозволяє видалити запис SOA або NS, принаймні зі стандартного інтерфейсу, і DNAME не є доступним варіантом.
Джош Хабдас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.