1354036998418742

“Qué camino debo tomar?” – preguntó Alicia

-“A donde quieres ir?” – respondió el gato de Cheshire

“No lo sé.” – contestó Alicia

-“Entonces..” – dijo el Gato – “…no importa que camino tomes.”

“..Siempre que llegue a alguna parte” – añadió Alicia como explicación

-“¡Oh, siempre llegarás a alguna parte!” – aseguró el Gato -“, si caminas lo suficiente..”

Alicia en el país de las MaravillasLewis Carroll

Hace algunos días me llego una solicitud de apoyo en un caso de un cliente, donde un compañero preguntaba:

Case 01438xxx: can multiple named run on one node?

Hi List,

My customer has a question that multiple named can run on one node or
not. Does anyone have any information about this?

Here is an original message.
----------------------------------------------------------------------
Description of problem:
 Recently DNS transactions which come into the customer's production system 
 are increasing more and more.
 And It becomes difficult that one named on a node handles all transactions.
 So, the customer wants to run multiple named on one node and wants to 
 balance load of transactions without additional physical equipment.

 Could you answer us the following questions from the customer?
 - Is "running multiple named on one node" supported?
 If you have, could you tell us know-how about running multiple named 
 on one node?

Version-Release number of selected component (if applicable):
 - bind-9.3.6-25.P1.el5_11.2 (RHEL5)
----------------------------------------------------------------------

El problema en sí, conforme a mi experiencia, era una falta de tuning de bind (el software que implementa el protocolo de DNS, comúnmente conocido por su daemon named), y se resolvió de esa manera; pero el tema se me hizo interesante para desarrollar este post 🙂

NOTA: Debido a la complejidad del tema, voy a obviar algunas partes de la configuración, las cuales (si son de su interés) las pueden revisar en una presentación que compartí hace algún tiempo, de un curso que impartí, además de la guía de referencia de configuración del mismo bind.

En un servidor debian (porque luego me #Trollean por sólo ejemplificar con Fedora/CentOS/RHEL 🙂 ) tengo configurado un DNS con el dominio: example-rh.com (el cuál no existe en internet, es sólo para mis pruebas locales):

root@debian:~# ps auxf | grep named | grep -v grep ; netstat -tulpn | grep named
bind 475 0.0 2.0 166580 21264 ? Ssl 17:55 0:00 /usr/sbin/named -f -u bind
tcp  0 0 192.168.122.44:53  0.0.0.0:* LISTEN 475/named 
tcp  0 0 127.0.0.1:53       0.0.0.0:* LISTEN 475/named 
tcp  0 0 127.0.0.1:953      0.0.0.0:* LISTEN 475/named 
tcp6 0 0       ::1:953           :::* LISTEN 475/named 
udp  0 0 192.168.122.44:53  0.0.0.0:*        475/named 
udp  0 0 127.0.0.1:53       0.0.0.0:*        475/named 
root@debian:~# 
root@debian:~# nslookup 
> example-rh.com
Server: 192.168.122.44
Address: 192.168.122.44#53

Name: example-rh.com
Address: 192.168.122.1
> set type=SOA
> example-rh.com
Server: 192.168.122.44
Address: 192.168.122.44#53

example-rh.com
 origin = ns.example-rh.com
 mail addr = root.ns.example-rh.com
 serial = 2015140701
 refresh = 1200
 retry = 3600
 expire = 1209600
 minimum = 3600
> exit

root@debian:~# 

Primeramente, creamos el directorio donde enjaularemos nuestro segundo DNS, con sus correspondientes subdirectorios de configuración:

root@debian:~# mkdir -p /var/named/dns2/{etc,var}
root@debian:~# mkdir -p /var/named/dns2/etc/bind
root@debian:~# mkdir -p /var/named/dns2/var/{named,run}

Copiamos los archivos de configuración de zonas del DNS actual, dentro de la jaula:

root@debian:~# cp /var/named/* /var/named/dns2/var/named/
root@debian:~# ls /var/named/dns2/var/named/
192.168.122.zone db.127 db.empty db.root example-rh.com.zone named.log zones.rfc1918
root@debian:~#

Y modificamos dichos archivos para crear un segundo dominio de resolución [example-deb.com] con su correspondiente resolución inversa [192.168.123]:

root@debian:/var/named/dns2/var/named# mv 192.168.122.zone 192.168.123.zone 
root@debian:/var/named/dns2/var/named# mv example-rh.com.zone example-deb.com.zone
root@debian:/var/named/dns2/var/named# cat example-deb.com.zone
$ORIGIN .
$TTL 1d
example-deb.com IN SOA ns.example-deb.com. root.ns.example-deb.com. (
                              2015150701 ; numero de serie
                                    1200 ; refresh (20 minutos)
                                    3600 ; retry (1 hora)
                                 1209600 ; expire (2 semanas)
                                    3600 ; minimum (1 hora)
                                        )
                       A  192.168.123.1
                       NS ns.example-deb.com.
                       MX 10 mail.example-deb.com.
$ORIGIN example-deb.com.
ns     A     192.168.123.2
mail   A     192.168.123.44
www    CNAME example-deb.com.
centos A     192.168.123.110
test   CNAME centos.example-deb.com.
root@debian:/var/named/dns2/var/named# cat 192.168.123.zone 
$ORIGIN .
$TTL 1d
123.168.192.in-addr.arpa IN SOA ns.example-deb.com. root.ns.example-deb.com. (
                                       2015150701 ; numero de serie
                                             1200 ; refresh (20 minutos)
                                             3600 ; retry (1 hora)
                                          1209600 ; expire (2 semanas)
                                             3600 ; minimum (1 hora)
                                                 )
                              NS ns.example-deb.com.
$ORIGIN 123.168.192.in-addr.arpa.
2    PTR    ns.example-deb.com.
44   PTR    mail.example-deb.com.
110  PTR    centos.example-deb.com.
root@debian:/var/named/dns2/var/named#

Además de los archivos de configuración, con su modificación anteriormente comentada:

root@debian:/var/named/dns2/etc/bind# cp /etc/bind/named.conf .
root@debian:/var/named/dns2/etc/bind# cat named.conf 
options {
 directory "/var/named";
 pid-file "/var/run/named.pid";
};

zone "." {
 type hint;
 file "db.root";
};

zone "0.0.127.in-addr.arpa" {
 type master;
 file "db.127";
};

zone "example-deb.com" {
 type master;
 file "example-deb.com.zone";
};

zone "123.168.192.in-addr.arpa" {
 type master;
 file "192.168.123.zone";
};

include "/var/named/zones.rfc1918";
root@debian:/var/named/dns2/etc#

El directorio donde se encuentran las zonas, y los archivos de configuración deben pertenecer a bind:

root@debian:/var/named/dns2/etc# chown -R bind:bind /var/named/dns2/

Ejecutamos el daemon, indicándole el usuario, el puerto y el directorio enjaulado a utilizar:

root@debian:~# /usr/sbin/named -u bind -p 5353 -t /var/named/dns2

Verificamos que se estén ejecutando ambos DNS:

root@debian:~# ps auxf | grep named | grep -v grep ; netstat -tulpn | grep named
bind 475 0.0 2.0 166060 21276 ? Ssl Jul14 0:00 /usr/sbin/named -f -u bind
bind 1429 0.0 1.4 166320 15308 ? Ssl 00:31 0:00 /usr/sbin/named -u bind -p 5353 -t /var/named/dns2
tcp  0 0 192.168.122.44:53   0.0.0.0:* LISTEN  475/named 
tcp  0 0 127.0.0.1:53        0.0.0.0:* LISTEN  475/named 
tcp  0 0 127.0.0.1:953       0.0.0.0:* LISTEN  475/named 
tcp  0 0 192.168.122.44:5353 0.0.0.0:* LISTEN 1429/named 
tcp  0 0 127.0.0.1:5353      0.0.0.0:* LISTEN 1429/named 
tcp6 0 0       ::1:953            :::* LISTEN  475/named 
udp  0 0 192.168.122.44:53   0.0.0.0:*         475/named 
udp  0 0 127.0.0.1:53        0.0.0.0:*         475/named 
udp  0 0 192.168.122.44:5353 0.0.0.0:*        1429/named 
udp  0 0 127.0.0.1:5353      0.0.0.0:*        1429/named 
root@debian:~#

Y checamos que esté resolviendo correctamente el nuevo dominio:

root@debian:~# nslookup -port=5353
> example-deb.com
Server: 192.168.122.44
Address: 192.168.122.44#5353

Name: example-deb.com
Address: 192.168.123.1
> set type=PTR
> 192.168.123.2
Server: 192.168.122.44
Address: 192.168.122.44#5353

2.123.168.192.in-addr.arpa name = ns.example-deb.com.
> set type=MX
> example-deb.com
Server: 192.168.122.44
Address: 192.168.122.44#5353

example-deb.com mail exchanger = 10 mail.example-deb.com.
> set type=SOA
> example-deb.com
Server: 192.168.122.44
Address: 192.168.122.44#5353

example-deb.com
 origin = ns.example-deb.com
 mail addr = root.ns.example-deb.com
 serial = 2015150701
 refresh = 1200
 retry = 3600
 expire = 1209600
 minimum = 3600
> exit

root@debian:~#

Con esto tendríamos, funcionalmente, dos servidores DNS (con diferentes dominios) trabajando en el mismo servidor, en diferentes puertos.

PLUS: Les comparto una guía rápida de troubleshooting de DNS, que utilizo como referencia para la resolución de mis casos 😉

TroubleshootingDNSErrorMadeEasy-Final

Espero les sirva…