Use dig to Perform Manual DNS Queries

Updated by Linode Written by Linode

Contribute on GitHub

Report an Issue | View File | Edit File

Use dig to Perform Manual DNS Queries

What is dig?

dig is a command line DNS querying utility that allows you to diagnose issues with domain name resolution.

Install dig

dig is part of a collection of DNS utilities often packaged with the Bind DNS server. You can install these utilities by issuing the appropriate command for your Linux distribution.

CentOS

yum install bind-utils

Debian / Ubuntu

apt-get install dnsutils

How to Use dig

Consider the following basic dig output:

  
$ dig example.com

; <<>> DiG 9.6.1 <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11982
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;example.com.               IN      A

;; ANSWER SECTION:
example.com.         86400  IN      A       107.92.2.7

;; Query time: 54 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Aug 24 14: 2010
;; MSG SIZE  rcvd: 57

The query returns a successful result of NOERROR and dig is able to retrieve an A record for the name example.com, which resolves to the IP address 107.92.2.7. dig includes a number of data points regarding the query itself including the DNS resolver used (192.168.1.1), the amount of time required to complete the query, and the size of the query response.

To query for a different kind of DNS record, both of the following commands will produce the same output:

  
$ dig example.com mx
$ dig mx example.com

; <<>> DiG 9.6.1 <<>> mx example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52563
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;example.com.       IN      MX

;; ANSWER SECTION:
example.com. 86400  IN      MX      10 example.com.

;; Query time: 53 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Aug 24 15:14:05 2010
;; MSG SIZE  rcvd: 57

If you attempt to query a domain that doesn’t exist, as is the case with nonextant.example.com, you will see a response that resembles the following:

  
$ dig nonextant.example.com

; <<>> DiG 9.6.1 <<>> nonextant.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 53119
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;nonextant.example.com. IN    A

;; AUTHORITY SECTION:
example.com. 10800  IN      SOA     ns1.linode.com. username.example.com. 2010051349 14400 14400 1209600 86400

;; Query time: 91 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Aug 24 15:19:11 2010
;; MSG SIZE  rcvd: 100

In this example, the query returns the status NXDOMAIN and the SOA or Start of Authority record that describes global values in every authoritative DNS zone. You may also occasionally see records that contain multiple A records. In these cases, multiple hosts are able to respond for a single name. See the following example:

  
$ dig example.com

; <<>> DiG 9.6.1 <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11982
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;example.com.               IN      A

;; ANSWER SECTION:
example.com.         86400  IN      A       107.92.2.7
example.com.         86400  IN      A       107.92.2.9
example.com.         86400  IN      A       107.92.2.13

;; Query time: 54 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Aug 24 14: 2010
;; MSG SIZE  rcvd: 57

Use dig to Trace a DNS Query

With the +trace option, dig will provide output that allows you follow each successive hierarchical step that the query takes:

  
$ dig +trace www.example.com

; <<>> DiG 9.6.1 <<>> +trace www.example.com
;; global options: +cmd
.                       305393  IN      NS      m.root-servers.net.
.                       305393  IN      NS      e.root-servers.net.
.                       305393  IN      NS      f.root-servers.net.
.                       305393  IN      NS      l.root-servers.net.
.                       305393  IN      NS      k.root-servers.net.
.                       305393  IN      NS      c.root-servers.net.
.                       305393  IN      NS      i.root-servers.net.
.                       305393  IN      NS      j.root-servers.net.
.                       305393  IN      NS      g.root-servers.net.
.                       305393  IN      NS      h.root-servers.net.
.                       305393  IN      NS      a.root-servers.net.
.                       305393  IN      NS      b.root-servers.net.
.                       305393  IN      NS      d.root-servers.net.
;; Received 512 bytes from 192.168.1.1#53(192.168.1.1) in 19 ms

com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
com.                    172800  IN      NS      e.gtld-servers.net.
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      h.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      j.gtld-servers.net.
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
;; Received 504 bytes from 202.12.27.33#53(m.root-servers.net) in 109 ms

example.com.        172800  IN      NS      ns1.linode.com.
example.com.        172800  IN      NS      ns2.linode.com.
example.com.        172800  IN      NS      ns3.linode.com.
;; Received 150 bytes from 192.52.178.30#53(k.gtld-servers.net) in 106 ms

www.example.com.     86400  IN      A       107.92.2.7
www.example.com.     86400  IN      NS      ns3.linode.com.
www.example.com.     86400  IN      NS      ns4.linode.com.
www.example.com.     86400  IN      NS      ns5.linode.com.
www.example.com.     86400  IN      NS      ns1.linode.com.
www.example.com.     86400  IN      NS      ns2.linode.com.
;; Received 234 bytes from 65.19.178.10#53(ns2.linode.com) in 96 ms

This example traces a DNS query for the domain www.example.com. This ultimately resolves to the IP address 107.92.2.7. DNS queries start at the end of the domain with the root-level ., and continue from right to left until a DNS server is able to provide an authoritative A record.

DNS traces help you determine if DNS authority has delegated properly and if DNS glue records are leading to an incorrect resolution. DNS traces also provide information on how long queries take to complete and the specific servers that provide intermediate records.

Use dig to Target a Specific DNS Server

Any DNS server can publish records for any domain. However, in normal use, DNS servers are only queried for records that have had authority delegated to them. You can use dig to query arbitrary DNS servers for records that they might not have been delegated authority, as in the following example:

  
$ dig @ns1.linode.com example.com

; <<>> DiG 9.7.1-P2 <<>> @ns1.linode.com example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35939
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 5
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example.com.               IN      A

;; ANSWER SECTION:
example.com.        86400   IN      A       107.92.2.7

;; AUTHORITY SECTION:
example.com.        86400   IN      NS      ns3.linode.com.
example.com.      86400   IN      NS      ns2.linode.com.
example.com.      86400   IN      NS      ns1.linode.com.
example.com.      86400   IN      NS      ns5.linode.com.
example.com.        86400     IN      NS      ns4.linode.com.

;; ADDITIONAL SECTION:
ns1.linode.com.         86400   IN      A       69.93.127.10
ns2.linode.com.         86400   IN      A       65.19.178.10
ns3.linode.com.         86400   IN      A       75.127.96.10
ns4.linode.com.         86400   IN      A       207.192.70.10
ns5.linode.com.         86400   IN      A       109.74.194.10

;; Query time: 55 msec
;; SERVER: 69.93.127.10#53(69.93.127.10)
;; WHEN: Wed Aug 25 11:30:20 2010
;; MSG SIZE  rcvd: 234

Specify the name of the server that you wish to query as an argument to the dig command formatted as @[server], where [server] is the name or address of the IP DNS server.

Use dig to Retrieve Different Record Types

Specify a different type of DNS record by adding that record type (e.g. AAAA, MX, TXT, or SRV) to the dig command. Consider the following example of a query for SRV records:

  
$ dig srv _jabber._tcp.example.com

; <<>> DiG 9.7.1-P2 <<>> srv _jabber._tcp.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33643
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;_jabber._tcp.example.com.      IN      SRV

;; ANSWER SECTION:
_jabber._tcp.example.com. 300   IN      SRV     0 0 5269 hostname.example.com

;; Query time: 53 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Wed Aug 25 12:40:13 2010
;; MSG SIZE  rcvd: 90

Use dig to Generate Condensed Output

Using the +short modifier after the dig command abbreviates the output of dig:

  
$ dig example.com +short
207.192.72.27

You can combine the +short modifier with other dig commands to generate output that may be more useful in scripts as follows:

  
$ dig mx example.com +short
10 mail.example.com.

  
$ dig +trace +short example.com
NS a.root-servers.net. from server 192.168.1.1 in 18 ms.
NS b.root-servers.net. from server 192.168.1.1 in 18 ms.
NS d.root-servers.net. from server 192.168.1.1 in 18 ms.
NS m.root-servers.net. from server 192.168.1.1 in 18 ms.
NS e.root-servers.net. from server 192.168.1.1 in 18 ms.
NS f.root-servers.net. from server 192.168.1.1 in 18 ms.
NS l.root-servers.net. from server 192.168.1.1 in 18 ms.
NS k.root-servers.net. from server 192.168.1.1 in 18 ms.
NS c.root-servers.net. from server 192.168.1.1 in 18 ms.
NS i.root-servers.net. from server 192.168.1.1 in 18 ms.
NS j.root-servers.net. from server 192.168.1.1 in 18 ms.
NS g.root-servers.net. from server 192.168.1.1 in 18 ms.
NS h.root-servers.net. from server 192.168.1.1 in 18 ms.
A 107.92.2.7 from server ns2.linode.com in 94 ms.

  
$ dig soa +short example.com
ns1.linode.com. username.example.com. 2010051349 14400 14400 1209600 86400

  
$ dig @ns2.linode.com ns +short example.com
ns5.linode.com.
ns1.linode.com.
ns2.linode.com.
ns3.linode.com.
ns4.linode.com.

Join our Community

Find answers, ask questions, and help others.

This guide is published under a CC BY-ND 4.0 license.