RRSet typu CNAME z nazwą DNS foo.com. nie jest dozwolone na wierzchołku w strefie bar.com


102

Posiadam foo.comi bar.com. Obiema zarządzam w Route53. foo.comhostuje moją witrynę i chciałbym skierować ruch z bar.comdo foo.com. Próbowałem ustawić CNAMErekord do bar.comwskazywania foo.com, ale otrzymałem komunikat o błędzie:

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

Dlaczego to nie działa i co mogę zamiast tego zrobić?

Odpowiedzi:


90

Zgodnie z RFC1912 sekcja 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 ma sens, ponieważ serwer nazw nie wiedziałby, czy musi podążać za CNAME, czy odpowiadać za pomocą rzeczywistego rekordu, na który nakłada się CNAME. bar.comjest strefą, dlatego domyślnie ma rekord SOA dla tej bar.comnazwy. Nie możesz mieć jednocześnie rekordu SOA i CNAME o tej samej nazwie.

Jednak biorąc pod uwagę, że rekordy SOA są zwykle używane tylko do konserwacji strefy, te sytuacje, w których chcesz podać CNAME na wierzchołku strefy, są dość powszechne. Mimo że RFC tego zabrania, wielu inżynierów chciałoby zachowania takiego jak: „podążaj za CNAME, chyba że zapytanie wyraźnie żąda rekordu SOA”. Właśnie dlatego Route 53 zapewnia alias records. Są to funkcje specyficzne dla Route 53, które oferują dokładnie taką funkcjonalność, jakiej potrzebujesz. Zajrzyj na http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html


8
Tworząc rekord w Route 53, aby wierzchołek domeny był skierowany do klasycznego ELB, tworzysz alias do rekordu A, a nie do CNAME. Szczegółowe instrukcje można znaleźć tutaj: docs.aws.amazon.com/elasticloadbalancing/latest/classic/ ...
ewalshe

@ewalshe może uczynić to odpowiedzią, aby zwiększyć widoczność?
Jonathan

Ale czy CNAMES nie ma maskować innych domen? tj. foo.com do bar.com, ale przeglądarka użytkownika nadal wyświetla foo.com? Czego bym szukał dla tej funkcji?
Ben A. Hilleli,

mój certyfikat SSL wygasł i AWS wysłał mi e-mail, aby utworzyć CNAME dla hostów, które mam, ale mam już Arekord, co teraz zrobić?
Eugene

@eugene Zakładam, że odnosisz się do weryfikacji własności domeny opartej na DNS AWS: docs.aws.amazon.com/acm/latest/userguide/ ... Jeśli tak jest, Amazon prosi o dodanie CNAME do SUBDOMENY domena, której jesteś właścicielem. Pierwsza etykieta w CNAME, o utworzenie której Cię proszą, jest generowana losowo, więc nie powinno być problemu z nakładaniem się jej na żaden inny rekord.
Ioan Alexandru Cucu

58
  1. Utwórz segment S3 o nazwie bar.com. (Nazwa musi być taka sama, jak nazwa domeny, z której chcesz przekierować, aby to zadziałało!)
  2. W bar.comłyżce S3 przejdź do Properties> Static Website Hosting, wybierz Redirect all requests to another host namei wprowadź foo.comw polu tekstowym.
  3. Wracając do Route 53 , kliknij Hosted Zonedla swojego for . Wybierz typ. Kliknij, aby wyświetlić . Kliknij pole tekstowe dla . powinny być wymienione pod . Zapisz rekord. Poczekaj kilka minut i powinieneś mieć konfigurację przekierowania, aby przekierowywać żądania z bar.com do foo.com.bar.comCreate Record SetA - IPv4 addressYesAliasAlias Targetbar.com-- S3 Website Endpoints --

Możesz użyć tej samej metody, aby przekierować samą domenę do subdomeny (np. Www). Używam tego w przypadkach, gdy www.foo.com musi być CNAME, więc przekierowuję z foo.com do www.foo.com tą samą metodą. Jeśli foo.com jest rekordem A, możesz użyć tej techniki, aby przekierować z www.foo.com do foo.com.

UWAGA: ta metoda spowoduje przekazanie pełnej ścieżki. tj. http://bar.com/test przekieruje do http://foo.com/test .


1
Zauważyłem, że nazwa mojego zasobnika s3 nie ładuje się, gdy AWS Route 53 pokazuje dostępne do połączenia. Czytałem gdzieś, może mieć znaczenie, jakiego użytkownika konsoli AWS utworzysz jako i może w jakim regionie ...
bjm88

foo.com/test działa dla mnie, ale dostęp do bar.com/test powoduje wyświetlenie błędu AccessDenied. Czy ktoś ma sugestie? Nie mogłem zmienić zasad dotyczących wiadra na koncie shell bar.com.
Sean,

10

Na Route53 musisz utworzyć rekord A, a nie rekord CNAME , i utworzyć pod nim alias.

Z komentarza @ ewalshe na temat odpowiedzi Alexandru Cucu, jeśli przyszedłeś tutaj, próbując skonfigurować API Gateway z niestandardową nazwą domeny i adresem URL dystrybucji Cloudfront.


Mam Arekord, a odnowienie certyfikatu nie powiodło się i aws wysłał mi e-mail z propozycją utworzenia CNAME... co mam zrobić?
Eugene

1

tldr; Musisz przekazać FQDN jako nazwę ResourceRecordSet.

Miałem ten sam problem, używając tej instrukcji 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);
        }

W tym przypadku image.Name == "Listener"

Kiedyś zmieniłem to na:

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

teraz przekazywana wartość to: „Listener.fully.qualified.com”

To teraz działa.


0

Zamiast CNAME należy użyć nazwy DNAME. Rekord CNAME może tylko przekierować etykietę do innej etykiety.

Kiedy mówisz o przekierowaniu nazw domen zamiast etykiet, powinieneś użyć DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

Oznacza to również, że należy usunąć wszystkie rekordy A, NS i inne. Należy to skonfigurować w domenie foo.com.


1
DNAMEjest zdefiniowany w RFC 2672 . Czy mógłbyś wyjaśnić, jak to się ma do OP? Route53 nie pozwala na usuwanie rekordów SOA lub NS, przynajmniej ze standardowego interfejsu, a DNAME nie jest dostępną opcją.
Josh Habdas,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.