Bagaimana cara mengatasi pembatasan CNAME domain root?

117

Kami menghosting banyak aplikasi web untuk pelanggan kami. Jelas mereka ingin menggunakan domain mereka sendiri untuk merujuk ke aplikasi tersebut, biasanya mereka ingin setiap pengguna yang mengetik http://www.customer1.exampleatau http://customer1.examplepergi ke aplikasi web mereka.

Situasi yang kami hadapi adalah kami harus memiliki fleksibilitas untuk mengubah alamat IP dalam waktu dekat. Dan kami tidak ingin bergantung pada pelanggan yang melakukan perubahan rekam A di domain mereka. Jadi kami berpikir bahwa menggunakan CNAMEcatatan akan berhasil, tetapi karena kami menemukan CNAMEcatatan tidak akan berfungsi untuk domain root.

Pada dasarnya:

customer1.example IN CNAME customer1.mycompanydomain.example //this is invalid as the RFC
www.customer1.example IN CNAME customer1.mycompanydomain.example //this is valid and will work

Kami ingin dapat mengubah alamat IP customer1.mycompanydomain.exampleatau Acatatan dan pelanggan kami akan mengikuti catatan ini yang kami kendalikan.

di DNS kami akan terlihat seperti:

customer1.mycompanydomain.example IN A 192.0.2.1

Ada ide?

Geo
sumber
Saya tidak mengerti mengapa "customer1.com IN CNAME customer1.mycompanydomain.com" tidak valid. Saya percaya itu harus berhasil. Bisakah Anda menjelaskan di mana masalahnya dengan solusi itu?
sleske
3
Ya, silahkan baca tanya jawab berikut. Itu tidak valid sesuai DNS RFC. stackoverflow.com/questions/655235/…
Geo
2
Saya tidak mengerti judul pertanyaannya. Di manakah "root" (.) Terlibat?
bortzmeyer
2
yang dia maksud adalah akar dari suatu zona, bukan "akar"
Alnitak
2
Nah, ini bukan kosakata DNS biasa. Bukankah "puncak" adalah kata yang tepat? Atau "tingkat atas" untuk programmer Lisp? :-)
bortzmeyer

Jawaban:

63

Alasan pertanyaan ini masih sering muncul adalah karena, seperti yang Anda sebutkan, entah bagaimana seseorang yang dianggap penting menulis bahwa RFC menyatakan nama domain tanpa subdomain di depannya tidak valid. Namun, jika Anda membaca RFC dengan cermat, Anda akan menemukan bahwa ini tidak persis seperti yang dikatakannya. Faktanya, RFC 1912 menyatakan:

Jangan berlebihan dengan CNAME. Gunakan mereka saat mengganti nama host, tetapi rencanakan untuk menyingkirkannya (dan beri tahu pengguna Anda).

Beberapa host DNS menyediakan cara untuk mendapatkan fungsionalitas seperti CNAME di puncak zona (tingkat domain root, untuk nama domain polos) menggunakan jenis catatan khusus. Catatan tersebut meliputi, misalnya:

  • ALIAS di DNSimple
  • ANAME di DNS Menjadi Mudah
  • ANAME di easyDNS
  • CNAME di CloudFlare

Untuk setiap penyedia, penyiapannya serupa: arahkan entri ALIAS atau ANAME untuk domain apex Anda ke example.domain.com, seperti yang Anda lakukan dengan data CNAME. Bergantung pada penyedia DNS, nilai kosong atau @ Name mengidentifikasi puncak zona.

ALIAS atau ANAME atau @ example.domain.com.

Jika penyedia DNS Anda tidak mendukung tipe catatan seperti itu, dan Anda tidak dapat beralih ke yang mendukung, Anda perlu menggunakan pengalihan subdomain, yang tidak terlalu sulit, tergantung pada protokol atau perangkat lunak server yang perlu melakukannya. .

Saya sangat tidak setuju dengan pernyataan bahwa itu dilakukan hanya oleh "admin amatir" atau gagasan semacam itu. Ini sederhana "Apa nama dan layanannya perlu dilakukan?" menangani, dan kemudian menyesuaikan konfigurasi DNS Anda untuk melayani keinginan tersebut; Jika layanan utama Anda adalah web dan email, saya tidak melihat alasan yang VALID mengapa menghapus CNAME untuk selamanya akan menjadi masalah. Lagi pula, siapa yang lebih memilih @ subdomain.domain.org daripada @ domain.org? Siapa yang butuh "www" jika Anda sudah menyetel protokol itu sendiri? Tidak masuk akal untuk mengasumsikan bahwa penggunaan nama domain root tidak valid.

Meowing At The Moon
sumber
1
Jawaban khusus ini sangat membantu saya karena saya ingin mengarahkan domain level root ke CDN. Sebagian besar CDN memerlukan FQDN, karena CDN dapat menyelesaikan ke IP yang berbeda di lokasi atau waktu yang berbeda. Saya menggunakan DNS Made Easy dan dapat menggunakan jenis data ANAME.
Rubix
3
Saya sangat setuju. Ingin menghosting situs dari nama domain 'polos' adalah hal yang umum dan logis untuk dilakukan. Ini menggunakan lebih sedikit karakter, terlihat lebih baik dll. Protokol pengidentifikasi url sendiri (www) adalah bagian vestigial dari url bahkan jika memang diperlukan (sebenarnya tidak).
Ed Bishop
3
ANAME bagus, atau Anda bisa 301 semua non-www ke www. melalui layanan pengalihan 301 gratis 198.251.86.133
Jacob Evans
51

CNAME membuat rekaman root secara teknis tidak bertentangan dengan RFC, tetapi memiliki batasan yang berarti itu adalah praktik yang tidak disarankan.

Biasanya catatan root Anda memiliki banyak entri. Katakanlah, 3 untuk server nama Anda dan kemudian satu untuk alamat IP.

Per RFC:

Jika RR CNAME ada di node, tidak ada data lain yang harus ada;

Dan Per IETF 'Common DNS Operational and Configuration Errors' Dokumen:

Ini sering kali dilakukan oleh administrator yang tidak berpengalaman sebagai cara yang jelas untuk memungkinkan nama domain Anda juga menjadi host. Namun, server DNS seperti BIND akan melihat CNAME dan menolak untuk menambahkan sumber daya lain untuk nama itu. Karena tidak ada rekaman lain yang diizinkan untuk berdampingan dengan CNAME, entri NS akan diabaikan. Oleh karena itu, semua host di domain podunk.xx juga diabaikan!

Referensi:

Jon Swanson
sumber
17
Namun MENGAPA tidak ada rekaman lain yang diizinkan untuk berdampingan dengan CNAME. Apakah ini hanya batasan yang ditambahkan oleh penulis RFC atau apakah ada alasan teknis untuk itu? Jika tidak ada alasan teknis untuk itu, maka seseorang dapat dengan mudah membuat ekstensi RFC.
Sven
Jadi, jika itu berhasil untuk saya (gunakan CNAME untuk catatan root, subdomain lain untuk domain itu masih berfungsi), itu berarti saya hanya beruntung dan implementasi DNS penyedia saya tidak mengabaikan catatan tambahan itu meskipun mungkin? Dan itu juga berarti saya tidak perlu takut ada masalah di sisi klien, selama server DNS menanganinya seperti ini?
didi_X8
Ini adalah upaya untuk menjawab pertanyaan lain, "mengapa CNAME tidak diizinkan di puncak", sedangkan pertanyaan sebenarnya adalah "bagaimana mengatasi batasan ini". -1.
rustyx
Untuk alasannya lihat serverfault.com/questions/613829/…
rhand
CNAME dengan catatan root secara teknis tidak bertentangan dengan RFC Anda perlu menjelaskan bagaimana itu tidak bertentangan dengan RFC1034 bagian 3.6.2: Jika RR CNAME ada di sebuah node, tidak ada data lain yang harus ada; ini memastikan bahwa data untuk nama kanonis dan aliasnya tidak boleh berbeda. . Tentu saja "root" (yaitu puncak tepatnya dalam konteks ini) telah NSdan SOAmencatat dan karenanya tidak dapat memiliki CNAMEcatatan.
Patrick Mevzek
4

Saya tidak tahu bagaimana mereka lolos, atau apa efek samping negatifnya, tetapi saya menggunakan Hover.com untuk menghosting beberapa domain saya, dan baru-baru ini menyiapkan puncak domain saya sebagai CNAME di sana. Alat pengeditan DNS mereka tidak mengeluh sama sekali, dan domain saya dengan senang hati menyelesaikannya melalui CNAME yang ditetapkan.

Inilah yang Dig tunjukkan kepada saya untuk domain ini (domain sebenarnya disamarkan sebagai mydomain.com):

; <<>> DiG 9.8.3-P1 <<>> mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2056
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mydomain.com.          IN  A

;; ANSWER SECTION:
mydomain.com.       394 IN  CNAME   myapp.parseapp.com.
myapp.parseapp.com. 300 IN  CNAME   parseapp.com.
parseapp.com.       60  IN  A   54.243.93.102
Mason G. Zhwiti
sumber
Obfuscation, jika benar-benar diperlukan (DNS bersifat publik ....), harus menggunakan panduan RFC2606. Dan RFC5737 atau 3849 untuk alamat IP
Patrick Mevzek
3

Perusahaan saya melakukan hal yang sama untuk sejumlah pelanggan tempat kami menghosting situs web untuk mereka meskipun dalam kasus kami adalah xyz.company.com daripada www.company.com. Kami meminta mereka untuk menetapkan rekam A di xyz.company.com agar mengarah ke alamat IP yang kami alokasikan.

Mengenai bagaimana Anda dapat mengatasi perubahan alamat IP, saya rasa tidak ada solusi yang tepat. Beberapa ide adalah:

  • Gunakan penyeimbang beban NAT atau IP dan berikan pelanggan Anda alamat IP miliknya. Jika alamat IP server web perlu diubah, Anda dapat melakukan pembaruan pada NAT atau penyeimbang beban,

  • Tawarkan juga layanan hosting DNS dan minta pelanggan Anda untuk menghosting domain mereka dengan Anda sehingga Anda dapat memperbarui rekam A,

  • Buat pelanggan Anda menyetel rekam A mereka ke satu server web utama dan gunakan pengalihan HTTP untuk setiap permintaan web pelanggan.

sipwiz
sumber
3

Sipwiz benar, satu-satunya cara untuk melakukan ini dengan benar adalah pendekatan hybrid HTTP dan DNS. Registrar saya adalah penjual ulang untuk Tucows dan mereka menawarkan penerusan domain root sebagai layanan nilai tambah gratis.

Jika domain Anda adalah blah.com mereka akan menanyakan ke mana Anda ingin domain tersebut diteruskan, dan Anda mengetik www.blah.com. Mereka menetapkan data A ke server apache mereka dan secara otomatis menambahkan blah.com sebagai vhost DNS. Vhost merespons dengan kesalahan HTTP 302 yang mengarahkan mereka ke URL yang tepat. Sangat mudah untuk skrip / pengaturan dan dapat ditangani oleh kelas bawah jika tidak perangkat keras akan dibuang.

Jalankan perintah berikut sebagai contoh: curl -v eclecticengineers.com

MrEvil
sumber
3

Anda harus meletakkan titik di akhir domain eksternal sehingga yang Anda maksud bukanlah pelanggan1.mycompanydomain.com.localdomain;

Jadi ubah saja:

customer1.com IN CNAME customer1.mycompanydomain.com

Untuk

customer1.com IN CNAME customer1.mycompanydomain.com.
Gwerks
sumber
Bagi saya (BIND 9.8.2), jika record untuk domain customer1.com, ini berfungsi ... tetapi diartikan sebagai CNAMe yang menentukan untuk subdomain customer1.com.customer1.com. Jika saya menambahkan titik ke item pertama, catatan akan ditafsirkan dengan benar, tetapi tidak berfungsi lagi. Saya tidak melihat solusi di sini.
Jussi Hirvi
-2

Saya melihat readytocloud.com di-host di Apache 2.2.

Ada cara yang lebih sederhana dan efisien untuk mengarahkan situs non-www ke situs www di Apache.

Tambahkan aturan penulisan ulang berikut ke konfigurasi Apache (baik di dalam virtual host atau di luar. Tidak masalah):

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule ^/$ http://www.readytocloud.com/ [R=301,L]

Atau, aturan penulisan ulang berikut jika Anda menginginkan pemetaan 1-ke-1 URL dari situs non-www ke situs www:

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule (.*) http://www.readytocloud.com$1 [R=301,L]

Catatan, modul mod_rewrite perlu dimuat agar ini berfungsi. Untungnya readytocloud.com berjalan di kotak CentOS, yang secara default memuat mod_rewrite.

Kami memiliki server klien yang menjalankan Apache 2.2 dengan kurang dari 3.000 domain dan hampir 4.000 pengalihan, namun, beban di server berkisar sekitar 0,10 - 0,20.

Owen Blacker
sumber
Pertanyaannya adalah tentang DNS. Bukan tentang server web Apache.
SamTzu
-7

Terima kasih untuk sipwiz dan MrEvil. Kami mengembangkan skrip PHP yang akan mengurai URL yang dimasukkan pengguna dan ditempelkan wwwdi atasnya. (misal jika pelanggan masuk ke kiragiannis.com , maka akan dialihkan ke www.kiragiannis.com ). Jadi pelanggan kami mengarahkan root mereka (misalnya customer1.comuntuk Amerekam di mana redirector web kami berada) dan kemudian www CNAMEke Acatatan nyata yang dikelola oleh kami.

Di bawah kode jika Anda tertarik untuk masa depan kami.

<?php
$url = strtolower($_SERVER["HTTP_HOST"]);

if(strpos($url, "//") !== false) { // remove http://
  $url = substr($url, strpos($url, "//") + 2);
}

$urlPagePath = "";
if(strpos($url, "/") !== false) { // store post-domain page path to append later
  $urlPagePath = substr($url, strpos($url, "/"));
  $url = substr($url, 0, strpos($url,"/"));
}


$urlLast = substr($url, strrpos($url, "."));
$url = substr($url, 0, strrpos($url, "."));


if(strpos($url, ".") !== false) { // get rid of subdomain(s)
  $url = substr($url, strrpos($url, ".") + 1);
}


$url = "http://www." . $url . $urlLast . $urlPagePath;

header( "Location:{$url}");
?>
Geo
sumber
10
Ini sebenarnya tidak menjawab pertanyaan yang dicari lebih dari 69 ribu orang ke utas ini. Pertanyaannya lebih banyak tentang DNS dan tidak ada hubungannya dengan PHP.
Matt Clark
1
Pertanyaannya adalah tentang DNS. Bukan tentang pengkodean PHP.
SamTzu
HTTP_HOST adalah nama host, seperti namanya, bukan URL. Karenanya tidak akan ada yang http://perlu dihapus, atau /( $urlPagePathakan selalu kosong). Cf httpd.apache.org/docs/2.4/expr.html . Karena cara kode mencoba menghilangkan subdomain, itu juga tidak akan berfungsi untuk hal-hal seperti di www.example.co.ukmana co.ukharus dipertimbangkan secara keseluruhan. Itu juga tidak menangani HTTPS. Dan akhirnya menggunakan PHP cukup lakukan pengalihan HTTP di mana server web mana pun dapat melakukannya dalam konfigurasi, itu terlalu rumit. Jadi singkatnya, ini tentunya bukan jawaban yang divalidasi untuk pertanyaan ini.
Patrick Mevzek
Jika aturan ini berlaku untuk semua host maka itu harus dilakukan sebagai konfigurasi apache
Svetoslav Marinov