Domain Information Groper의 약자다. DNS name server과의 상호작용에 사용되며, DNS query를 통해 name server에서 오는 답변이 뭔지를 파악하는게 가능하다. 혹시 DNS가 뭔지 잘 모른다면 이 글 참고
이 query-reply를 기반으로 네트워크 관리자들이 DNS 관련 문제들을 해결하기 위해 사용된다. 가장 흔한 경우는 본인이 운영하는 서버 관련 정보를 DNS query를 할 때 잘 전달이 되고 있는지를 확인한다.(...) 또 그냥 특정 host name에 대한 ip주소나 그 반대가 필요한 경우에도 사용한다. TLD name server ip 주소라든가.
이전의 nslookup
과 host
라는 command를 대체하기 위해 등장했다. nslookup
은 DNS name server 내용물 분석에 사용되었었고, host
는 ip주소에 따른 host name, 혹은 그 반대를 구하는데 사용되었는데 dig
는 이를 둘 다 처리해준다.
Ubuntu 22.03 기준 기본으로 설치가 되어 있다. 없는 경우 다음 시도
$ sudo apt-get install dnsutils
dig @server name type
각 parameter에 대해 설명하자면
@server
: query 수행 대상인 name server의 ip address가 들어간다. IPv4, IPv6 둘 다 사용 가능. name server의 host name이 주어진 경우 본인이 자체적으로 DNS query를 돌려서 대응되는 ip주소를 찾는다. 아예 주어지지 않을 경우 시스템의 /etc/resolve.conf
에 등록되어 있는 name server에 대해서 query를 수행한다.name
: query 주체가 되는 host의 이름.type
: query 종류. ANY
, A
, MX
, SIG
등 유효한 모든 type이 가능하다. 주어지지 않을 경우 A
에 대해서 수행한다.name
은 무조건 주어져야하며 나머지는 주어질 필요가 없다. 이 때문에 가장 기본적인 query는 밑과 같은 형태를 가지며 결과물은 다음과 같이 나온다.
$ dig naver.com
; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> naver.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22830
;; flags: qr rd ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;naver.com. IN A
;; ANSWER SECTION:
naver.com. 0 IN A 223.130.195.200
naver.com. 0 IN A 223.130.200.104
naver.com. 0 IN A 223.130.200.107
naver.com. 0 IN A 223.130.195.95
;; Query time: 10 msec
;; SERVER: 172.31.112.1#53(172.31.112.1) (UDP)
;; WHEN: Sun Dec 24 13:42:17 KST 2023
;; MSG SIZE rcvd: 100
A
record, 그러니까 www.naver.com의 IPv4주소들이 잔뜩 주어졌다. 위에서부터 하나하나 결과물을 분석해보겠다.; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> naver.com
;; global options: +cmd
dig
의 버전과 ip주소를 알아내기 위한 hostname이 주어져있다. 그 다음은 해당 dig
command에 설정된 global option들의 모음인데, 기본으로는 cmd
만 주어지며 그 외에 short
라는 option등이 존재한다. global option은 +
를 통해 보통 부여를 한다. cmd
는 사실 이 두 줄을 print할 때 사용되는 option이다. 저걸 끄고 싶으면 +nocmd
를 사용하면 된다.;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22830
;; flags: qr rd ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
여기는 DNS reply header에 대한 정리 및 dig
에서 한 작업에 대한 정리다. 혹시 잘 모르겠다면, 이 링크를 참고하면 자세히 알 수 있다.
opcode
: dig에서 무슨 dns query 작업을 수행했는가?status
: 그 결과가 어땠는가?id
: query/reply들에 번호를 매긴 것으로 보통 특정 query에 대해 특정 reply가 뭐였는지 분석하기 편하게 하기 위해 쓰인다.flags
: DNS message header에 있는 정보다. header상에 가능한 값들 중 assert된 값들만이 나온다. 위에서 qr
은 query response, rd
은 recursion desired, ad
는 링크에 안 나와 있는데, authenticated data의 약자로 DNSSEC
가 적용된 reply로 보안상 안전한 message라는 것을 의미한다.QUERY
: query 개수. 여기선 naver.com
1개다.ANSWER
: 답변 개수. 아까 보면 알겠지만 A
에 해당하는 record가 4개였어서 4개다.AUTHORITY
: DNS 답변중 authority section에 있는 record의 개수. 어느 TLD/authoritative name server에 가야 원하는 답변을 얻을 수 있는지를 알려줄 때 해당 section에 관련 record를 집어넣으며, 그 section에 있는 record의 개수가 저기에 해당된다.ADDITIONAL
: 추가 정보를 제공하는 record의 개수. 위 예시에선 0개다. 여러 record가 여기에 해당될 수 있으나 가장 대표적인 record는 AUTHORITY
에 있는 name server들에 실제로 대응되는 ip address 정보가 있는 A
/AAAA
record다. (glue record)이 부분을 없애고 싶으면 +nocomments
를 쓰면 된다.
;; QUESTION SECTION:
;naver.com. IN A
dig
에서 사용한 query에 대한 정보가 나오는 부분이다. naver.com
에 A
record에 대한 query를 했다. IN
은 internet을 의미한다. 이 부분을 없애고 싶으면 +noquestion
을 사용하면 된다.;; ANSWER SECTION:
naver.com. 0 IN A 223.130.195.200
naver.com. 0 IN A 223.130.200.104
naver.com. 0 IN A 223.130.200.107
naver.com. 0 IN A 223.130.195.95
dig
가 지정된 name server에 query한 결과 받은 reply다. 중간의 숫자는 TTL이다. 없애고 싶으면 +noanswer
을 쓰자.
위에는 안 나와있지만 AUTHORITY
랑 ADDITIONAL
에 해당하는 record가 더 있을 경우 AUTHORITY
section과 ADDITIONAL
section에 대한 정보도 추가로 나온다. 한번 확인을 위해 .com
TLD server들의 ip 주소 중 하나인 192.52.178.30
에 한번 naver.com
query를 얻어보도록 하자. 참고로 .com
TLD ip주소를 얻고 싶으면 dig NS com
을 하면 된다. 불법 아니다.
;; AUTHORITY SECTION:
naver.com. 172800 IN NS ns2.naver.com.
naver.com. 172800 IN NS ns1.naver.com.
;; ADDITIONAL SECTION:
ns2.naver.com. 172800 IN A 125.209.249.6
ns1.naver.com. 172800 IN A 125.209.248.6
naver.com
을 구하기 위해 사용할 수 있는 authoritative name server의 이름과, 이들의 ip주소가 주어진다. 여기도 중간의 숫자는 TTL이다. 없애고 싶으면 +noauthority
랑 +noadditional
을 쓰자.;; Query time: 10 msec
;; SERVER: 172.31.112.1#53(172.31.112.1) (UDP)
;; WHEN: Sun Dec 24 13:42:17 KST 2023
;; MSG SIZE rcvd: 100
이후 기타 통계를 출력한다. 없애고 싶으면 +nostats
를 사용하자.
위의 것들을 전부 출력하기 싫으면 +noall
을 사용하면 된다. 보통 원하는거 하나만 출력하기 위해 사용된다. 예를들어 ANSWER
만 출력하고 싶으면 +noall +answer
를 사용하면 된다.
ANSWER
with simple format (+short)ANSWER
만 출력을 하고 싶으면 +short
를 사용하자. 유의할게 ADDITIONAL
이랑 AUTHORITY
는 출력이 안된다.$ dig naver.com +short
223.130.200.107
223.130.200.104
223.130.195.95
223.130.195.200
ANSWER
with original format (+noall and +answer)ANSWER
영역만 기본 format처럼 상세히 출력을 하고 싶으면 +noall
이랑 answer
을 사용하자.$ dig naver.com +noall +answer
naver.com. 0 IN A 223.130.195.200
naver.com. 0 IN A 223.130.195.95
naver.com. 0 IN A 223.130.200.107
naver.com. 0 IN A 223.130.200.104
$ dig @192.52.178.30 naver.com
; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> @192.52.178.30 naver.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32131
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 3
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;naver.com. IN A
;; AUTHORITY SECTION:
naver.com. 172800 IN NS ns2.naver.com.
naver.com. 172800 IN NS ns1.naver.com.
;; ADDITIONAL SECTION:
ns2.naver.com. 172800 IN A 125.209.249.6
ns1.naver.com. 172800 IN A 125.209.248.6
;; Query time: 140 msec
;; SERVER: 192.52.178.30#53(192.52.178.30) (UDP)
;; WHEN: Sun Dec 24 17:05:56 KST 2023
;; MSG SIZE rcvd: 106
각 type의 record 약자를 그대로 집어넣으면 된다. 앞의 기본 format의 type
위치에다가 넣으면 된다. 기본은 A
였다.
워낙에 종류가 많아서 다 할수는 없고... 예시를 보여주자면 먼저 A
record
$ dig naver.com a +noall +answer
naver.com. 0 IN A 223.130.200.107
naver.com. 0 IN A 223.130.195.200
naver.com. 0 IN A 223.130.195.95
naver.com. 0 IN A 223.130.200.104
AAAA
record$ dig google.com aaaa +noall +answer
google.com. 0 IN AAAA 2404:6800:400a:813::200e
CNAME
record$ dig mail.naver.com cname +noall +answer
mail.naver.com. 0 IN CNAME mail.naver.com.nheos.com.
TXT
record$ dig naver.com txt +noall +answer
naver.com. 0 IN TXT "google-site-verification=fK9dDFcEOeNM2Wr3xzNAN-XLcerfAGpOABdSYiqw4_s"
naver.com. 0 IN TXT "google-site-verification=B_dAfnJNNK2GwYDLRl2bdAGtfiyqMjEddjUeDI1Z6sk"
naver.com. 0 IN TXT "facebook-domain-verification=0qyhf0qnkiuqfx4owhfuvwvsvjz8fk"
naver.com. 0 IN TXT "v=spf1 ip4:111.91.135.0/27 ip4:125.209.208.0/20 ip4:125.209.224.0/19 ip4:210.89.163.112 ip4:210.89.173.104/29 ip4:117.52.140.128/26 ip4:114.111.35.0/24 ~all"
MX
record. dig
는 기본적으로 mx
option에 A
record도 함께 구해서 A
record도 나온다.$ dig naver.com mx +noall +answer
naver.com. 0 IN MX 10 mx2.naver.com.
naver.com. 0 IN MX 10 mx3.naver.com.
naver.com. 0 IN MX 10 mx1.naver.com.
mx1.naver.com. 0 IN A 125.209.238.100
mx3.naver.com. 0 IN A 125.209.222.14
NS
record. dig
는 기본적으로 ns
option에 A
record도 함께 구해서 A
record도 나온다.$ dig naver.com ns +noall +answer
naver.com. 0 IN NS ns1.naver.com.
naver.com. 0 IN NS ns2.naver.com.
ns1.naver.com. 0 IN A 125.209.248.6
ns2.naver.com. 0 IN A 125.209.249.6
any
를 사용하면 모든 record에 대해 query하나... 보통 잘 안되었었다. 참고만 하자. 여기선 구글 DNS에 했었다.$ dig naver.com any @8.8.8.8 +noall +answer
naver.com. 300 IN SOA ns1.naver.com. webmaster.naver.com. 2023122202 21600 1800 1209600 180
$ dig naver.com +trace
; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> naver.com +trace
;; global options: +cmd
. 26616 IN NS m.root-servers.net.
. 26616 IN NS k.root-servers.net.
. 26616 IN NS a.root-servers.net.
. 26616 IN NS l.root-servers.net.
. 26616 IN NS c.root-servers.net.
. 26616 IN NS e.root-servers.net.
. 26616 IN NS i.root-servers.net.
. 26616 IN NS f.root-servers.net.
. 26616 IN NS g.root-servers.net.
. 26616 IN NS j.root-servers.net.
. 26616 IN NS d.root-servers.net.
. 26616 IN NS h.root-servers.net.
. 26616 IN NS b.root-servers.net.
;; Received 239 bytes from 172.31.112.1#53(172.31.112.1) in 840 ms
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 86400 IN DS 19718 13 2 8ACBB0CD28F41250A80A491389424D341522D946B0DA0C0291F2D3D7 71D7805A
com. 86400 IN RRSIG DS 8 1 86400 20240106050000 20231224040000 46780 . K7v0WLh24BoHWiyjcnla4A99u2i/B4GETN5NE7VsW9NpCJeGSvGAf6KR DB0I9ck/bKy1JyhYtmcNQNkSE7DyVFC3gQjQYg5POEUgaBJV29hXkLLR 0U0cR23/R18b0LpU9d87IJheNnJZ4NdS4jMLbHrRRPidJguRva2CU1VN YOjql4COLBJGLlMU9Fou7Z3rcmF4xllhpO0YeNtM8zbVA7X6TYsqzarn 4MrSe7sOunOABroWhlv7QNhHf2caroPyptY7Tq9VINo91zIOCsr+N2Jf oMI474kyIChZ3PCRe/Bay5/Tz2/yjR12Oa2jsLBz/m30/FaSOkP7O7J+ PsMzcg==
;; Received 1169 bytes from 198.41.0.4#53(a.root-servers.net) in 160 ms
naver.com. 172800 IN NS ns2.naver.com.
naver.com. 172800 IN NS ns1.naver.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q2D6NI4I7EQH8NA30NS61O48UL8G5 NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 13 2 86400 20231228052622 20231221041622 46171 com. jqSGQcIBEjH5plj8g3ATEJ39VM/6bW9ZN/WGijWTKi81WHvD2kJmYdut n1HliJGobHlEl9Fr7BikGkyMGDMbzA==
6P7FD8SGD365VHS64T9JP8JJUE923LQU.com. 86400 IN NSEC3 1 1 0 - 6P7FK9H7FKOBH1QD5SBOQG73NLG5953V NS DS RRSIG
6P7FD8SGD365VHS64T9JP8JJUE923LQU.com. 86400 IN RRSIG NSEC3 13 2 86400 20231230074725 20231223063725 46171 com. lq7iFpE/hVIRV++Kf913ezFUdB4h3MJdEWFpiKueIMO9lFxzjwCt7QQq 338iUtG2o4WZmaWtMygMOyEhGSPXVA==
;; Received 463 bytes from 192.54.112.30#53(h.gtld-servers.net) in 140 ms
naver.com. 300 IN A 223.130.200.104
naver.com. 300 IN A 223.130.200.107
naver.com. 300 IN A 223.130.195.200
naver.com. 300 IN A 223.130.195.95
;; Received 102 bytes from 125.209.248.6#53(ns1.naver.com) in 10 ms
-x
를 사용하면 reverse query가 가능하다.
다만 보통 우리가 query를 한 주소가지고 reverse query를 던지면 dns server이 보통 나온다. 클라우드플레어가 나오는 경우도 자주 있다.
예시는 cloudflare에서 제공하는 DNS server, one.one.one.one에 대한 reverse query다.
$ dig -x 1.1.1.1 +noall +answer
1.1.1.1.in-addr.arpa. 0 IN PTR one.one.one.one.
-f
옆에다가 해당되는 파일을 넣으면 된다.(domain.txt 내용물)
naver.com
daum.net
twitch.tv
$ dig -f domain.txt +short
223.130.200.107
223.130.195.200
223.130.195.95
223.130.200.104
121.53.105.193
211.249.220.24
151.101.130.167
151.101.66.167
151.101.2.167
151.101.194.167
dig
가 집어넣는 global option이 cmd
라고 했다. 이것을 바꾸고 싶으면 ~/.digrc
를 바꾸면 된다. 예를들어 해당 파일을 밑의 첫번째처럼 바꾸면 기본 dig
출력물이 그다음과 같이 나온다.+noall +answer
$ dig naver.com
naver.com. 0 IN A 223.130.200.107
naver.com. 0 IN A 223.130.195.200
naver.com. 0 IN A 223.130.195.95
naver.com. 0 IN A 223.130.200.104