Linux command - dig

sycho·2023년 12월 24일
0

Linux Commands

목록 보기
18/30

dig

  • documentation

  • Domain Information Groper의 약자다. DNS name server과의 상호작용에 사용되며, DNS query를 통해 name server에서 오는 답변이 뭔지를 파악하는게 가능하다. 혹시 DNS가 뭔지 잘 모른다면 이 글 참고

  • 이 query-reply를 기반으로 네트워크 관리자들이 DNS 관련 문제들을 해결하기 위해 사용된다. 가장 흔한 경우는 본인이 운영하는 서버 관련 정보를 DNS query를 할 때 잘 전달이 되고 있는지를 확인한다.(...) 또 그냥 특정 host name에 대한 ip주소나 그 반대가 필요한 경우에도 사용한다. TLD name server ip 주소라든가.

  • 이전의 nslookuphost라는 command를 대체하기 위해 등장했다. nslookup은 DNS name server 내용물 분석에 사용되었었고, host는 ip주소에 따른 host name, 혹은 그 반대를 구하는데 사용되었는데 dig는 이를 둘 다 처리해준다.

  • Ubuntu 22.03 기준 기본으로 설치가 되어 있다. 없는 경우 다음 시도

$ sudo apt-get install dnsutils

basic

  • 기본은 명령어 형태로 query를 받으며, 형식은 다음과 같다.
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.comA 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을 쓰자.

  • 위에는 안 나와있지만 AUTHORITYADDITIONAL에 해당하는 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를 사용하면 된다.

options

  • 단순히 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영역만 기본 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

query with specific name server

  • 앞에 소개를 했지만, 특정 name server에 query를 하고 싶으면 다음과 같이 해야 한다.
$ 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

quey specific record

  • 각 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

trace query path (+trace)

  • DNS query가 어느 경로를 거쳤는지를 확인하는데 사용된다. 밑에 보면 먼저 ISP에서 제공하는 DNS 주소로 간다음, 거기에 없어서 대신 root name server정보를 받고 거기에 간 다음, 거기에 없어서 TLD name server 정보를 받고 거기에 간 다음, 거기에 없어서 authoritative name server 정보를 받고 거기에 간 다음에 최종적으로 실제 ip주소를 가진 server에 갔음을 볼 수 있다. (...)
$ 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

Reverse DNS query (-x)

  • -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.

Batch Query (-f)

  • 파일에 있는 주소들에 대해 DNS query를 하는 것도 가능하다. -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

edit default global option

  • 앞에서 기본적으로 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
profile
CS 학부생, 핵심 관심 분야 : Embed/System/Architecture/SWE

0개의 댓글