“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..”
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 😉
Espero les sirva…
Interesante articulo, pero cual es el objetivo? separar administrativamente los dominios? o solo tenian miedo de tener todos los dominios en una solo instancia? y hablando de DNS sabes de alguna herramienta para hacer pruebas de stress?
Saludos
Realmente es un caso raro en la industria, generalmente utilizan una instancia de bind por servidor. Aunque como ejemplo demostrativo, nos deja ver como funciona bind en las entrañas.
Algunas herramientas de stress o performance test que utilizo son:
–dnsperf
http://linux.die.net/man/1/dnsperf
–JMeter
http://jmeter-plugins.org/wiki/dns_test_using_jmeter/
También googleando un poco puedes encontrar algunas interesantes alternativas.
Espero te sirva.
Saludos!