Jak pokonać ograniczenia CNAME domeny głównej?

117

Hostujemy wiele aplikacji internetowych dla naszych klientów. Jak jest oczywiste, chcą używać własnych domen do odwoływania się do tych aplikacji, zwykle chcą, aby każdy użytkownik wpisał http://www.customer1.examplelub http://customer1.exampleprzeszedł do ich aplikacji internetowej.

Sytuacja, z którą mamy do czynienia, polega na tym, że potrzebujemy elastyczności, aby zmieniać adresy IP w najbliższej przyszłości. Nie chcemy też polegać na tym, że klient dokona zmiany rekordu A w swoich domenach. Pomyśleliśmy więc, że używanie CNAMErekordów będzie działać, ale jak się okazało, CNAMErekordy nie będą działać dla domeny głównej.

Gruntownie:

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

Chcemy mieć możliwość zmiany adresu IP customer1.mycompanydomain.examplelub Azapisu, a nasi klienci będą śledzić ten rekord, nad którym mamy kontrolę.

w naszym DNS będzie wyglądać tak:

customer1.mycompanydomain.example IN A 192.0.2.1

Jakieś pomysły?

Geo
źródło
Nie rozumiem, dlaczego „klient1.com IN CNAME klient1.mycompanydomain.com” jest nieprawidłowy. Uważam, że to powinno działać. Czy mógłbyś wyjaśnić, gdzie był problem z tym rozwiązaniem?
sleske
3
Tak, przeczytaj poniższe pytanie i odpowiedź. Jest nieprawidłowy zgodnie z DNS RFC. stackoverflow.com/questions/655235/…
Geo
2
Nie rozumiem tytułu pytania. Gdzie jest zaangażowany „root” (.)?
bortzmeyer
2
ma na myśli korzeń strefy, a nie „korzeń”
Alnitak
2
Cóż, więc nie jest to zwykłe słownictwo DNS. Czy „apex” nie jest właściwym słowem? Lub „najwyższy poziom” dla programistów Lisp? :-)
bortzmeyer

Odpowiedzi:

63

Powodem, dla którego to pytanie wciąż się pojawia, jest to, że, jak wspomniałeś, gdzieś ktoś uznany za ważny napisał, że RFC stwierdza, że ​​nazwy domen bez subdomeny przed nimi są nieważne. Jeśli jednak uważnie przeczytasz RFC, przekonasz się, że nie jest to dokładnie to, co mówi. W rzeczywistości RFC 1912 stwierdza:

Nie przesadzaj z CNAME. Używaj ich podczas zmiany nazw hostów, ale planuj się ich pozbyć (i poinformuj użytkowników).

Niektóre hosty DNS zapewniają sposób uzyskania funkcjonalności podobnej do CNAME na wierzchołku strefy (poziom domeny głównej, dla samej nazwy domeny) przy użyciu niestandardowego typu rekordu. Takie zapisy obejmują na przykład:

  • ALIAS w DNSimple
  • ANAME w DNS Made Easy
  • ANAME w easyDNS
  • CNAME w CloudFlare

Dla każdego dostawcy konfiguracja jest podobna: wskaż wpis ALIAS lub ANAME dla domeny apex na example.domain.com, tak jak w przypadku rekordu CNAME. W zależności od dostawcy DNS wartość pusta lub @ Name identyfikuje wierzchołek strefy.

ALIAS lub ANAME lub @ example.domain.com.

Jeśli Twój dostawca DNS nie obsługuje takiego typu rekordu i nie możesz przełączyć się na taki, który obsługuje, będziesz musiał użyć przekierowania subdomeny, co nie jest takie trudne, w zależności od protokołu lub oprogramowania serwera, które musi to zrobić .

Zdecydowanie nie zgadzam się ze stwierdzeniem, że robią to tylko „amatorzy adminów” lub takie pomysły. To proste „Co musi robić nazwa i jej usługa?” deal, a następnie dostosować konfigurację DNS, aby spełniała te życzenia; Jeśli Twoje główne usługi to Internet i poczta e-mail, nie widzę żadnego PRAWIDŁOWEGO powodu, dla którego porzucenie CNAME na dobre byłoby problematyczne. W końcu kto wolałby @ subdomain.domain.org zamiast @ domain.org? Kto potrzebuje „www”, jeśli masz już ustawiony sam protokół? Nielogiczne jest zakładanie, że użycie nazwy domeny głównej byłoby nieprawidłowe.

Miauczenie na Księżycu
źródło
1
Ta konkretna odpowiedź była dla mnie bardzo pomocna, ponieważ chciałem wskazać domenę poziomu głównego w CDN. Większość sieci CDN ma z konieczności nazwę FQDN, ponieważ może być rozwiązywana na różne adresy IP w różnych lokalizacjach lub o różnych porach. Używam DNS Made Easy i mogłem użyć typu rekordu ANAME.
Rubix
3
Nie mogłem się bardziej zgodzić. Chęć hostowania witryny z „samej” nazwy domeny jest powszechną i logiczną rzeczą do zrobienia. Używa mniej znaków, wygląda lepiej itp. Własny identyfikator protokołu adresu URL (www) jest szczątkową częścią adresu URL, jeśli był w ogóle potrzebny (nie był).
Ed Bishop
3
ANAME są fajne, lub możesz tylko 301 wszystkie inne niż www na www. przez bezpłatną usługę przekierowania 301 198.251.86.133
Jacob Evans
51

CNAME jest technicznie sprzeczne z RFC, ale ma ograniczenia, co oznacza, że ​​jest to praktyka niezalecana.

Zwykle Twój rekord główny będzie miał wiele wpisów. Powiedzmy 3 dla serwerów nazw, a następnie jeden dla adresu IP.

Według RFC:

Jeśli rekord CNAME RR jest obecny w węźle, żadne inne dane nie powinny być obecne;

Zgodnie z dokumentem IETF „Typowe błędy operacyjne i konfiguracyjne DNS”:

Niedoświadczeni administratorzy często próbują tego dokonać jako oczywisty sposób, aby Twoja nazwa domeny była również hostem. Jednak serwery DNS, takie jak BIND, zobaczą CNAME i odmówią dodania jakichkolwiek innych zasobów dla tej nazwy. Ponieważ żadne inne rekordy nie mogą współistnieć z CNAME, wpisy NS są ignorowane. Dlatego wszystkie hosty w domenie podunk.xx są również ignorowane!

Bibliografia:

Jon Swanson
źródło
17
Ale DLACZEGO nie ma innych rekordów, które mogą współistnieć z CNAME. Czy to tylko ograniczenie dodane przez autora specyfikacji RFC, czy jest ku temu techniczny powód? Jeśli nie ma ku temu technicznego powodu, można łatwo wymyślić rozszerzenie RFC.
Sven
Tak więc, jeśli to działa dla mnie (użyj CNAME jako rekordu głównego, inne subdomeny dla tej domeny nadal działają), oznacza to, że mam szczęście, a implementacja DNS mojego dostawcy nie ignoruje tego, że dodatkowe rekordy mogą być? A to oznacza również, że nie muszę się bać żadnych problemów po stronie klienta, o ile serwer DNS obsługuje to w ten sposób?
didi_X8
Jest to próba odpowiedzi na inne pytanie: „dlaczego CNAME nie są dozwolone na wierzchołku”, podczas gdy rzeczywiste pytanie brzmi „jak pokonać to ograniczenie”. -1.
rustyx
Aby dowiedzieć się dlaczego, zobacz serverfault.com/questions/613829/…
rhand
CNAME jest technicznie niezgodne z RFC , musisz wyjaśnić, dlaczego nie jest to sprzeczne z RFC1034 sekcja 3.6.2: Jeśli w węźle występuje rekord CNAME, żadne inne dane nie powinny być obecne; Dzięki temu dane nazwy kanonicznej i jej aliasów nie mogą się różnić. . Oczywiście "korzeń" (czyli wierzchołek właśnie w tym kontekście) ma już NSi SOArekordy i stąd nie może mieć CNAMErekordów.
Patrick Mevzek
4

Nie wiem, jak sobie z tym radzą ani jakie mogą mieć negatywne skutki uboczne, ale używam Hover.com do hostowania niektórych moich domen, a ostatnio ustawiłem tam wierzchołek mojej domeny jako CNAME. Ich narzędzie do edycji DNS w ogóle nie narzekało, a moja domena szczęśliwie rozwiązuje się za pośrednictwem przypisanego CNAME.

Oto, co Dig pokazuje mi dla tej domeny (rzeczywista domena zaciemniona jako mojadomena.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
źródło
W przypadku zaciemniania, jeśli jest to naprawdę potrzebne (DNS jest publiczny ...), należy korzystać ze wskazówek RFC2606. I RFC5737 lub 3849 dla adresów IP
Patrick Mevzek,
3

Moja firma robi to samo z wieloma klientami, gdzie hostujemy dla nich witrynę internetową, chociaż w naszym przypadku jest to xyz.company.com, a nie www.company.com. Sprawiamy, że ustawiają rekord A w witrynie xyz.company.com, aby wskazywał adres IP, który im przydzielamy.

Jeśli chodzi o to, jak poradzić sobie ze zmianą adresu IP, nie sądzę, aby było idealne rozwiązanie. Oto kilka pomysłów:

  • Użyj NAT lub systemu równoważenia obciążenia IP i nadaj swoim klientom należący do niego adres IP. Jeśli adres IP serwera internetowego wymaga zmiany, możesz zaktualizować NAT lub równoważnik obciążenia,

  • Zaoferuj również usługę hostingową DNS i poproś swoich klientów o hostowanie ich domeny razem z Tobą, abyś mógł zaktualizować rekordy A,

  • Poproś swoich klientów, aby ustawili swój rekord A na jednym głównym serwerze sieciowym i używali przekierowania HTTP dla żądań internetowych każdego klienta.

sipwiz
źródło
3

Sipwiz jest poprawny, jedynym sposobem, aby to zrobić poprawnie, jest podejście hybrydowe HTTP i DNS. Mój rejestrator jest odsprzedawcą dla Tucows i oferuje przekierowanie domeny głównej jako bezpłatną usługę o wartości dodanej.

Jeśli Twoja domena to blah.com, zapyta Cię, dokąd chcesz przekierować domenę i wpisz www.blah.com. Przypisują rekord A do swojego serwera Apache i automatycznie dodają blah.com jako DNS vhost. Vhost odpowiada błędem HTTP 302, przekierowując go do właściwego adresu URL. Jest prosty do skryptu / konfiguracji i może być obsługiwany przez low-end, który w przeciwnym razie zostałby złomowany.

Uruchom na przykład następującą komendę: curl -v eclecticengineers.com

MrEvil
źródło
3

Musisz wstawić kropkę na końcu domeny zewnętrznej, więc nie sądzisz, że masz na myśli klient1.mojadomena.com.domena lokalna;

Więc po prostu zmień:

customer1.com IN CNAME customer1.mycompanydomain.com

Do

customer1.com IN CNAME customer1.mycompanydomain.com.
Gwerks
źródło
Dla mnie (BIND 9.8.2), jeśli rekordy dotyczą domeny customer1.com, działa to ... ale jest interpretowane jako określanie CNAMe dla subdomeny customer1.com.customer1.com. Jeśli dodam punkt do pierwszej pozycji, rekord zostanie zinterpretowany poprawnie, ale już nie działa. Nie widzę tutaj rozwiązania.
Jussi Hirvi
-2

Widzę, że readytocloud.com jest hostowane na Apache 2.2.

Jest znacznie prostszy i bardziej efektywny sposób przekierowania strony innej niż www na stronę www w Apache.

Dodaj następujące reguły przepisywania do konfiguracji Apache (wewnątrz hosta wirtualnego lub na zewnątrz. Nie ma to znaczenia):

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

Lub poniższe reguły przepisywania, jeśli chcesz mapować adresy URL z witryny innej niż www do witryny www 1 do 1:

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

Uwaga, moduł mod_rewrite musi zostać załadowany, aby to zadziałało. Na szczęście readytocloud.com działa na skrzynce CentOS, która domyślnie ładuje mod_rewrite.

Mamy serwer kliencki z Apache 2.2 z prawie 3000 domen i prawie 4000 przekierowań, jednak obciążenie serwera waha się w okolicach 0,10 - 0,20.

Owen Blacker
źródło
Pytanie dotyczyło DNS. Nie o serwerze WWW Apache.
SamTzu
-7

Dzięki zarówno sipwiz, jak i MrEvil. Opracowaliśmy skrypt PHP, który analizuje adres URL wprowadzony przez użytkownika i wkleja wwwgo na początku. (np. jeśli klient wejdzie na kiragiannis.com , to nastąpi przekierowanie do www.kiragiannis.com ). Tak więc nasz klient kieruje swój katalog główny (np. customer1.comAby Azarejestrować, gdzie znajduje się nasz przekierowanie), a następnie www CNAMEdo rzeczywistego, Azarządzanego przez nas rekordu.

Poniżej kod na wypadek, gdybyś był zainteresowany nami w przyszłości.

<?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
źródło
10
To właściwie nie odpowiada na pytanie, którego szukało ponad 69 tys. Osób. Pytanie dotyczy bardziej DNS i nie ma nic wspólnego z PHP.
Matt Clark
1
Pytanie dotyczyło DNS. Nie chodzi o kodowanie PHP.
SamTzu
HTTP_HOST to nazwa hosta, jak sugeruje jego nazwa, a nie adres URL. W związku z tym nie będzie żadnych http://do usunięcia ani /( $urlPagePathzawsze będzie puste). Por . Httpd.apache.org/docs/2.4/expr.html . Ze względu na sposób, w jaki kod próbuje pozbyć się subdomeny, nie będzie on również działał w przypadku takich rzeczy, jak www.example.co.ukgdzie co.uknależy traktować jako całość. Nie obsługuje też protokołu HTTPS. I wreszcie, używając PHP, po prostu wykonaj przekierowanie HTTP, w którym każdy serwer sieciowy może to zrobić w konfiguracji, jest zbyt skomplikowane. Krótko mówiąc, to z pewnością nie powinno być sprawdzoną odpowiedzią na to pytanie.
Patrick Mevzek
Jeśli ta reguła ma zastosowanie do wszystkich hostów, należy to zrobić jako konfiguracja apache
Svetoslav Marinov