RRSet tipe CNAME dengan nama DNS foo.com. tidak diizinkan di puncak di zona bar.com

101

Saya memiliki foo.comdan bar.com. Saya mengelola keduanya di Route53. foo.commenghosting situs saya, dan saya ingin mengarahkan lalu lintas dari bar.comke foo.com. Saya mencoba membuat CNAMErekor untuk bar.commenunjuk foo.com, tetapi saya mendapat pesan kesalahan:

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

Mengapa ini tidak berhasil, dan apa yang dapat saya lakukan?

fredley
sumber

Jawaban:

90

Sesuai RFC1912 bagian 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 sangat masuk akal karena nameserver tidak akan tahu apakah ia perlu mengikuti CNAME atau menjawab dengan catatan aktual yang tumpang tindih dengan CNAME. bar.comadalah zona karena itu secara implisit memiliki catatan SOA untuk bar.comnama tersebut. Anda tidak dapat memiliki data SOA dan CNAME dengan nama yang sama.

Namun, mengingat bahwa catatan SOA umumnya digunakan hanya untuk pemeliharaan zona, situasi di mana Anda ingin menyediakan CNAME di puncak zona ini cukup umum. Meskipun RFC melarangnya, banyak teknisi menginginkan perilaku seperti: "ikuti CNAME kecuali jika kueri secara eksplisit meminta data SOA". Itu sebabnya Route 53 menyediakan alias records. Ini adalah fitur khusus Route 53 yang menawarkan fungsionalitas persis seperti yang Anda butuhkan. Lihat di http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

Ioan Alexandru Cucu
sumber
8
Saat membuat catatan di Route 53 sehingga puncak domain diarahkan ke ELB klasik Anda membuat alias ke data A daripada ke CNAME. Instruksi rinci dapat ditemukan di sini: docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
ewalshe
@ewalshe mungkin membuat ini jawaban untuk memberikan lebih banyak visibilitas?
Jonathan
Tetapi bukankah CNAMES seharusnya menutupi domain lain? yaitu foo.com ke bar.com, tetapi browser pengguna masih akan menampilkan foo.com? Apa yang akan saya cari untuk fungsionalitas itu?
Ben A. Hilleli
Sertifikat SSL saya telah kedaluwarsa dan AWS mengirim email kepada saya untuk membuat CNAME untuk host yang saya miliki, tetapi saya sudah memiliki Acatatan, apa yang harus saya lakukan sekarang?
eugene
@eugene Saya berasumsi bahwa Anda mengacu pada verifikasi kepemilikan domain berbasis DNS AWS: docs.aws.amazon.com/acm/latest/userguide/… Jika demikian, maka Amazon meminta Anda untuk menambahkan CNAME untuk SUBDOMAIN dari domain yang Anda klaim sebagai milik Anda. Label pertama di CNAME yang mereka minta untuk Anda buat dibuat secara acak, jadi seharusnya tidak ada masalah dengan label itu yang tumpang tindih dengan data lain.
Ioan Alexandru Cucu
58
  1. Buat Bucket S3 yang disebut bar.com . (Nama harus sama dengan domain yang ingin Anda alihkan agar ini berfungsi!)
  2. Di bar.comS3 Bucket, buka Properties> Static Website Hosting, pilih Redirect all requests to another host namedan masukkan foo.comdi kotak teks.
  3. Kembali ke Route 53, di Hosted Zoneuntuk Anda bar.com, klik Create Record Set. Pilih A - IPv4 addressuntuk tipe. Klik Yesuntuk Alias. Klik kotak teks untuk Alias Target. bar.comharus terdaftar di bawah -- S3 Website Endpoints --. Simpan catatannya. Tunggu beberapa menit dan Anda akan memiliki pengaturan pengalihan untuk mengalihkan permintaan dari bar.com ke foo.com.

Anda dapat menggunakan metode yang sama ini untuk mengalihkan domain polos ke subdomain (seperti www). Saya menggunakan ini dalam kasus di mana www.foo.com harus menjadi CNAME jadi saya mengarahkan dari foo.com ke www.foo.com dengan metode yang sama. Jika foo.com adalah data A, Anda dapat menggunakan teknik ini untuk mengalihkan dari www.foo.com ke foo.com.

CATATAN: metode ini akan meneruskan dengan jalur lengkap. yaitu http://bar.com/test akan diteruskan ke http://foo.com/test .

Rob Eroh
sumber
1
Saya menemukan nama bucket s3 saya tidak dimuat ketika AWS Route 53 menunjukkan yang tersedia untuk ditautkan. Saya membaca di suatu tempat, mungkin penting pengguna Konsol AWS apa yang Anda buat ini sebagai dan mungkin wilayah apa ...
bjm88
foo.com/test bekerja untuk saya tetapi mengakses bar.com/test memberi saya kesalahan AccessDenied. Ada yang punya saran? Saya tidak dapat mengubah kebijakan keranjang di akun shell bar.com.
Sean
10

Di Route53, Anda perlu membuat data A BUKAN data CNAME , dan membuat alias di bawahnya.

Dari komentar @ ewalshe atas jawaban Alexandru Cucu, jika Anda datang ke sini mencoba mensetup API Gateway dengan nama domain kustom dan memiliki url distribusi Cloudfront.

Jonathan
sumber
Saya memiliki Acatatan, dan perpanjangan sertifikat gagal dan aws mengirimi saya email menyarankan untuk membuat CNAME... apa yang harus dilakukan?
eugene
1

tldr; Anda harus memasukkan FQDN sebagai nama ResourceRecordSet.

Saya memiliki masalah yang sama menggunakan pernyataan ini 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);
        }

Dalam hal ini image.Name == "Listener"

Setelah saya mengubahnya menjadi:

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

sekarang nilai yang diteruskan adalah: "Listener.fully.qualified.com"

Ini bekerja sekarang.

Wjdavis5
sumber
0

Anda harus menggunakan DNAME, bukan CNAME. Data CNAME hanya dapat mengarahkan label ke label lain.

Saat Anda berbicara tentang pengalihan nama domain dan bukan label, Anda harus menggunakan DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

Ini juga berarti bahwa setiap A, NS, dan record lainnya harus dihapus. Ini harus dikonfigurasi di domain foo.com.

BlahBlah
sumber
1
DNAMEdidefinisikan dalam RFC 2672 . Bisakah Anda menjelaskan bagaimana ini berhubungan dengan OP? Route53 tidak mengizinkan penghapusan data SOA atau NS, setidaknya dari antarmuka standar dan DNAME bukanlah opsi yang tersedia.
Josh Habdas