dig는 Domain Information Groper의 약자로 DNS 서버에 질의를 보내는 데 사용되는 유용한 도구다. 웹호스팅과 시스템 관리를 하다 보면 도메인 DNS를 조회해야 할 일이 종종 생기는데, DNS의 문제를 파악하거나 도메인의 레코드등을 조회하는데 많이 사용된다. 윈도에서 쓸 수 있는 nslookup이라는 명령어도 있지만 주로 리눅스 OS에 기본 설치되어 있는 dig를 많이 사용하고 있다. 개인적인 생각으로 nslookup 보다 쿼리 결과가 직관적이며 보고 싶은 정보만 추려서 볼 수 있어 DNS 조회하는 도구 중 가장 활용도가 높은 명령어이다.
[목차]
1. dig 명령어 기본 사용법
dig [옵션] [도메인이름] [쿼리타입]
# dig gbminnote.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> gbminnote.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29617
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;gbminnote.com. IN A
;; ANSWER SECTION:
gbminnote.com. 300 IN A 27.0.236.139
;; Query time: 40 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 17 22:58:56 KST 2023
;; MSG SIZE rcvd: 58
2. 쿼리결과 섹션별 분석
Header Section
여기서 DiG 버전 및 사용한 명령어가 표시된다. "+cmd"는 dig 명령어를 보여주는 기본 옵션이다.
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> gbminnote.com
;; global options: +cmd
Got answer Section
이 섹션에서는 질의에 대한 응답 상태를 확인할 수 있다. "status: NOERROR"는 에러 없이 질의가 수행되었음을 나타낸다. "flags: qr rd ra"에서 qr은 질의응답을, rd는 재귀적 질의를, ra는 재귀적 답변을 나타낸다.
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29617
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
OPT PSEUDOSECTION
이 섹션에서는 확장 DNS(EDNS)에 대한 정보를 확인할 수 있다. EDNS는 DNS 프로토콜의 확장으로, 크기가 큰 패킷 처리, DNSSEC 등 추가적인 기능을 제공한다.
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
QUESTION SECTION
이 섹션에서는 실행한 질의에 대한 정보를 확인할 수 있다. 여기서는 "gbminnote.com." 도메인의 IPv4 주소(A 레코드)를 질의하였다.
;; QUESTION SECTION:
;gbminnote.com. IN A
ANSWER SECTION
이 섹션에서는 질의에 대한 응답을 확인할 수 있다. "gbminnote.com." 도메인의 IPv4 주소는 "27.0.236.139" 임을 알 수 있다.
;; ANSWER SECTION:
gbminnote.com. 300 IN A 27.0.236.139
Query time, Server, When, MSG SIZE rcvd
이 섹션에서는 질의에 소요된 시간, 사용한 DNS 서버, 질의 시간, 받은 메시지 크기 등을 확인할 수 있다. 이 쿼리의 질의 시간이 40ms, 사용한 DNS 서버는 "8.8.8.8", 질의 시간은 "Mon Jul 17 22:58:56 KST 2023", 받은 메시지 크기는 58바이트이다.
;; Query time: 40 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 17 22:58:56 KST 2023
;; MSG SIZE rcvd: 58
3. dig 명령어 주요 옵션과 활용예제
+short : 짧은 형태의 결과를 반환
# dig gbminnote.com +short
27.0.236.139
+dnssec : DNSSEC 관련 정보를 포함하여 결과를 출력
# dig gbminnote.com +dnssec
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> gbminnote.com +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24823
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 512
;; QUESTION SECTION:
;gbminnote.com. IN A
;; ANSWER SECTION:
gbminnote.com. 300 IN A 27.0.236.139
gbminnote.com. 300 IN RRSIG A 13 2 300 20230718150807 20230716130807 34505 gbminnote.com. JaNyX2DTFoXicuwRMeaJKDZDZGAKvOrgyNJ9uUWEPs82eS4ax7cE6UWU NtwbwWZ39yjQTVa19OFEVwcG6PIxiw==
;; Query time: 35 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 17 23:08:34 KST 2023
;; MSG SIZE rcvd: 58
@서버이름 : 특정 DNS 서버
# dig @168.126.63.1 gbminnote.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> @168.126.63.1 gbminnote.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10279
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;gbminnote.com. IN A
;; ANSWER SECTION:
gbminnote.com. 300 IN A 27.0.236.139
;; Query time: 3 msec
;; SERVER: 168.126.63.1#53(168.126.63.1)
;; WHEN: Mon Jul 17 23:10:08 KST 2023
;; MSG SIZE rcvd: 58
mx : 메일 교환(MX) 레코드를 질의
# dig gbminnote.com mx
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> gbminnote.com mx
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36728
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;gbminnote.com. IN MX
;; ANSWER SECTION:
gbminnote.com. 247 IN MX 10 mail.gbminnote.com.
;; Query time: 34 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 17 23:10:48 KST 2023
;; MSG SIZE rcvd: 63
txt : 텍스트(TXT) 레코드를 질의
# dig gbminnote.com txt
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> gbminnote.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2223
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;gbminnote.com. IN TXT
;; ANSWER SECTION:
gbminnote.com. 300 IN TXT "google-site-verification=CP9TX0cbjR7fRFr5MYoBWNqSDW6RcwX7BV0xg0YIjGM"
gbminnote.com. 300 IN TXT "v=spf1 ip4:211.37.179.216 ~all"
;; Query time: 35 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 17 23:11:24 KST 2023
;; MSG SIZE rcvd: 166
CNAME : CNAME 레코드 질의
# dig www.gbminnote.com cname
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> www.gbminnote.com cname
; (6 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43631
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.gbminnote.com. IN CNAME
;; ANSWER SECTION:
www.gbminnote.com. 300 IN CNAME host.tistory.io.
;; Query time: 2 msec
;; SERVER: 108.162.193.168#53(108.162.193.168)
;; WHEN: Mon Jul 17 23:16:40 KST 2023
;; MSG SIZE rcvd: 75
-x : ptr 레코드 (리버스 DNS) 조회, IP 주소로부터 그에 연결된 도메인 이름을 찾음.
dig -x 8.8.8.8
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> -x 8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42820
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;8.8.8.8.in-addr.arpa. IN PTR
;; ANSWER SECTION:
8.8.8.8.in-addr.arpa. 19853 IN PTR dns.google.
;; Query time: 30 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 17 23:21:53 KST 2023
;; MSG SIZE rcvd: 73
옵션 별로 예제를 만들었지만 쿼리 타입과 옵션을 조합하여 쿼리 결과에서 보고 싶은 내용만 조합하여 출력해 낼 수 있다.
스크립트 처리로 한번의 실행 만으로 여러가지 를 한번에 조회할수도있다.