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

102

Я владею 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

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

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

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

Иоан Александру Куку
источник
8
При создании записи в Route 53 так, чтобы вершина домена была направлена ​​на классический ELB, вы создаете псевдоним для записи A, а не для CNAME. Подробные инструкции можно найти здесь: docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
ewalshe 01
@ewalshe, может быть, это ответ, чтобы сделать это более заметным?
Джонатан
Но разве CNAMES не должны маскировать другие домены? т.е. foo.com на bar.com, но браузер пользователя все равно будет отображать foo.com? Что я буду искать для этой функции?
Бен А. Хиллели
срок действия моего SSL-сертификата истек, и AWS отправило мне электронное письмо с просьбой создать CNAME для хостов, которые у меня есть, но у меня уже есть Aзапись. Что делать теперь?
Евгений
@eugene Я предполагаю, что вы имеете в виду проверку владения доменом AWS на основе DNS: docs.aws.amazon.com/acm/latest/userguide/ ... Если это так, Amazon просит вас добавить CNAME для СУБДОМЕНА домен, владельцем которого вы являетесь. Первая метка в CNAME, которую они просят создать, генерируется случайным образом, поэтому не должно быть проблем с ее перекрытием с какой-либо другой записью.
Иоан Александру Куку,
58
  1. Создайте корзину S3 с именем bar.com. (Чтобы это работало, имя должно совпадать с именем домена, с которого вы хотите выполнить перенаправление!)
  2. В bar.comS3 Bucket перейдите к 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 вы создаете это и, возможно, в каком регионе ...
bjm88
У меня работает foo.com/test , но доступ к bar.com/test дает мне ошибку AccessDenied . У кого-нибудь есть предложения? Мне не удалось изменить политику корзины в учетной записи оболочки bar.com.
Шон,
10

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

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

Джонатан
источник
У меня есть Aзапись, и обновление сертификата не удалось, и aws отправил мне электронное письмо с предложением создать CNAME... что делать?
Евгений
1

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 == "Listener"

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

 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"

Теперь это работает.

Wjdavis5
источник
0

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

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

$ORIGIN bar.com
           IN      DNAME   foo.com

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

Бла-Бла
источник
1
DNAMEопределено в RFC 2672 . Не могли бы вы объяснить, как это связано с OP? Route53 не позволяет удалять записи SOA или NS, по крайней мере, из стандартного интерфейса, а DNAME недоступен.
Джош Хабдас