Cómo usar el comando dig (ejemplos)

El comando unix dig (domain information groper), con el permiso de nslookup, es una de las mejores opciones a la hora de hacer troubleshooting o debug de problemas DNS. Vamos a ver unos cuantos ejemplos de algunas las posibilidades que nos ofrece. Como siempre toda esta información la podéis ampliar en la página man del comando o la ayuda:

$ man dig
$ dig -h

Nota: he suprimido salida no relevante de los comandos para reducir el tamaño del artículo.

Ejecución sin argumentos

Cuando ejecutamos el comando dig sin argumentos se realiza una consulta de los NS (Name Servers) raíz o root servers «.». Cara al troubleshooting o debug no suele ser de mucha utilidad:

$ dig ; <<>> DiG 9.8.1-P1 <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55735
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 14

;; QUESTION SECTION:
;. IN NS

;; ANSWER SECTION:
.			494084	IN	NS	e.root-servers.net.
.			494084	IN	NS	a.root-servers.net.
.			494084	IN	NS	b.root-servers.net.
.			494084	IN	NS	g.root-servers.net.
.			494084	IN	NS	h.root-servers.net.
.			494084	IN	NS	i.root-servers.net.
...
...
;; ADDITIONAL SECTION:
j.root-servers.net. 575975 IN A 192.58.128.30
m.root-servers.net. 428374 IN A 202.12.27.33
...
...
;; Query time: 40 msec

Dominio como argumento

La forma más común y simple de ejecutar dig. En este caso pasamos como argumento el dominio a consultar. Cuando no se especifica nada se consulta siempre el registro A del dominio. Al no especificar tampoco los servidores DNS contra los que hacer la consulta se utilizan los especificados en nuestra conexión (/etc/resolv.conf). Debemos prestar especial importancia a la sección ANSWER SECTION, ya que muestra el resultado de nuestra consulta:

$ dig rm-rf.es

; <<>> DiG 9.8.1-P1 <<>> rm-rf.es
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10364
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;rm-rf.es. IN A

;; ANSWER SECTION:
rm-rf.es. 13104 IN A 93.93.112.55 
;; Query time: 39 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
...

Dominio como argumento y usando un name server específico

El comando anterior usaba el DNS local especificado en /etc/resolv.conf (127.0.0.1) para solicitar el registro A del dominio, en este caso vamos a hacer la consulta contra un NS externo, el de google por ejemplo (8.8.8.8). Se indica con la IP/nombre del servidor precedida de @. Se puede ver en la sección final como se especifica el servidor que utilizamos para la query (negrita). La respuesta debería ser la misma que los servidores autoritativos del dominio, en caso contrario podría haber envenenamiento DNS, DNS spoofing…:

$ dig @8.8.8.8 rm-rf.es 
; <<>> DiG 9.8.1-P1 <<>> @8.8.8.8 rm-rf.es
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29315
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;rm-rf.es. IN A

;; ANSWER SECTION:
rm-rf.es. 4315 IN A 93.93.112.55

;; Query time: 64 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) ...

Especificar el registro (A, NS, MX, CNAME…) a consultar

Como decía antes, por defecto se consulta el registro A del dominio, pero podemos especificar el tipo de registro que queramos (ANY, NS, A, MX, SIG,SOA…):

$ dig MX @8.8.8.8 rm-rf.es 
; <<>> DiG 9.8.1-P1 <<>> MX @8.8.8.8 rm-rf.es
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43941
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;rm-rf.es. IN MX

;; ANSWER SECTION:
rm-rf.es. 14400 IN MX 10 rm-rf.es. 
;; Query time: 105 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Sep 10 23:06:25 2012
;; MSG SIZE rcvd: 42
$ dig NS @8.8.8.8 rm-rf.es 
; <<>> DiG 9.8.1-P1 <<>> NS @8.8.8.8 rm-rf.es
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54663
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;rm-rf.es. IN NS

;; ANSWER SECTION:
rm-rf.es. 14400 IN NS dns2.sistema-dns.com. rm-rf.es. 14400 IN NS dns1.sistema-dns.com. 
;; Query time: 105 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Sep 10 23:06:57 2012
;; MSG SIZE rcvd: 79

Consultar todos los registros de la zona DNS

En lugar de especificar el tipo de registro a mostrar (A, MX, CNAME, AAAA…) podemos decir directamente que consulte todos los que se sirven en la zona DNS del dominio con el parámetero ANY:

$ dig ANY google.com 
; <<>> DiG 9.8.1-P1 <<>> ANY google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13347
;; flags: qr rd ra; QUERY: 1, ANSWER: 22, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;google.com. IN ANY

;; ANSWER SECTION:
google.com. 2778 IN TXT "v=spf1 include:_netblocks.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all"
google.com. 258 IN A 173.194.34.225
google.com. 258 IN A 173.194.34.230
google.com. 258 IN A 173.194.34.224
...
...
google.com. 258 IN A 173.194.34.229
google.com. 32168 IN NS ns4.google.com.
google.com. 32168 IN NS ns1.google.com.
google.com. 32168 IN NS ns3.google.com.
google.com. 32168 IN NS ns2.google.com.
google.com. 56 IN AAAA 2a00:1450:4003:802::1007
google.com. 326 IN MX 20 alt1.aspmx.l.google.com.
google.com. 326 IN MX 30 alt2.aspmx.l.google.com.
google.com. 326 IN MX 50 alt4.aspmx.l.google.com.
google.com. 326 IN MX 40 alt3.aspmx.l.google.com.
google.com. 326 IN MX 10 aspmx.l.google.com.

;; Query time: 43 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)

Hacer debug con el parámetro trace

El parámetro «+trace» es muy útil para hacer debug ante problemas de resolución DNS ya que permite ver la traza y saltos de la petición hasta que llega al servidor autoritativo que ofrece la respuesta del registro:

$ dig +trace rm-rf.es 
; <<>> DiG 9.8.1-P1 <<>> +trace rm-rf.es
;; global options: +cmd
.			103105	IN	NS	f.root-servers.net.
.			103105	IN	NS	g.root-servers.net.
.			103105	IN	NS	h.root-servers.net.
...
...
.			103105	IN	NS	e.root-servers.net.
;; Received 500 bytes from 127.0.0.1#53(127.0.0.1) in 523 ms

es.			172800	IN	NS	a.nic.es.
es.			172800	IN	NS	f.nic.es.
es.			172800	IN	NS	ns1.cesca.es.
es.			172800	IN	NS	ns3.nic.fr.
es.			172800	IN	NS	ns15.communitydns.net.
es.			172800	IN	NS	ns-ext.nic.cl.
es.			172800	IN	NS	sns-pb.isc.org.
;; Received 454 bytes from 192.203.230.10#53(192.203.230.10) in 490 ms

rm-rf.es.		86400	IN	NS	dns2.sistema-dns.com.
rm-rf.es.		86400	IN	NS	dns1.sistema-dns.com.
;; Received 79 bytes from 84.88.0.3#53(84.88.0.3) in 145 ms

rm-rf.es.		14400	IN	A	93.93.112.55
rm-rf.es.		14400	IN	NS	dns2.sistema-dns.com.
rm-rf.es.		14400	IN	NS	dns1.sistema-dns.com.
;; Received 127 bytes from 93.93.118.80#53(93.93.118.80) in 47 ms

Resolución inversa (IP -> nombre)

Para realizar consultas de reverse DNS tenemos el parámetro -x:

$ dig -x 8.8.8.8 
; <<>> DiG 9.8.1-P1 <<>> -x 8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51972
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;8.8.8.8.in-addr.arpa. IN PTR

;; ANSWER SECTION:
8.8.8.8.in-addr.arpa. 70159 IN PTR google-public-dns-a.google.com. 
...

Otras opciones de consulta

Para ver el resto de opciones de consulta es mejor directamente revisar la página man, básicamente nos permiden indicar como se va a visualizar el resultado de la consulta (eliminar información secundaria por ejemplo con la opción +nocmd), establecer timeouts, especificar el uso de TCP o UDP, flags de consulta, etc. Todas llevan el signo + delante, y se resetean con añadiendo «no» después del «+»

$ man dig
       +[no]tcp
           Use [do not use] TCP when querying name servers. The default behavior is to use UDP unless an AXFR or IXFR query is requested,
           in which case a TCP connection is used.

       +[no]vc
           Use [do not use] TCP when querying name servers. This alternate syntax to +[no]tcp is provided for backwards compatibility. The
           "vc" stands for "virtual circuit".

       +[no]ignore
           Ignore truncation in UDP responses instead of retrying with TCP. By default, TCP retries are performed.

       +domain=somename
           Set the search list to contain the single domain somename, as if specified in a domain directive in /etc/resolv.conf, and
           enable search list processing as if the +search option were given.

       +[no]search
           Use [do not use] the search list defined by the searchlist or domain directive in resolv.conf (if any). The search list is not
           used by default.

       +[no]showsearch
           Perform [do not perform] a search showing intermediate results.

       +[no]defname
           Deprecated, treated as a synonym for +[no]search

       +[no]aaonly
           Sets the "aa" flag in the query.

       +[no]aaflag
           A synonym for +[no]aaonly.
...
...
...
...

Con estos ejemplos e información ya podemos comenzar a hacer un buen uso del comando dig para resolver problemas relacionados con DNS.

3 comentarios en “Cómo usar el comando dig (ejemplos)

  1. A qué te refieres con estos tipos de registro, podrías indicar lo que significan estas siglas?

    «Especificar el registro (A, NS, MX, CNAME)
    registro que queramos (ANY, NS, A, MX, SIG,SO)»

    gracias y muy buen post!

Comments are closed.