루트 도메인 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/…
Geo

2
질문의 제목을 이해하지 못합니다. "루트"(.)는 어디에 관련됩니까?
bortzmeyer

2
그는 영역이 아닌 "루트"의 루트 의미
알니 타크

2
음, 일반적인 DNS 어휘가 아닙니다. "apex"가 적절한 단어가 아닙니까? 아니면 Lisp 프로그래머를위한 "최상위"? :-)
bortzmeyer

답변:


63

이 질문이 여전히 자주 발생하는 이유는 언급했듯이 중요한 것으로 추정되는 누군가가 RFC에서 앞에 하위 도메인이없는 도메인 이름이 유효하지 않다고 명시하고 있기 때문입니다. 그러나 RFC를주의 깊게 읽으면 이것이 정확히 말하는 것이 아님을 알 수 있습니다. 실제로 RFC 1912 는 다음과 같이 말합니다.

CNAME을 너무 많이 사용하지 마십시오. 호스트 이름을 바꿀 때 사용하되 제거 하고 사용자에게 알리십시오.

일부 DNS 호스트는 사용자 지정 레코드 유형을 사용하여 zone apex (네이 키드 도메인 이름의 경우 루트 도메인 수준)에서 CNAME과 유사한 기능을 얻는 방법을 제공합니다. 이러한 기록에는 다음이 포함됩니다.

  • DNSimple의 ALIAS
  • DNS의 ANAME이 쉬워졌습니다.
  • easyDNS의 ANAME
  • CloudFlare의 CNAME

각 공급자에 대해 설정은 비슷합니다. CNAME 레코드와 마찬가지로 apex 도메인의 ALIAS 또는 ANAME 항목을 example.domain.com으로 지정합니다. DNS 공급자에 따라 비어 있거나 @ 이름 값이 영역 정점을 식별합니다.

ALIAS 또는 ANAME 또는 @ example.domain.com.

DNS 공급자가 이러한 레코드 유형을 지원하지 않고 지원하는 레코드 유형으로 전환 할 수없는 경우이를 수행해야하는 프로토콜 또는 서버 소프트웨어에 따라 그렇게 어렵지 않은 하위 도메인 리디렉션을 사용해야합니다. .

나는 그것이 "아마추어 관리자"나 그런 아이디어에 의해서만 행해졌다는 진술에 강력히 동의하지 않는다. "이름과 서비스는 무엇을해야합니까?" 거래를 한 다음 DNS 구성을 조정하여 이러한 희망을 충족시킵니다. 귀하의 주요 서비스가 웹 및 이메일 인 경우 CNAME을 삭제하는 것이 문제가되는 타당한 이유가 없습니다. 결국 @ domain.org보다 @ subdomain.domain.org를 선호하는 사람은 누구입니까? 이미 프로토콜 자체를 설정 한 경우 "www"가 필요한 사람은 누구입니까? 루트 도메인 이름의 사용이 유효하지 않다고 가정하는 것은 비논리적입니다.


1
이 특정 답변은 CDN에서 루트 수준 도메인을 가리키고 싶었 기 때문에 매우 유용했습니다. 대부분의 CDN은 다른 위치 나 시간에 다른 IP로 확인할 수 있으므로 필연적으로 FQDN입니다. DNS Made Easy를 사용하고 ANAME 레코드 유형을 사용할 수있었습니다.
Rubix

3
나는 더 이상 동의 할 수 없었다. '네이 키드'도메인 이름에서 사이트를 호스팅하려는 것은 일반적이고 논리적으로해야 할 일입니다. 더 적은 문자를 사용하고 더 좋아 보입니다. URL의 고유 한 프로토콜 식별자 (www)는 처음에 필요한 경우 (그렇지 않은 경우) URL의 흔적 부분입니다.
Ed Bishop

3
ANAME은 멋지거나 www가 아닌 ​​모든 것을 www로 301 할 수 있습니다. 무료 301 리디렉션 서비스 198.251.86.133
Jacob Evans

51

루트 레코드 인 CNAME은 기술적으로 RFC에 위배되지 않지만 권장되지 않는 관행이라는 제한이 있습니다.

일반적으로 루트 레코드에는 여러 항목이 있습니다. 이름 서버용 3 개와 IP 주소 용 1 개를 말합니다.

RFC에 따라 :

CNAME RR이 노드에 있으면 다른 데이터가 없어야합니다.

그리고 IETF에 따라 '일반적인 DNS 작동 및 구성 오류'문서 :

이는 경험이없는 관리자가 도메인 이름이 호스트가 될 수 있도록 허용하는 확실한 방법으로 종종 시도됩니다. 그러나 BIND와 같은 DNS 서버는 CNAME을보고 해당 이름에 대한 다른 리소스 추가를 거부합니다. 다른 레코드는 CNAME과 공존 할 수 없으므로 NS 항목은 무시됩니다. 따라서 podunk.xx 도메인의 모든 호스트도 무시됩니다!

참조 :


17
그러나 CNAME과 공존 할 수있는 다른 레코드가없는 이유는 무엇입니까? 이것은 RFC 작성자가 추가 한 제한 사항입니까 아니면 기술적 이유가 있습니까? 기술적 이유가 없다면 쉽게 확장 RFC를 생각 해낼 수 있습니다.
스벤

그래서 그것이 저에게 효과가 있다면 (루트 레코드에 CNAME을 사용하고 해당 도메인에 대한 다른 하위 도메인을 계속 사용하십시오) 이는 운이 좋으며 공급자 DNS 구현이 추가 레코드를 무시하지 않는다는 것을 의미합니까? 또한 DNS 서버가 이와 같이 처리하는 한 클라이언트 측에서 어떤 문제도 두려워 할 필요가 없음을 의미합니까?
didi_X8 2014 년

이것은 "정점에서 CNAME이 허용되지 않는 이유"라는 또 다른 질문에 대답하려는 시도이며 실제 질문은 "이 한계를 극복하는 방법"입니다. -1.
rustyx


루트 레코드의 CNAME은 기술적으로 RFC 에 위배되지 않습니다. RFC1034 섹션 3.6.2에 위배되지 않는 방법을 설명해야합니다 . CNAME RR이 노드에 있으면 다른 데이터가 없어야합니다. 이렇게하면 정식 이름 및 별칭에 대한 데이터가 다를 수 없습니다. . 물론 "루트"(이 문맥에서 정확히 정점)는 이미 NSSOA기록을 가지고 있으므로 기록을 가질 수 없습니다 CNAME.
Patrick Mevzek

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 지침을 사용해야합니다. IP 주소 용 RFC5737 또는 3849
Patrick Mevzek

3

우리 회사에서는 웹 사이트를 호스팅하는 여러 고객에게 동일한 작업을 수행합니다. 우리의 경우에는 www.company.com이 아니라 xyz.company.com입니다. 우리가 할당 한 IP 주소를 가리 키도록 xyz.company.com의 A 레코드를 설정하도록합니다.

IP 주소 변경에 어떻게 대처할 수 있는지에 관해서는 완벽한 솔루션이 없다고 생각합니다. 몇 가지 아이디어는 다음과 같습니다.

  • NAT 또는 IP로드 밸런서를 사용하고 고객에게 해당 IP 주소를 제공하십시오. 웹 서버의 IP 주소를 변경해야하는 경우 NAT 또는로드 밸런서에서 업데이트 할 수 있습니다.

  • DNS 호스팅 서비스도 제공하고 고객이 도메인을 호스팅하도록하여 A 레코드를 업데이트 할 수 있습니다.

  • 고객이 A 레코드를 하나의 기본 웹 서버로 설정하고 각 고객의 웹 요청에 대해 HTTP 리디렉션을 사용하도록합니다.


3

Sipwiz가 올바로 올바르게 수행하는 유일한 방법은 HTTP 및 DNS 하이브리드 접근 방식입니다. 제 등록 기관은 Tucows의 재 판매자이며 무료 부가가치 서비스로 루트 도메인 전달을 제공합니다.

도메인이 blah.com이면 도메인을 어디로 전달할 것인지 묻고 www.blah.com을 입력합니다. A 레코드를 아파치 서버에 할당하고 blah.com을 DNS 가상 호스트로 자동 추가합니다. 가상 호스트는 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의 www 사이트로 리디렉션하는 훨씬 더 간단하고 효율적인 방법이 있습니다.

Apache 구성에 다음 재 작성 규칙을 추가합니다 (가상 호스트 내부 또는 외부. 중요하지 않음).

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

또는 www가 아닌 ​​사이트에서 www 사이트로 URL을 일대일로 매핑하려면 다음 재 작성 규칙을 따르십시오.

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

이 작업을 수행하려면 mod_rewrite 모듈을로드해야합니다. 다행히 readytocloud.com은 기본적으로 mod_rewrite를로드하는 CentOS 상자에서 실행됩니다.

3,000 개의 도메인과 거의 4,000 개의 리디렉션으로 Apache 2.2를 실행하는 클라이언트 서버가 있지만 서버의로드는 약 0.10-0.20입니다.


질문은 DNS에 관한 것이 었습니다. Apache 웹 서버에 관한 것이 아닙니다.
SamTzu

-7

sipwiz와 MrEvil 모두에게 감사드립니다. 사용자가 입력 한 URL을 구문 분석 www하여 상단에 붙여 넣는 PHP 스크립트를 개발 했습니다. (고객이 입력하면 예를 들어 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
이것은 실제로 69k + 사람들이이 스레드를 찾고 있다는 질문에 대한 답이 아닙니다. 질문은 DNS에 관한 것이며 PHP와는 관련이 없습니다.
Matt Clark

1
질문은 DNS에 관한 것이 었습니다. PHP 코딩이 아닙니다.
SamTzu

HTTP_HOST는 이름에서 알 수 있듯이 URL이 아닌 호스트 이름입니다. 따라서 http://제거 할 항목이 없으며 /( $urlPagePath항상 비어 있음). CF httpd.apache.org/docs/2.4/expr.html . 방식 때문에 코드는 또한 같은 것들을하지 작동, 하위 도메인을 제거하려고 할 www.example.co.ukco.uk이이 전반적으로 고려되어야한다. 또한 HTTPS를 처리하지 않습니다. 마지막으로 PHP를 사용하여 모든 웹 서버가 구성에서 수행 할 수있는 HTTP 리디렉션을 수행하는 것은 너무 복잡합니다. 간단히 말해서 이것은 확실히이 질문에 대한 유효한 대답이되어서는 안됩니다.
Patrick Mevzek

이 규칙은 그것이 아파치 설정으로 수행해야 모든 호스트에 적용해야하는 경우
베토 슬라 프 Marinov에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.