#4sysadmins

Inicio » GNU/Linux » Servidor DNS dnsmasq con CNAMES

Servidor DNS dnsmasq con CNAMES

Follow #4sysadmins on WordPress.com

Configurar un servidor DNS con dnsmasq es relativamente sencillo pero con frecuencia si no se siguen ciertas pautas, fácilmente va a funcionar de forma errónea y difícilmente te vas a dar cuenta antes de que vengan a darte un toque/aviso de que algo no marcha bien.

Os cuento brevemente un error común:

Imaginad que estáis dentro de una red local, pero no la de tu hogar, si no en la empresa (por ejemplo) y esta cuenta con servidores DNS propios. Te piden que montes un dnsmasq para resolver nombres de algunos pocos hosts que no contarán con los servidores generales. Si no configuras bien dnsmasq, es posible que todas las peticiones para resolver las IP de estos pocos hosts que dependen de tu DNS sean reenviadas a los servidores generales creando una gran cantidad de paquetes innecesarios porque estos no tienen porque conocer los hostname de tus servidores.

Experiencia profesional: me ha pasado esto con una infraestructura de tres servidores en los que se ejecutan un gran número de servicios orientados al BIGDATA y procesamiento de eventos en realtime, lo que genera gran cantidad de consultas DNS. Esta mal configuración terminó por tirar los servidores DNS de la empresa.

Al grano…

Instalación

# apt update && apt install dnsmasq

Configuración

Networking

Anular los DNS secundarios de /etc/network/interfaces en el host que va a hacer de DNS:

# vi /etc/network/interfaces
#si existen las siguientes directivas, eliminarlas o comentarlas
#dns-nameservers 10.128.2.2 10.128.2.3
#dns-search digitalbig.com
# systemctl restart networking

Hostnames a resolver

# vi /etc/hosts
127.0.0.1 localhost
10.0.17.56 ser-bigd-spa-01
# Hostnames a resolver
10.0.17.57 ser-bigd-spa-02
10.0.17.58 ser-bigd-spa-03
10.0.17.59 ser-bigd-spa-04
10.0.17.60 ser-bigd-spa-05
10.0.17.61 ser-bigd-spa-06

DNSMASQ

# vi /etc/dnsmasq.conf
# Configurar servidores DNS (upstreams) para resolver todo aquello que no está en #/etc/hosts. Puedes poner servidores públicos si no cuentas con servidores dentro de la
#organización
server=88.128.33.4
server=88.128.33.5

# Si queremos resolver un host sin dominio, solo se intentará resolver mediante #/etc/hosts. evitará que se haga un forwarding a los servidores upstreams de todos los #nombres sin dominio. 
domain-needed

# Esto a efectos prácticos tiene el mismo comportamiento que la directiva anterior. En #este caso solo se intentará resolver mediante el archivo /etc/resolv.conf y como en #nuestro anchivo solo. tenemos el servidor local "127.0.0.1" será este quien resuelva, y #además al no tener nada entre "/" le estamos diciendo que resuelva aquellos nombres #que van sin ".dominio" es decir, en nuestro caso los hostname de nuestra red local #"ser-bigd-spa-xx"
local=//

# Interfaz que recibirá las querys DNS
interface=ens160

# Los CNAME nos permiten mapear un nombre de servicio (por ejemplo) con un #hostname el cual tiene ya en el archivo /etc/hosts un mapping a una IP. Por tanto si #tenemos un MySQL en en servidor "ser-bigd-spa-02" y queremos conectar a MySQL sin #nombrar el servidor, podremos hacer:
# mysql -u <user> -p -h mysql
# Muy útil cuando cambiamos servicios de un servidor a otro y no queremos modificar #las cadenas de conexión de todos aquellos servicios que dependen de MySQL.
cname=zookeeper01,ser-bigd-spa-01
cname=haproxy01,ser-bigd-spa-05
cname=druidmiddlemanager01,ser-bigd-spa-06
cname=zookeeper02,ser-bigd-spa-02
cname=mongo01,ser-bigd-spa-04
cname=zookeeper03,ser-bigd-spa-03
cname=hdfsnamenode01,ser-bigd-spa-02
cname=druidoverlord01,ser-bigd-spa-03
# systemctl restart dnsmasq

Con esta configuración si por ejemplo tenemos servicios que dependen de Zookeeper, antes su cadena de conexión sería:

ser-bigd-spa-01:2181,ser-bigd-spa-02:2181,ser-bigd-spa-03:2181

Pero ahora podríamos cambiarla por:

zookeeper01:2181,zookeeper02:2181,zookeeper03:2181

De manera que si mañana movemos el zookeeper02 al servidor ser-bigd-spa-04, no tendríamos que modificar todas aquellas cadenas de conexión que depende de Zookeeper, simplemente modificaríamos la relación en el archivo dnsmasq.conf y recargaríamos el servicio.


Deja un comentario, Gracias!