본문 바로가기
CS/네트워크

도메인이 신청되는 과정과 Reverse DNS lookup

by 베어 그릴스 2022. 12. 27.
320x100

도메인이 신청되는 과정

크게 보면, DNS 서버는 트리 구조로 되어있다.

  • Root DNS Server: ICANN이 직접 관리하는 서버로, TLD DNS 서버 IP들을 저장해두고 안내하는 역할을 한다.
  • TLD(최상위 도메인) DNS Server: 도메인 등록 기관(Registry)이 관리하는 서버로, Authoritative DNS 서버 주소를 저장해두고 안내하는 역할을 한다. 어떤 도메인 묶음이 어떤 Authoritative DNS Server에 속하는지 아는 이유는 도메인 판매 업체(Registrar)의 DNS 설정이 변경되면 도메인 등록 기관(Registry)으로 전달이 되기 때문이다.
  • Authoritative DNS Server: 실제 개인 도메인과 IP 주소의 관계가 기록/저장/변경되는 서버. 그래서 권한의 의미인 Authoritative가 붙는다. 일반적으로 도메인/호스팅 업체의 ‘네임서버’를 말하지만, 개인 DNS 서버 구축을 한 경우에도 여기에 해당한다.
  • Recursive DNS Server: 인터넷 사용자가 가장 먼저 접근하는 DNS 서버. 위 3개의 DNS 서버를 매번 거친다면 효율이 좋지 않을 수밖에 없으니, 한 번 거친 후 얻은 데이터를 일정 기간(TTL/Time to Live) 동안 캐시라는 형태로 저장해 두는 서버. 직접 도메인과 IP 주소의 관계를 기록/저장/변경하지는 않고 캐시만을 보관하기 때문에, Authoritative와 비교되는 의미로 반복의 Recursive가 붙음. 대표적인 것이 KT/LG/SK와 같은 ISP(통신사) DNS 서버가 있고, 브라우저 우회 용도로 많이 쓰는 구글 DNS, 클라우드플레어와 같은 Public DNS 서버가 있음.

즉, client는 Recursive DNS, Root, TLD, Authoritative 순으로 DNS 서버에 접근하게 된다. 즉, IP 주소 블럭을 가지고 있는 기업들은 Authoritative DNS Server를 구축하고 있을 것이다. 그렇다면 이제 해당 기업들에서 도메인이 등록되는 과정을 살펴보자.

  1. A 기업이 가지고 있는 IP 주소 블럭 중 하나를 B 서버에서 할당받음
  2. B서버는 A기업에 host name인 B.A.ac.kr을 IP주소 블록 중 하나에 매핑해달라고 요청
  3. A기업은 A DNS 서버에 해당 hostname과 IP 주소 엔트리를 추가
    - 이제 client가 웹브라우저에 B.A.ac.kr을 검색하면, 최종적으로 도메인 A.ac.kr에 대한 authoritative DNS server인 A DNS 서버로 contact 해서 IP 주소를 알아내고 해당 IP 주소로 요청을 보내게 된다. 즉, IP 주소블록을 가지고 있는 기업은 DNS 서버를 운영하고 있고, 해당 IP에 접근하기 위해서는 그 기업의 DNS 서버로 최종 contact 해야 한다.

 

Reverse DNS Lookup이란?

기존의 forward DNS Lookup은 잘 알다시피 우리가 검색하는 naver.com 즉, host name을 가지고 IP address를 알아내는 작업을 말한다.

Reverse DNS lookup은 그와 반대로 IP address를 통해 host name을 알아내는 것을 의미한다.

IP에 대응되는 host name을 DNS PTR record라고 부른다.

 

사용예시 : Spam filter 시에 사용될 수 있다. 이메일을 보내는 상대가 Nick@dns.com이라고 해보자. 이메일을 받는 사람은 이메일을 보내는 상대가 보낸 IP헤더에 적혀있는 IP주소가 실제로 dns.com과 일치하는지 확일할 때 PTR record를 lookup 하여야 한다. 이런 확인을 하지 않는다면 sender가 자신의 IP 주소와 관계없는 메일 주소를 이메일 헤더에 작성하여 보낼 수 있게 된다.

 

Java로 Reverse DNS lookup을 하는 방법

자바의 InetAddress.getCanonicalHostName()와 InetAddress.getHostName()를 통해서 할 수 있다.

  • getCanonicalHostName()
    항상 DNS Rever Lookup을 통해 Full qualified domain name을 가져오려한다. 
  • getHostName()
    InetAddress 객체에 저장된 hostname이 있다면 그것을 우선적으로 반환한다.

하지만 getCanonicalHostName()을 사용하여도, IP address를 그대로 반환하는 경우가 있다.

추정되는 원인으로는 Authoritative DNS server에서 DNS A record만(domain to IP) 등록하고, DNS PTR record를 따로 등록하지 않았을 경우 IP를 반환할 것이라고 추정된다.

 

또, 되지만 이상한 경우도 있다. 예를 들어 cse.konkuk.ac.kr의 IP 주소로 getCanonicalHostName을 통해 hostname을 가져왔을 때, 다른 v.konkuk.ac.kr 이 나오는 것을 확인할 수 있는데, shared web hosting을 사용하는 경우에 그렇다.

 

host 커맨드를 이용한 결과를 보자.

이렇게 하나의 IP에 여러 web이 hosting 되어있는 것을 볼 수 있다.

 

이럴 경우에 아직 어떤 hostname을 반환하는지 확실하진 않지만, Authoritative DNS server가 설정한 대로 domain을 반환할 것이라 추정되기 때문에 신뢰하기에는 어렵다고 생각된다.

728x90