Network

dig 명령어 출력 결과 분석하기

라온클 2023. 12. 16. 20:43

dig 소개

dig(Domain Information Groper)는 DNS 정보를 조회할 수 있는 네트워크 관리 도구입니다.
dig는 DNS 네임서버에 쿼리하고, 받은 응답을 출력하는 방식으로 DNS 정보를 조회(lookup)합니다.
 
여기까지 들으면, nslookup과 매우 유사하지만, nslookup보다 더 상세한 정보를 제공한다는 점이 특징입니다.
 
실제로 비슷한 DNS명령어인 host, nslookup 명령어에 레코드 옵션을 똑같이 지정해서 실행하면 dig가 가장 긴 답변을 출력하는 것을 볼 수 있습니다.

host -t ns lifeoncloud.kr
nslookup -type=ns lifeoncloud.kr
dig -t ns lifeoncloud.kr

왼쪽부터 host, nslookup, dig

 
dig 출력 결과가 얼마나 구체적이길래 어떤 의미를 갖고 있는지 궁금해서 간단히 분석해보았습니다.
 

dig 출력 결과

dig lifeoncloud.kr

 

; <<>> DiG 9.10.6 <<>> lifeoncloud.kr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60658
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;lifeoncloud.kr.			IN	A

;; ANSWER SECTION:
lifeoncloud.kr.		600	IN	CNAME	host.tistory.io.
host.tistory.io.	272	IN	CNAME	blog-tistory-l51ybqnn.kgslb.com.
blog-tistory-l51ybqnn.kgslb.com. 28 IN	A	211.249.222.34

;; Query time: 15 msec
;; SERVER: 1.214.68.2#53(1.214.68.2)
;; WHEN: Fri Dec 15 21:09:30 KST 2023
;; MSG SIZE  rcvd: 133

 
 

헤더 섹션 (Header Section)

; <<>> DiG 9.10.6 <<>> lifeoncloud.kr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60658
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1


'DiG 9.10.6'는 DNS 쿼리에 사용된 dig 도구의 버전을 나타냅니다.
dig -v 명령어를 실행하여 현재 설치된 dig 버전이라는것을 확인할 수 있습니다.

 
;; global options: +cmd
기본적으로 cmd 옵션이 사용되었다는 것을 의미합니다.

;; Got answer:
DNS 서버로부터의 응답 받았다는 것을 의미합니다.
이후부터는 DNS 응답의 헤더에 대한 정보가 표시됩니다.

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60658

  • opcode: DNS에 의해 수행된 작업
  • status: DNS 응답 상태 코드
  • id: DNS 메시지 식별자

DNS에 의해 수행된 작업(opcode)인 질의(QUERY)를 수행하여 정상적으로 응답을 받았다(NOERROR)는 id 60658의 DNS메시지라고 해석할 수 있습니다.
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

  • flags: DNS 메시지 특성
    • qr: 질의 응답 메시지
    • rd: 재귀 필요(Recursion Desired)
    • ra: 재귀 가능(Recursion Available)
  • QUERY: 질의
  • ANSWER: 응답
  • AUTHORITY: 권한
  • ADDITIONNAL: 추가

 
 

옵션 섹션 (OPT PSEUDOSECTION)

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
  • OPT: DNS 메시지에 대한 옵션 정보를 나타네는 레코드
    • EDNS: Extension Mechanisms for DNS
    • version: EDNS의 버전
    • flags:DNS 확장 플래그
    • udp:  요청을 전달하는 UDP 패킷 크기

'OPT'는 Extension Mechanisms for DNS (EDNS)에서 사용되는 가상 레코드입니다. 여기서 'OPT'는 Option을 나타내며, 'OPT' 레코드는 DNS 메시지의 부가적인 정보를 포함하는 데 사용되며, 주로 DNS 확장 기능을 활성화하거나 특정 기능을 사용하도록 지시하는 데에 쓰입니다. 'OPT' 레코드는 표준 DNS 레코드 타입이 아니라서 가상 레코드 라는 뜻으로 'virtual record'또는 'pseudo-record'로도 불립니다.

flags:; 와 같이, 본 메시지처럼 OPT PSEUDOSECTION에 플래그가 없는 경우는 일반적으로 EDNS의 확장 플래그가 설정되지 않았음을 나타냅니다. 확장 플래그의 예시로는 'DNSSEC OK'라는 의미의 'DO'플래그가 있습니다.
 
 

질문 섹션 (QUESTION SECTION)

;; QUESTION SECTION:
;lifeoncloud.kr.			IN	A

 
왼쪽부터 Name, Class, Type입니다.

Name Class Type
lifeoncloud.kr. IN A
'lifeoncloud.kr' 도메인 이름에 대해, IN(인터넷 네트워크)클래스의 DNS레코드 중 A레코드 타입에 대해 질의한다는 뜻입니다.

 
dig 명령어는 별도로 옵션을 지정하지 않으면 A레코드에 대해 질의합니다.
아래 두 명령어는 같은 출력 결과를 보여줍니다.

dig lifeoncloud.kr
dig -t a lifeoncloud.kr

 

 
 
 
 
 

응답 섹션 (ANSWER SECTION)

;; ANSWER SECTION:
lifeoncloud.kr.		600	IN	CNAME	host.tistory.io.
host.tistory.io.	272	IN	CNAME	blog-tistory-l51ybqnn.kgslb.com.
blog-tistory-l51ybqnn.kgslb.com. 28 IN	A	211.249.222.34

 
 
왼쪽부터 Name, TTL, Class, Type, Value 순서로 보시면 됩니다.

Name TTL Class Type Value
lifeoncloud.kr. 600 IN CNAME host.tistory.io.
host.tistory.io. 272 IN CNAME blog-tistory-l51ybqnn.kgslb.com.
blog-tistory-l51ybqnn.kgslb.com. 28 v A 211.249.222.34



분명 질문 섹션에는 A레코드만 있는데 응답에 CNAME레코드가 나오는 이유는 제가 티스토리 블로그에 개인 도메인을 설정하려고 DNS 설정에 CNAME레코드를 추가했기 때문입니다.

참고: CNAME 레코드를 이용하여 티스토리 블로그에 개인 도메인 설정하기

그래서 아래와 같은 순서로 질의가 진행되어 A 레코드를 찾았다고 보면 됩니다.
[lifeoncloud.kr] → [host.tistory.io] → [blog-tistory-l51ybqnn.kgslb.com] → [211.249.222.34] 

말로 표현하면 이렇습니다다.
"[lifeoncloud.kr]는 [host.tistory.io]의 별칭이고, 
[host.tistory.io]는 [blog-tistory-l51ybqnn.kgslb.com]의 별칭이다.
[blog-tistory-l51ybqnn.kgslb.com]의 A레코드는 [211.249.222.34]이므로, 
결국 [lifeoncloud.kr]의 A레코드는 [211.249.222.34]이다."

더 쉽게 비유하면 외국 방송국 관계자가 유퀴즈 보고 '큰 자기'의 소속사에 연락하고 싶어서 검색하다가 아래 순서대로 알게되는 거라고 보면 됩니다.
[큰 자기] → [유느님] → [유재석] → 유재석의 소속사는 [안테나]
 
만약 제가 CNAME을 설정해두지 않았다면 응답 세션이 아래처럼 깔끔하게 나왔을 겁니다.

;; ANSWER SECTION:
lifeoncloud.kr.     28 IN A 211.249.222.34

 
 
 

쿼리 시간 및 서버 정보 섹션

;; Query time: 15 msec
;; SERVER: 1.214.68.2#53(1.214.68.2)
;; WHEN: Fri Dec 15 21:09:30 KST 2023
  • Query time: DNS 쿼리에 소요된 시간
  • SERVER: 응답을 받은 DNS 서버의 주소 및 포트
  • WHEN:명령어 실행 시간


메시지 크기 섹션 (Message Size)

;; MSG SIZE  rcvd: 133

 

  • MSG SIZE: 메시지 크기
  • rcvd: 수신(recieved)

수신된 전체 메시지의 크기가 133bytes임을 나타낸다.
이 부분은 주로 네트워크 트래픽 모니터링 같은 목적에 활용할 수 있습니다.
 

참고 링크

https://datatracker.ietf.org/doc/html/rfc1035 
https://en.wikipedia.org/wiki/Dig_(command) 
https://en.wikipedia.org/wiki/List_of_DNS_record_types
https://en.wikipedia.org/wiki/Extension_Mechanisms_for_DNS 
https://jjeongil.tistory.com/1386 
https://linux.die.net/man/1/dig 
https://serverfault.com/questions/1018425/what-does-opt-pseudosection-mean-in-dig-response/1018678#1018678
 
 
 

마무리하며

host, nslookup, dig 명령어로 같은 쿼리를 던져도 dig가 제일 긴 출력 결과를 주는 것이 신기해서 포스팅을 쓰게 되었습니다.

2024-01-23 수정
dig 명령어가 디그다의 Dig(파다)란 뜻도 맞다고 합니다.
알려주신 리눅서님자니님 감사합니다 :)