Як подолати обмеження кореневого домену CNAME?


117

Ми розміщуємо безліч веб-додатків для наших клієнтів. Як очевидно, вони хочуть використовувати свої власні домени для посилань на ці програми, зазвичай вони хочуть, щоб будь-який користувач, який або вводив, http://www.customer1.exampleабо http://customer1.exampleперейшов до свого веб-додатку.

Ситуація, з якою ми стикаємося, полягає в тому, що нам потрібно мати гнучкість для зміни IP-адрес найближчим часом. І ми не хочемо покладатися на те, щоб клієнт змінив записи A у своїх доменах. Тому ми думали, що використання CNAMEзаписів буде працювати, але, як ми з’ясуємо, CNAMEзаписи не працюватимуть для кореневого домену.

В основному:

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

Ми хочемо мати можливість змінити IP-адресу customer1.mycompanydomain.exampleабо Aзапис, і наші клієнти дотримуватимуться цього запису, над яким ми маємо контроль.

в нашому DNS це буде виглядати так:

customer1.mycompanydomain.example IN A 192.0.2.1

Будь-які ідеї?


Я не розумію, чому "customer1.com IN CNAME customer1.mycompanydomain.com" недійсний. Я вважаю, що це має працювати. Чи можете ви пояснити, де проблема з цим рішенням?
sleske

3
Так, будь ласка, прочитайте наступне питання та відповідь. Він недійсний відповідно до DNS RFC. stackoverflow.com/questions/655235/…
Гео

2
Я не розумію назви питання. Де бере участь "корінь" (.)?
борцмейєр

2
він має на увазі корінь зони, а не «корінь»
Alnitak

2
Ну, це не звичайна лексика DNS. Чи не "вершина" належного слова? Або "найвищий рівень" для програмістів Lisp? :-)
bortzmeyer

Відповіді:


63

Причина, з якою це питання все ще часто виникає, полягає в тому, що, як ви вже згадували, десь якось хтось вважав за важливе написане, що RFC констатує доменні імена без субдомену перед ними, невірні. Якщо ви уважно прочитаєте RFC, то виявите, що це не зовсім те, що написано. Насправді, RFC 1912 зазначає:

Не перестарайтеся з CNAME. Використовуйте їх під час перейменування хостів, але плануйте позбутися від них (та повідомте своїх користувачів).

Деякі хости DNS надають спосіб отримати функціонал, схожий на CNAME, на зоні вершини (рівень кореневого домену для голого доменного імені), використовуючи спеціальний тип запису. Такі записи включають, наприклад:

  • ALIAS на DNSimple
  • ANAME на DNS Made Easy
  • ANAME на easyDNS
  • CNAME на CloudFlare

Налаштування для кожного постачальника аналогічне: вкажіть запис ALIAS або ANAME для вашого домену apex на example.domain.com так, як це було б із записом CNAME. Залежно від постачальника DNS, порожнє значення або ім'я @ ідентифікує зону вершини.

ALIAS або ANAME або @ example.domain.com.

Якщо ваш постачальник DNS не підтримує такий тип запису, і ви не можете переключитися на той, який це робить, вам знадобиться перенаправлення піддомену, що не так вже й важко, залежно від протоколу або серверного програмного забезпечення, яке це потрібно зробити. .

Я категорично не згоден із твердженням, що це робиться лише "аматорськими адміністраторами" або такими ідеями. Це просте "Що потрібно робити імені та його службі?" угоди, а потім адаптувати DNS-конфігурацію для задоволення цих побажань; Якщо ваші основні сервіси - це Інтернет та електронна пошта, я не бачу жодної ВАЛІДНОЇ причини, чому відмовитись від CNAME для добра буде проблематично. Зрештою, хто б віддав перевагу @ subdomain.domain.org над @ domain.org? Кому потрібен "www", якщо ви вже налаштовані з самим протоколом? Нелогічно вважати, що використання root-доменного імені було б недійсним.


1
Ця конкретна відповідь мені дуже допомогла, оскільки я хотів вказати домен кореневого рівня на CDN. Більшість CDN, як правило, є FQDN, оскільки він може вирішувати різні IP-адреси в різних місцях чи час. Я використовую DNS Made Easy і міг використовувати тип запису ANAME.
Рубікс

3
Я не міг більше погодитися. Хоча розмістити сайт із "голим" доменним іменем - це звичайна і логічна річ. Він використовує менше символів, виглядає краще тощо. Власний ідентифікатор протоколу URL-адреси (www) є руйнівною частиною URL-адреси, якщо це було потрібно в першу чергу (це не було).
Ед Бішоп

3
ANAME - це добре, або ви можете просто 301 все, що не є www на www. через безкоштовну послугу переадресації 301 198.251.86.133
Jacob Evans

51

CNAME'е кореневий запис технічно не проти RFC, але він має обмеження, тобто це практика, яка не рекомендується.

Зазвичай у вашій кореневій записи буде кілька записів. Скажімо, 3 для ваших серверів імен, а потім - один для IP-адреси.

На RFC:

Якщо RAME CNAME присутній у вузлі, інших даних не повинно бути;

І на документ IETF "Загальні помилки в роботі та конфігурації DNS":

Це часто намагаються недосвідчені адміністратори як очевидний спосіб дозволити вашому доменному імені також бути хостом. Однак сервери DNS, такі як BIND, побачать CNAME і відмовляться додавати будь-які інші ресурси для цього імені. Оскільки жодним іншим записам не може співіснувати з CNAME, записи NS ігноруються. Тому всі хости в домені podunk.xx також ігноруються!

Список літератури:


17
Але ЧОМУ немає іншого запису, дозволеного співіснувати з CNAME. Це лише обмеження, додане автором RFC чи є технічна причина для цього? Якщо для цього немає технічних причин, то можна легко придумати розширення RFC.
Свен

Отже, якщо він працює для мене (використовуйте CNAME для кореневої записи, інші піддомени для цього домену все ще працюють), це означає, що мені просто пощастило, і мої провайдери реалізація DNS не ігнорує, що додаткові записи, можливо, могли це зробити? А це також означає, що мені не потрібно боятися будь-яких проблем на стороні клієнта, доки сервер DNS обробляє це так?
didi_X8

Це спроба відповісти на інше запитання: "чому CNAME не допускаються на вершині", тоді як власне питання "як подолати це обмеження". -1.
rustyx

Для чого дивіться serverfault.com/questions/613829/…
rhand

CNAME'е кореневий запис технічно не проти RFC, вам потрібно буде пояснити, як це не проти RFC1034, розділ 3.6.2: Якщо CNAME RR присутній у вузлі, ніяких інших даних не повинно бути; це гарантує, що дані для канонічного імені та його псевдонімів не можуть бути різними. . Звичайно, "корінь" (тобто вершина саме в цьому контексті) вже є NSі SOAзаписує, а значить, не може мати CNAMEзаписів.
Патрік Мевзек

4

Я не знаю, як у них це стає, або які негативні побічні ефекти можуть бути, але я використовую Hover.com для розміщення деяких моїх доменів і нещодавно налаштував вершину мого домену як CNAME там. Їх інструмент редагування DNS взагалі не скаржився, і мій домен із задоволенням вирішується через призначений CNAME.

Ось що Dig показує мені для цього домену (фактичний домен, прихований як 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

Якщо при необхідності обфускування (DNS є загальнодоступною ....), слід використовувати вказівки RFC2606. І RFC5737 або 3849 для IP-адрес
Патрік Мевзек

3

Моя компанія робить те ж саме для багатьох клієнтів, де ми розміщуємо веб-сайт для них, хоча в нашому випадку це xyz.company.com, а не www.company.com. Ми отримуємо їх, щоб встановити запис A на xyz.company.com, щоб вказати на IP-адресу, яку ми їм виділяємо.

Щодо того, як ви могли впоратися зі зміною IP-адреси, я не думаю, що ідеального рішення. Деякі ідеї:

  • Використовуйте балансир завантаження NAT або IP та надайте своїм клієнтам IP-адресу, що належить йому. Якщо IP-адресу веб-сервера потрібно змінити, ви можете зробити оновлення NAT або балансир завантаження,

  • Запропонуйте також послугу хостингу DNS і запропонуйте своїм клієнтам розмістити свій домен разом з вами, щоб ви могли оновлювати записи A,

  • Запропонуйте своїм клієнтам встановити запис A на одному головному веб-сервері та використовувати перенаправлення HTTP для веб-запитів кожного клієнта.


3

Sipwiz правильний, єдиний спосіб зробити це належним чином - це гібридний підхід HTTP та DNS. Мій реєстратор - перепродавець Tucows, і вони пропонують переадресацію кореневого домену як безкоштовну послугу з доданою вартістю.

Якщо ваш домен blah.com, він запитає вас, куди ви хотіли б переслати домен, і ви введете www.blah.com. Вони присвоюють запис A своєму серверу apache і автоматично додають blah.com як vhost DNS. Vhost відповідає на помилку HTTP 302, перенаправляючи їх до належної URL-адреси. Сценарій / налаштування простий, і ним можна керувати низьким рівнем, інакше було б знято обладнання.

Виконайте для прикладу наступну команду: curl -v eclecticengineers.com


3

Ви повинні поставити період у кінці зовнішнього домену, щоб він не вважав, що ви маєте на увазі customer1.mycompanydomain.com.localdomain;

Тому просто змініть:

customer1.com IN CNAME customer1.mycompanydomain.com

До

customer1.com IN CNAME customer1.mycompanydomain.com.

Для мене (BIND 9.8.2), якщо записи призначені для домену customer1.com, це працює ..., але інтерпретується як вказівка ​​CNAMe для субдомену customer1.com.customer1.com. Якщо я додаю крапку до першого пункту, запис буде інтерпретований правильно, але він більше не працює. Я не бачу тут рішення.
Jussi Hirvi

-2

Я бачу, як Readytocloud.com розміщується на Apache 2.2.

Існує набагато простіший і ефективніший спосіб перенаправити сайт, який не є www, на веб-сайт Apache.

Додайте такі правила перезапису до конфігурацій Apache (або віртуального хоста, або зовні. Не має значення):

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

Або наступні правила перезапису, якщо ви хочете зіставити 1-в-1 URL-адрес із не-www сайту на веб-сайт:

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

Зверніть увагу, для роботи цього модуля mod_rewrite потрібно завантажити. На щастя readytocloud.com працює на вікні CentOS, яке за замовчуванням завантажує mod_rewrite.

У нас є клієнтський сервер під управлінням Apache 2.2 з трохи менше 3000 доменів і майже 4000 переадресацій, однак навантаження на сервер коливається в межах 0,10 - 0,20.


Питання стосувалося DNS. Не про веб-сервер Apache.
SamTzu

-7

Завдяки sipwiz та MrEvil. Ми розробили скрипт PHP, який буде розбирати URL-адресу, яку вводить користувач, і вставляти wwwїї у верхню частину. (наприклад, якщо клієнт входить на kiragiannis.com , він перенаправить на www.kiragiannis.com ). Таким чином , наш клієнт вказує своє коріння (наприклад , customer1.comдля Aзапису , де наш веб - редиректор є) , а потім www CNAMEдо реальної Aзаписи керованої нами.

Нижче коду на випадок, якщо ви зацікавлені для нас у майбутньому.

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

10
Це насправді не відповідає на запитання, що 69 к + людей прийшли до цієї теми. Питання більше стосується DNS і не має нічого спільного з PHP.
Метт Кларк

1
Питання стосувалося DNS. Не про кодування PHP.
SamTzu

HTTP_HOST - це ім'я хоста, як випливає з його назви, а не URL. Отже, не буде жодного http://видалення, а також /( $urlPagePathзавжди буде порожнім). Cf httpd.apache.org/docs/2.4/expr.html . Завдяки тому, як код намагається позбутися від субдомену, він також не буде працювати для таких речей, як www.example.co.ukде co.ukпотрібно розглядати в цілому. Він також не обробляє HTTPS. І нарешті, використовуючи PHP, просто перенаправлення HTTP, де будь-який веб-сервер може це зробити в конфігурації, є надскладним. Отже, коротко, це, безумовно, не повинно бути підтвердженою відповіддю на це питання.
Патрік Мевзек

Якщо це правило стосується всіх хостів, то це слід робити як конфігурацію apache
Светослав Маринов,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.