메뉴

문서정보

목차

DNS Resolution

dig는 DNS(Domain Name Service)에 질의를해서 응답을 분석하고 문제를 해결하기 위해서 사용하는 강력한 툴이다. 리눅스와 맥OS는 기본으로 설치가 된다. 윈도우즈 시스템은 https://www.isc.org/bind 에서 다운로드 하면 된다.

dig로 할 수 있는 일 중에 recursive DNS resoution이 있다. DNS 질의는 재귀적으로 수행되는데, 이 과정을 터미널에 출력하는 기능이다. 이 기능을 이용해서 관리자는 어느 DNS 계층 구조에 문제가 있는지를 확인 할 수 있다.

재귀적 질의라는 용어가 헷갈릴 수 있는데, DNS의 기본적인 작동 방식을 이해하는게 좋을 것 같다.

 DNS 작동방식

몇 개 용어들을 정리해야겠다. DNS Client. DNS 질의를 하는 클라이언트 프로그램이다. 이 프로그램은 Recursive Resolver(혹은 Recursive Recursive DNS Server)에 질의를 요청한다. www.joinc.co.kr를 요청했다고 가정해보자.

Recursive Resolver. DNS는 계층 구조를 이루고 있다. 일종의 디렉토리 서비스인 셈이다. 계층 구조를 가지는 목표는 대량의 정보를 쉽게 구조화 하고, 빠르게 찾을 수 있기 때문이다. 파일 시스템의 디렉토리 서비스의 편리함을 생각해보면 된다. 클라이언트의 요청을 받은 Recursive Resolver는 root name server에 www.joinc.co.kr를 질의 한다.

Root Server. DNS의 루트, 즉 디렉토리 최상단에 위치한 name server다. www.joinc.co.kr에 대한 질의를 받은 root server는 해당 도메인을 관리하는 최상위 도메인(Top-level domain)에 대한 authoritative name server의 목록을 반환한다. Authoritative name server 목록을 받은 Recursive Resolver는 Authoritative name server에 질의를 요청한다. .kr, .jp, .cn, .com 등이 최상위 도메인이다. Root server를 정점으로하는 DNS 계층적 구조는 아래와 같이 묘사 할 수 있다.

 DNS 계층구조

Authoritative name server. www.joinc.co.kr 도메인 이름에 대한 IP주소를 알려준다. 해당 도메인에 대한 IP 주소를 포함한 다른 DNS 레코드등 중요한 정보도 함께 리턴한다. Authoritative name server는 지역별로 있는 전화번호부 같은 거라고 보면 된다.

DNS Client가 Recursive Resolver에 도메인 이름을 질의할 경우 요청 할 때마다 Root server 를 거치지는 않는다. Recursive Resolver는 캐시된 DNS 테이블에서 찾아서 반환한다. 캐시된 정보가 없거나 TTL(Time-To-Live)를 초과 햇을 경우에만 상위 도메인 서버에 요청을 수행한다.

dig로 확인

dig +trace 명령을 이용해서 DNS 질의 경로를 추적 할 수 있다. www.joinc.co.kr를 추적해보자.
# dig @8.8.8.8 +trace www.joinc.co.kr

; <<>> DiG 9.11.5-P1-1ubuntu2.5-Ubuntu <<>> @8.8.8.8 +trace www.joinc.co.kr
; (1 server found)
;; global options: +cmd
.			99004	IN	NS	a.root-servers.net.
.			99004	IN	NS	b.root-servers.net.
.			99004	IN	NS	c.root-servers.net.
.			99004	IN	NS	d.root-servers.net.
.			99004	IN	NS	e.root-servers.net.
.			99004	IN	NS	f.root-servers.net.
.			99004	IN	NS	g.root-servers.net.
.			99004	IN	NS	h.root-servers.net.
.			99004	IN	NS	i.root-servers.net.
.			99004	IN	NS	j.root-servers.net.
.			99004	IN	NS	k.root-servers.net.
.			99004	IN	NS	l.root-servers.net.
.			99004	IN	NS	m.root-servers.net.
.			99004	IN	RRSIG	NS 8 0 518400 20190830050000 20190817040000 59944 . gwaxxskDBvzN0y3VJlvwqzFcQMOLoZj8m/L5196ks+gFWltSrq7MPT1E OuJtgiOoV4L86Tq5aiYSunbDyXH6XWiB7UVo96dX65fwrCKiOFmSTTqN iP6N1REabzWY+bkUZEAtvI/fXCEvzVANoD1iFCyQFf7QQ8ip69eNFfrX 3Oa9Ib0NoE2LXsB2/BdjLMUxrq/n9Yxh3+mXKrM+CH4fuYedEHG6Vw81 liQVMJcnww+7xr46e8QTWKXjEgYQyJ5g3IXwjcVdK3XU6HLL1aGi0s38 ouegoa/yF/c5aX+cD0/3j0LSuFpwsTCXQuoZ37ErpbojEQ1jPHmk+l9D U9QPdw==
;; Received 525 bytes from 8.8.8.8#53(8.8.8.8) in 38 ms
root name server에 질의 한 걸 확인 할 수 있다. root name server는 {a-m}.root-servers.net이름을 가지고 있으며, 도메인에 대한 IP도 고정돼 있다. Root name server - wikipedia에서 root name server에 대한 자세한 정보를 확인 할 수 있다.

RRSIG라는 생소한 레코드가 있는데, DNSSEC라는 공개키 전자서명을 이용한 DNS 위/번조 방지 메커니즘을 위해서 사용하는 레코드다. 레코드 값으로 공개키를 이용해서 올바른 값인지를 검증 할 수 있다.

kr.			172800	IN	NS	b.dns.kr.
kr.			172800	IN	NS	c.dns.kr.
kr.			172800	IN	NS	d.dns.kr.
kr.			172800	IN	NS	e.dns.kr.
kr.			172800	IN	NS	f.dns.kr.
kr.			172800	IN	NS	g.dns.kr.
kr.			86400	IN	DS	17625 7 2 FB939059F4B67BBA1E8AC37E35811E506488B2D8CFF807AF873B2116 B5676B5C
kr.			86400	IN	RRSIG	DS 8 1 86400 20190902050000 20190820040000 59944 . Z63woerD9NS2AzlC+QO0FUdtJ1OQxu+uujK4kXDK2aQoKgSkCqNScEIy KZOo2/5Ukd9ePQXKK5xYd+ez9lROv1F5aEb0g4hv3O2Liq3TL2qmkDqV Xfa6+AXoeOhgzeeQlSeoEkkxY10xvSTzpexp5HfDS2rCVNKNk4bWBxDR 9NPruEl/e8069WXv0VbIs1pbB+6Nys15dl9YVhaL5qt9g1Ye/spOxe2n LTjtXSrWOgpOXEFzctiq9+PWwwlfaNl3xGq3fdUPBZ9dhUSfZ2H1Z1aH OEG2U2N8ZbbwggQcmOuZQhylO4MvRIxE9dH3L5ZY9DVQTSWjqFpIHLj8 RhW1YA==
;; Received 687 bytes from 198.97.190.53#53(h.root-servers.net) in 186 ms

마지막 줄을 보자 h.root-server.nset응답이라는 것을 말해주고 있다. 최상위 도메인 서버를 리턴했다. kr최상위 도메인 서버는 {b-g}.dns.kr이며, KT(b.dns.kr, d.dns.kr), LG U+(c.dns.kr), SK(f.dns.kr) 등 대형 통신회사에서 관리하고 있다.

joinc.co.kr.		86400	IN	NS	ns1.whoisdomain.kr.
joinc.co.kr.		86400	IN	NS	ns3.whoisdomain.kr.
joinc.co.kr.		86400	IN	NS	ns2.whoisdomain.kr.
joinc.co.kr.		86400	IN	NS	ns4.whoisdomain.kr.
U3DDJFBKOIPB9S5A1IFP8MCCN46S4K58.co.kr.	900 IN NSEC3 1 1 10 96E920 U3IGRDUSJ53PT3117IA7U8BUE9QD3ASL NS SOA RRSIG DNSKEY NSEC3PARAM
;; Received 651 bytes from 203.83.159.1#53(d.dns.kr) in 7 ms

d.dns.kr name server에 joinc.co.kr 관리 네임서버를 요청하니, whoisdomain.kr 네임서버 목록을 리턴했다. joinc.co.kr은 whois에서 구매한 도메인이다.
www.joinc.co.kr.	300	IN	A	1.234.27.228
;; Received 60 bytes from 222.122.218.45#53(ns2.whoisdomain.kr) in 6 ms
ns2.whoisdomain.kr 이 www.joinc.co.kr 도메인에 대한 IP를 리턴하는 것으로 dns resolving 과정이 끝났다.