왜 CNAME은 ROOT에서 쓸 수 없는가? PTR 레코드란 무엇인가?

글쓴이 연유 날짜

개요

도메인 등록 회사를 구글 도메인으로 바꾸면서 도메인의 루트에 CNAME을 등록할 수 없었다. 나는 집에서 DDNS을 이용해서 서버를 돌리고 있기 때문에, ip주소를 등록하는 A 레코드는 이용하기 어려웠다. 구글 도메인 레코드 등록 중에 도메인을 받는 레코드인 PTR 레코드가 있어 DDNS 도메인을 등록해봤다. CNAME이 아닌 PTR로 DDNS 주소를 등록하니 잘 동작했다.

CNAME 레코드는 왜 루트에 등록될 수 없을까?

그런데 왜 구글 도메인에서는 도메인의 루트에 CNAME을 등록할 수 없는 걸까. DNS 표준 규칙에 의하면 다음과 같은 도메인 제약 사항이 있다.

  • SOA와 NS 레코드는 루트 도메인에서 반드시 표현되어야 합니다. (RFC 1912)
  • DNSSEC의 SIG, NXT, KEY RR 레코드를 제외하고서는 CNAME 레코드는 다른 레코드와 같이 쓰일 수 없습니다. (RFC 2181)

이 제약 사항이 기술적으로 반드시 강제되는 것은 아니다. (내가 쓰던 도메인 등록 회사의 네임서버는 root 도메인에 CNAME 레코드를 두도록 허용했다. dig 도메인 주소로 그 도메인의 루트를 확인해보면 SOA와 NS 레코드는 보이지 않고, CNAME 레코드만 보인다.) 하지만, 표준 규약을 지키지 않으면 문제가 생길 수 있다. 일례로 도메인에 CNAME 레코드와 MX 레코드를 동시에 설정하면, Microsoft Exchange mail server에서 CNAME 레코드 외에 다른 레코드를 무시하여 정상작동하지 않는다. (https://blog.cloudflare.com/introducing-cname-flattening-rfc-compliant-cnames-at-a-domains-root/)

루트에 도메인 주소를 매칭할 수 있는 방법은 없는가?

하지만, 나의 경우처럼 항상 root domain이 ip 주소를 바라볼 수 있는 레코드를 가질 수 없는 경우도 있을 것이다. (예를 들어 DDNS 처럼 서버의 IP 주소가 계속 바뀌는 경우, 서버가 하나이든 두 개 이상을 병렬 적으로 구성한 사유이든 그럴 경우는 많다.) 따라서 표준을 지키는 도메인 네임서버 제공 회사는 자신들이 제공하는 별도의 레코드로 root domain에서 CNAME 레코드와 비슷한 기능을 할 수 있도록 구현했다. (예를 들어 ALIAS나, ANAME, 가상 CNAME(CNAME Flattening) 등) 이들은 실제로 도메인 주소값을 받는 레코드이지만, 네임서버 단에서 한 번 이 도메인 레코드를 해석하여 IP 주소를 받아와 A 레코드로 클라이언트에게 제공한다.

PTR 레코드란 무엇인가?

PTR 레코드는 도메인 주소로부터 서버의 IP 주소를 검증하기 위한 것이다. 나는 구글 도메인으로 바꾼 이후에 가상 CNAME과 같은 역할을 하기 위해 PTR 도메인을 설정했는데, 도메인 주소로 부터 IP 주소를 알아내는 PTR이 어떻게 그런 기능을 한 것일까?

ISP에 따라 PTR 레코드를 직접 관리하는 경우(즉, 도메인 주소 -> IP 주소의 대응에 관한 정보를 ISP가 쥐고 있음.)와 도메인 등록자에 위임하는 경우가 있다. 이때, 도메인 등록자에 위임을 하려면 ISP는 만약 111.222.33.4와 같은 도메인을 위임할 수 있게 4.33.222.111.in-addr.arpa. -> ptr_www.example.com.의 CNAME을 설정하여야 한다. 이때, 자신의 도메인에 PTR 레코드로 ptr_www -> www.example.com. 과 같이 설정하면 111.222.33.4가 www.example에 대응한다는 사실을 알 수 있다.

결론

즉, PTR 레코드를 가상 CNAME 레코드 처럼 이용할 수 있지만, 본래의 목적에 맞지 않는 것이다. 따라서 나는 가상 CNAME을 제공하는 DNS 서버로 도메인의 주소를 옮겼다. (뭔가 시작할 때 생각한 것과 다르게, 결론이 이상한 것 같지만 내 문제가 해결되었다.)

참고한 글:
https://support.google.com/domains/answer/3251147?hl=ko
https://www.freecodecamp.org/news/why-cant-a-domain-s-root-be-a-cname-8cbab38e5f5c/

카테고리: 미분류