# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

¿Por qué ‘dig +trace’ resuelve y ‘dig’ a secas no?


Analizando un problema de resolución DNS esta tarde he detectado algo que me ha parecido curioso. El dominio en cuestión no resolvía utilizando un determinado servidor DNS. Voy a enseñaros el ejemplo con un servidor DNS ficticio “10.0.0.115″ y un nombre de dominio “test.com”:

$ dig @10.0.0.115 test.com

; <<>> DiG 9.7.3 <<>> @10.0.0.115 test.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 57041
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

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

 ;; Query time: 214 msec
 ;; SERVER: 10.0.0.115#53(10.0.0.115)
 ;; WHEN: Wed Nov 30 18:00:33 2011
 ;; MSG SIZE  rcvd: 32

Vemos efectivamente que recibimos un SERVFAIL y no hay respuesta del registro A del dominio. El paso siguiente es hacer debug y sacar la traza con +trace para ver todos los saltos y encontrar donde está el problema:

$ dig +trace  @10.0.0.115 test.com

; <<>> DiG 9.7.3 <<>> +trace @10.0.0.115 test.com
; (1 server found)
;; global options: +cmd
.            72650    IN    NS    e.root-servers.net.
.            72650    IN    NS    f.root-servers.net.
.            72650    IN    NS    g.root-servers.net.
.            72650    IN    NS    h.root-servers.net.
.            72650    IN    NS    i.root-servers.net.
.            72650    IN    NS    j.root-servers.net.
.            72650    IN    NS    k.root-servers.net.
.            72650    IN    NS    l.root-servers.net.
.            72650    IN    NS    m.root-servers.net.
.            72650    IN    NS    a.root-servers.net.
.            72650    IN    NS    b.root-servers.net.
.            72650    IN    NS    c.root-servers.net.
.            72650    IN    NS    d.root-servers.net.
;; Received 364 bytes from 10.0.0.115#53(10.0.0.115) in 213 ms

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

test.com.        172800    IN    NS    ns1.servidordns.com.
test.com.        172800    IN    NS    ns2.servidordns.com.
;; Received 117 bytes from 192.48.79.30#53(j.gtld-servers.net) in 341 ms

test.com. 14400 IN A 93.93.108.200
test.com.        86400    IN    NS    ns2.servidordns.com.
test.com.        86400    IN    NS    ns1.servidordns.com.
;; Received 101 bytes from 93.93.108.58#53(ns2.servidordns.com) in 212 ms

Curiosamente, al ejecutar el dig +trace sí que ha llegado al servidor DNS autoritativo y recibido respuesta del registro A. ¿Por qué? Esto es debido a que dig +trace no utiliza la caché del servidor DNS que estamos utilizando. En caso de que esta caché sea incorrecta nos encontraríamos con esta situación.

La solución pasa por reiniciar el servidor DNS que tiene la entrada incorrecta o esperar a que expire el TTL y automáticmaente se actualicen los registros de la zona DNS.

Telefónica bloquea el acceso a sus DNS desde redes externas


En las últimas semanas se estaba empezando a detectar fallos cuando se utilizaban los DNS de Telefónica en redes externas. Esto solía pasar de forma esporádica pero al parecer el bloqueo se va a hacer oficial en poco tiempo. Las IPs de servidores DNS de telefónica son:

  1. 80.58.61.250
  2. 80.58.61.254
  3. 80.58.0.33
  4. 80.58.32.97
  5. 80.58.32.33
  6. 80.58.0.97

El origen de esta restricción es debido a ataques recibidos en sus DNS, flood de paquetes, DDoS, etc. El comunicado oficial es el siguiente:

En el entorno de Telefónica se han producido situaciones de ataque a los DNS que últimamente se han agravado. Los servidores DNS han sido inundado por paquetes o peticiones de resolución, hasta el punto de dejarlos inutilizados. Esto obliga a Telefónica a tomar medidas para salvaguardar la integridad de sus servicios de Internet. Por ello, y para la seguridad del Servicio Internet, se va a proceder a cerrar progresivamente el acceso desde Internet a los diferentes servidores de DNS de Telefónica que a día de hoy están accesibles desde fuera de nuestra red.

Esta medida de seguridad se produce para maximizar la protección de los mismos, dado que Telefonica considera que el servicio DNS propio no debe de estar accesible de forma abierta desde Internet por ser un “servicio de ayuda a la navegación” para los usuarios conectados a nuestra red, y por lo tanto, cada Operador debe disponer de su propio sistema de traducción DNS. Por ello, si está Vd utilizando esta facilidad que ahora mismo está en la Internet pública, proceda a proporcionar un medio de traducción DNS alternativo a los clientes finales que sigan utilizando a día de hoy los DNS de Telefónica. Progresivamente y a partir del 8 de agosto, procederemos a establecer los filtrados de tráfico de entrada a nuestra red con destino a los DNS caches de Telefónica.

Así que ya sabéis. Si usáis estos DNS en entornos de producción deberíais cambiarlos de forma inmediata, utilizar los de otro proveedor, o crear un servidor DNS local para evitar dependencias con otros proveedores.

Windows Server 2003: no funciona la resolución DNS


Parece ser que es un problema bastante común pero que a mi personalmente me ha dado algún que otro dolor de cabeza. El fallo consiste en que en Windows 2003 Server no funciona la resolución de nombres DNS, por lo que no podemos navegar de forma correcta, realizar actualizaciones, etc.

Pero el fallo realmente está localizado en la instalaciónes realizadas a través de una imagen del sistema, clon, etc. En mi situación el problema se reproducía con una imagen de Altiris HP Deployment Server. Los sintomas son los siguientes:

  • Hay conectividad a redes públicas (ping 8.8.8.8) pero no resolución DNS (ping google.com).
  • La resolución de nombres a través de nslookup funciona correctamente.
  • Tampoco funciona la resolución DNS añadiendo los dominios al fichero hosts (en \Windows\system32\drivers\etc\).

El problema tiene su origen en que al restaurar estas imágenes se borra una entrada del registro de Windows, la culpable de estos errores. El valor del registro se encuentra en:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

La solución pasa por revisar que exista la entrada “Domain” del tipo REG_SZ:

Windows regedit

Si no existe, creadla. En cuanto la creéis la resolución DNS debería volver a funcionar de forma instantanea, sin necesidad de reinicio. Hay casos en los que también hay que recrear la entrada “NV Domain” o “NV Hostname”, cuyo valor es el hostname de la máquina. En mi caso únicamente fue necesario regenerar la variable “Domain” para que todo funcionara bien.

MySQL: resolución de nombres (DNS) y problemas con conexiones remotas


Durante un rato, hoy me ha traído de cabeza un problema con un servidor MySQL en el que se estaban encolando todas las conexiones, las cuales no llegaban a conectar y se bloqueaban del siguiente modo:

| 64 | unauthenticated user | 10.0.3.17:37723 |               | Connect |      | login |                  |
| 65 | unauthenticated user | 10.0.3.6:45973  |               | Connect |      | login |                  |
| 66 | unauthenticated user | 10.0.3.6:45974  |               | Connect |      | login |                  |
| 67 | unauthenticated user | 10.0.3.6:45975  |               | Connect |      | login |                  |
| 68 | unauthenticated user | 10.0.3.6:45976  |               | Connect |      | login |                  |
| 69 | unauthenticated user | 10.0.3.6:45977  |               | Connect |      | login |                  |
| 70 | unauthenticated user | 10.0.3.6:45978  |               | Connect |      | login |                  |
| 71 | unauthenticated user | 10.0.3.6:45979  |               | Connect |      | login |                  |
| 72 | unauthenticated user | 10.0.3.6:45980  |               | Connect |      | login |                  |
| 73 | unauthenticated user | 10.0.3.6:45981  |               | Connect |      | login |                  |

En el momento que he verificado que el problema surgía únicamente con las conexiones remotas he comenzado a revisar las distintas posibilidades, entre las que se encontraba por ejemplo revisar que los usuarios MySQL estuvieran correctamente configurados, que no hubiera problemas en las bases de datos, etc. Pero realmente el problema surgía mucho antes, en el momento en el que se establecía la conexión, antes de siquiera pedir credenciales.

En este caso el problema radicaba en que los servidores DNS configurados para la máquina (en /etc/resolv.conf) no funcionaban correctamente e impedían a MySQL resolver los hosts remotos que intentaban conectar. MySQL siempre que recibe una conexión remota vía IP intenta revisar a que nombre resuelve para posteriormente hacer el paso contrario y verificar/comparar que el host también resuelve a dicha IP original. El servidor no pasaba de aquí y generaba el cuello de botella.

Si queremos evitar que esto suceda una de dos, o nos aseguramos que los servidores DNS resuelven rápida y correctamente o deshabilitamos la resolución de nombres con –skip-name-resolve, en este caso únicamente podremos usar IPs y no hosts en la tabla de privilegios.

Hacer que /etc/resolv.conf utilice el DNS secundario o balancee carga


En el fichero /etc/resolv.conf se especifican los servidores DNS que utiliza el sistema para la resolución de nombres. Normalmente se ponen más de uno para que en caso de que el principal falle el siguiente tome el control y se evite la ralentización del sistema, no poder entrar por SSH, etc.

La configuración sería algo así:

nameserver 8.8.8.8
nameserver 8.8.4.4

En este caso si 8.8.8.8 falla la resolución se realizará a través de 8.8.4.4. El problema es que por defecto el valor de tiempo de espera (TIMEOUT) asignado es bastante alto, creo recordar que 5 segundos, por lo que tardará un tiempo en detectar que tiene que utilizar el segundo DNS y todo irá muy lento. Para solucionarlo, tenemos que usar la directiva “options” y modificar el timeout, podemos poner 1 segundo:

nameserver 8.8.8.8
nameserver 8.8.4.4
options timeout:1

Otra opción también interesante es “rotate”, que permite distribuir la carga entre todos los servidores listados y evitar que todas las peticiones vayan siempre al primero:

nameserver 8.8.8.8
nameserver 8.8.4.4
options timeout:1 rotate attempts:1

Configurando estas opciones aseguramos que en caso del fallo del servidor DNS principal el rendimiento de la máquina  no se degrade. Podéis observar más directivas en la página man correspondiente:

$ man resolv.conf

Regenerar fichero named.conf en servidores con cPanel


Pese a que no es habitual, puede que en algún momento necesitéis regenerar el fichero de configuración de named (named.conf). En mi caso no era por borrado accidental del fichero sino porque necesitaba actualizarlo tras una migración en masa de zonas DNS (necesitaba que se incluyeran en el named.conf).

Bien, cPanel pone a nuestra disposición un script que regenera el fichero named.conf a partir de las zonas DNS alojadas en /var/named/. El script a ejecutar es “/scripts/rebuilddnsconfig“.

# /scripts/rebuilddnsconfig

Una vez ejecutado debería haberse regenerado correctamente. Es posible que haya alguna incongruencia, en ese caso os mostraría los errores por pantalla. Ejemplo:

Named could not be restarted, any obvious config errors should show up below this line.
WARNING: /etc/named.conf appears to contain errors which could not be corrected automatically!
/etc/named.conf:6552: zone 'xxxx.com': already exists previous definition: /etc/named.conf:4980
/etc/named.conf:6558: zone 'xxxx.biz': already exists previous definition: /etc/named.conf:2590
Please correct these errors manually and rerun /scripts/fixrndc

En ese caso tenemos llamadas a unas zonas duplicadas. Simplemente eliminamos la llamada duplicada y ejecutaríamos “/scripts/fixrndc” para levantar de nuevo named una vez solucionados los errores:

# /scripts/fixrndc

Comprobar resolución inversa desde línea de comandos (Linux y Windows)


Comprobar la resolución de DNS inversa significa verificar el hostname al que resuelve una IP determinada (como sabréis normalmente se busca lo contrario).

Resolución inversa (reverse DNS) en Unix/Linux

Para verificar la resolución inversa en Linux utilizaremos el comando “host”:

# host ip

Ejemplos:

Google:

# host 66.102.9.105
105.9.102.66.in-addr.arpa domain name pointer lm-in-f105.1e100.net.

Telefónica:

# host 80.58.0.33
33.0.58.80.in-addr.arpa domain name pointer 33.Red-80-58-0.staticIP.rima-tde.net.

Resolución inversa (reverse DNS) en Windows

Para windows utilizaremos el comando nslookup, que realmente también podríamos utilizar en Unix. El proceso es el siguiente:

Google:

# nslookup 66.102.9.105
Server:         208.67.222.222
Address:        208.67.222.222#53

Non-authoritative answer:
105.9.102.66.in-addr.arpa       name = lm-in-f105.1e100.net.

Telefónica:

 nslookup 80.58.0.33
Server:         208.67.222.222
Address:        208.67.222.222#53

Non-authoritative answer:
33.0.58.80.in-addr.arpa name = 33.Red-80-58-0.staticIP.rima-tde.net.

En NixCraft encontraréis unas cuantas formas más de hacerlo.

Bind + DNSSEC: has CNAME and other data (invalid)


Hoy realizando el firmado de unas zonas en un servidor DNS montado con Bind + Dnssec recibía el siguiente error en la zona de un dominio al firmarla con zonesigner:

xxxx.xx has CNAME and other data (invalid)

El problema residía en que el dominio tenía declarado un registro CNAME Wildcard y después otro con un subdominio hacia el mismo destino:

midominio.com.  IN      CNAME   test.com.
*            IN      CNAME   test.com.

Para solucionarlo eliminamos el registro que genera la duplicación y quedaría solucionado:

*                    IN      CNAME   test.com.

El fallo también puede surgir si hay un registro CNAME y alguno de otro tipo dentro de la misma zona:

www         IN      A   192.168.0.11
www         IN      CNAME   test.com.

Para solucionarlo tendríamos que eliminar uno de los dos.