Crear un servidor DNS con Centos 7

Vamos a crear un servidor DNS con Centos 7. Bueno, realmente configuraremos dos servidores, un como maestro y otro con el rol de secundario, utilizando el servicio Bind.
150
Lo cierto es que no tenía planeado crear una entrada de este tipo. Pero lo veo necesario, ya que he tenido que montar un par de servidores DNS, para que así el servidor central que estoy montando con Ansible, pueda realizar las consultas contra estos.

Así que vamos al turrón

Crear un servidor DNS con Centos 7

Antes de empezar, vamos a tener en cuenta que voy a utilizar un entorno, con estas máquinas virtuales:

  1. servdns1.ochobits.local 192.168.0.101
  2. servdns2.ochobits.local 192.168.0.111
  3. raspberrypi.ochobits.local 192.168.0.75

Instalación servidor DNS primario

Empezamos primero con el nodo con el rol de maestro, esto es, el «servdns1»

Instalamos los paquetes de Bind en el servidor:

  1. yum install bind bind-utils -y

Una vez instalados, modificamos el fichero «/etc/named.conf», que en mi caso ha quedado así:

  1. options {
  2.         listen-on port 53 { 127.0.0.1; 192.168.0.101; };
  3.         listen-on-v6 port 53 { ::1; };
  4.         directory       "/var/named";
  5.         dump-file       "/var/named/data/cache_dump.db";
  6.         statistics-file "/var/named/data/named_stats.txt";
  7.         memstatistics-file "/var/named/data/named_mem_stats.txt";
  8.         recursing-file  "/var/named/data/named.recursing";
  9.         secroots-file   "/var/named/data/named.secroots";
  10.         allow-query     { localhost; 192.168.0.0/24;};
  11.         allow-transfer  { localhost; 192.168.0.111; };
  12.  
  13.         recursion yes;
  14.  
  15.         dnssec-enable yes;
  16.         dnssec-validation yes;
  17.  
  18.         /* Path to ISC DLV key */
  19.         bindkeys-file "/etc/named.iscdlv.key";
  20.  
  21.         managed-keys-directory "/var/named/dynamic";
  22.  
  23.         pid-file "/run/named/named.pid";
  24.         session-keyfile "/run/named/session.key";
  25. };
  26.  
  27. logging {
  28.         channel default_debug {
  29.                 file "data/named.run";
  30.                 severity dynamic;
  31.         };
  32. };
  33.  
  34. zone "." IN {
  35.         type hint;
  36.         file "named.ca";
  37. };
  38.  
  39. zone "ochobits.local" IN {
  40. type master;
  41. file "forward.ochobits";
  42. allow-update { none; };
  43. };
  44. zone "0.168.192.in-addr.arpa" IN {
  45. type master;
  46. file "reverse.ochobits";
  47. allow-update { none; };
  48. };
  49.  
  50. include "/etc/named.rfc1912.zones";
  51. include "/etc/named.root.key";

Esto es en mi caso, claro. Debéis adaptar la configuración a vuestras necesidades.

Creación de zonas

Debemos crear las zonas de «forward» y la de «reverse», que mencionamos en el fichero anterior «/etc/named.conf»

Creamos zona de «forward»

Creamos el fichero «forward.ochobits», en el directorio «/var/named», como sigue:

  1. vi /var/named/forward.ochobits

Con este contenido:

  1. $TTL 86400
  2. @   IN  SOA     servdns1.ochobits.local. root.ochobits.local. (
  3.         2011071001  ;Serial
  4.         3600        ;Refresh
  5.         1800        ;Retry
  6.         604800      ;Expire
  7.         86400       ;Minimum TTL
  8. )
  9. @       IN  NS          servdns1.ochobits.local.
  10. @       IN  NS          servdns2.ochobits.local.
  11. @       IN  A           192.168.0.101
  12. @       IN  A           192.168.0.111
  13. @       IN  A           192.168.0.75
  14. servdns1         IN  A   192.168.0.101
  15. servdns2         IN  A   192.168.0.111
  16. raspberrypi      IN  A   192.168.0.75
Creamos zona «reverse»

Creamos el fichero «reverse.ochobits», dentro de la carpeta «/var/named»

  1. vi /var/named/reverse.ochobits

En mi caso, con el contenido:

  1. $TTL 86400
  2. @   IN  SOA     servdns1.ochobits.local. root.ochobits.local. (
  3.         2011071001  ;Serial
  4.         3600        ;Refresh
  5.         1800        ;Retry
  6.         604800      ;Expire
  7.         86400       ;Minimum TTL
  8. )
  9. @       IN  NS          servdns1.ochobits.local.
  10. @       IN  NS          servdns2.ochobits.local.
  11. @       IN  PTR         unixmen.local.
  12. servdns1        IN  A   192.168.0.101
  13. servdns2        IN  A   192.168.0.111
  14. raspberry       IN  A   192.168.0.75
  15. 101     IN  PTR         servdns1.ochobits.local.
  16. 111     IN  PTR         servdns2.ochobits.local.
  17. 75      IN  PTR         raspberrypi.ochobits.local

Añadimos al arranque el servicio Bind y lo encendemos

Utilizamos las siguientes órdenes:

  1. systemctl enable named
  2. systemctl start named

Configuración del cortafuegos

El servicio DNS utiliza el puerto 53, tanto utilizando el protocolo tcp como el udp, tal como sigue:

  1. firewall-cmd --permanent --add-port=53/tcp
  2. firewall-cmd --permanent --add-port=53/udp

Lo reiniciamos para que así se apliquen los cambios:

  1. firewall-cmd --reload

Modificamos permisos de ficheros

Debemos cambiar los permisos de algunos ficheros. Algunos de ellos debido al uso de SELinux

  1. chgrp named -R /var/named
  2. chown -v root:named /etc/named.conf
  3. restorecon -rv /var/named
  4. restorecon /etc/named.conf

Realizar pruebas de funcionamiento

Para comprobar que todo está bien configurado, podemos realizar algunas pruebas.

Por ejemplo, comprobar el fichero de configuración:

  1. named-checkconf /etc/named.conf

Si al ejecutar el comando no nos devuelve ningún error, es que en esta parte todo ha ido bien.

Revisamos la zona del «forward»

  1. [root@servdns1 ~]# named-checkzone ochobits.local /var/named/forward.ochobits
  2. zone ochobits.local/IN: loaded serial 2011071001
  3. OK

Y ahora le toca el turno a la revisión de la zona «reverse»

  1. [root@servdns1 ~]# named-checkzone ochobits.local /var/named/reverse.ochobits
  2. zone ochobits.local/IN: loaded serial 2011071001
  3. OK

Y añadimos el servidor DNS en el fichero de configuración de red, en mi caso:

  1. vi /etc/sysconfig/network-scripts/ifcfg-eth0

Con el contenido:

  1. (...)
  2. ONBOOT=yes
  3. IPADDR=192.168.0.101
  4. PREFIX=24
  5. GATEWAY=192.168.0.1
  6. DNS1=192.168.0.101
  7. (...)

Y añadimos la IP del servidor en el fichero de configuración «/etc/resolv.conf», así:

  1. nameserver      192.168.0.101

Guaramos y salimos del fichero.

Test del servidor DNS

Utilizamos herramientas como ‘nslookup‘ y ‘dig‘, para comprobar si funciona bien el servidos. Si no las tenemos instaladas, podemos realizar esta operación:

  1. yum -y install bind-utils

Y ya podemos realizar las pruebas:

  1. [root@servdns1 ~]# dig servdns1.ochobits.local
  2.  
  3. ; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> servdns1.ochobits.local
  4. ;; global options: +cmd
  5. ;; Got answer:
  6. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47262
  7. ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
  8.  
  9. ;; OPT PSEUDOSECTION:
  10. ; EDNS: version: 0, flags:; udp: 4096
  11. ;; QUESTION SECTION:
  12. ;servdns1.ochobits.local.       IN      A
  13.  
  14. ;; ANSWER SECTION:
  15. servdns1.ochobits.local. 86400  IN      A       192.168.0.101
  16.  
  17. ;; AUTHORITY SECTION:
  18. ochobits.local.         86400   IN      NS      servdns1.ochobits.local.
  19. ochobits.local.         86400   IN      NS      servdns2.ochobits.local.
  20.  
  21. ;; ADDITIONAL SECTION:
  22. servdns2.ochobits.local. 86400  IN      A       192.168.0.111
  23.  
  24. ;; Query time: 1 msec
  25. ;; SERVER: 192.168.0.101#53(192.168.0.101)
  26. ;; WHEN: sáb feb 09 15:36:38 CET 2019
  27. ;; MSG SIZE  rcvd: 121

Y si utilizamos la herramienta ‘nslookup’

  1. [root@servdns1 ~]# nslookup ochobits.local
  2. Server:         192.168.0.101
  3. Address:        192.168.0.101#53
  4.  
  5. Name:   ochobits.local
  6. Address: 192.168.0.101
  7. Name:   ochobits.local
  8. Address: 192.168.0.111
  9. Name:   ochobits.local
  10. Address: 192.168.0.75

Bien, con esto ya tenemos configurado el servidor DNS primario.

Ahora pasemos a configurar el segundo.

Servidor DNS secundario

Ahora nos toca configurar el servidor secundario o esclavo, que en mi caso tiene el nombre de «servdns2.ochobits.local», que tiene la IP asignada «192.168.0.111»

Antes de nada debemos instalar los mismos paquetes que en el primario. Si utilizamos máquinas virtuales, siempre podemos clonar el host primario y solo cambiarle el nombre, la IP y algunas cosas de los ficheros de configuración.

Igualmente realizaremos otra vez los mismos pasos. El primero es instalar Bind.

  1. yum install bind bind-utils -y

Ahora modificamos el fichero de configuración «/etc/named.conf», con la configuración:

  1. options {
  2.         listen-on port 53 { 127.0.0.1; 192.168.0.111; };
  3.         listen-on-v6 port 53 { ::1; };
  4.         directory       "/var/named";
  5.         dump-file       "/var/named/data/cache_dump.db";
  6.         statistics-file "/var/named/data/named_stats.txt";
  7.         memstatistics-file "/var/named/data/named_mem_stats.txt";
  8.         recursing-file  "/var/named/data/named.recursing";
  9.         secroots-file   "/var/named/data/named.secroots";
  10.         allow-query     { localhost; 192.168.0.0/24;};
  11.  
  12.         recursion yes;
  13.  
  14.         dnssec-enable yes;
  15.         dnssec-validation yes;
  16.  
  17.         /* Path to ISC DLV key */
  18.         bindkeys-file "/etc/named.iscdlv.key";
  19.  
  20.         managed-keys-directory "/var/named/dynamic";
  21.  
  22.         pid-file "/run/named/named.pid";
  23.         session-keyfile "/run/named/session.key";
  24. };
  25.  
  26. logging {
  27.         channel default_debug {
  28.                 file "data/named.run";
  29.                 severity dynamic;
  30.         };
  31. };
  32.  
  33. zone "." IN {
  34.         type hint;
  35.         file "named.ca";
  36. };
  37.  
  38. zone "ochobits.local" IN {
  39. type slave;
  40. file "slaves/ochobits.fwd";
  41. masters { 192.168.0.101; };
  42. };
  43. zone "0.168.192.in-addr.arpa" IN {
  44. type slave;
  45. file "slaves/ochobits.rev";
  46. masters { 192.168.0.101; };
  47. };
  48. include "/etc/named.rfc1912.zones";
  49. include "/etc/named.root.key";

Encendemos el servicio bind y lo añadimos al arranque:

  1. systemctl enable named
  2. systemctl start named

Las zonas de «forward» y «reverse» se replican de manera automática desde el servidor maestro, en la carpeta «/var/named/slaves», podemos comprobar que es así, listando el contenido de la carpeta:

  1. [root@servdns2 ~]# ls /var/named/slaves/
  2. ochobits.fwd  ochobits.rev

Modificar configuración de red

Al igual que hicimos con el servidor maestro, modificamos el fichero de configuración de red «/etc/sysconfig/network-scripts/ifcfg/eth0», en el servidor secundario:

  1. (...)
  2. PREFIX=24
  3. GATEWAY=192.168.0.1
  4. DNS1=192.168.0.101
  5. DNS2=192.168.0.111
  6. (...)

También añadimos los datos de los servidores DNS, en el fichero «/etc/resolv.conf»

  1. nameserver 192.168.0.101
  2. nameserver 192.168.0.111

Guardamos y reiniciamos la red.

  1. systemctl restart network

Modificamos la configuración del cortafuegos

Añadimos el puerto 53 al cortafuegos:

  1. firewall-cmd --permanent --add-port=53/tcp
  2. firewall-cmd --reload

Modificamos permisos de ficheros y configuración de SELinux

  1. chgrp named -R /var/named
  2. chown -v root:named /etc/named.conf
  3. restorecon -rv /var/named
  4. restorecon /etc/named.conf

Pruebas de funcionamiento

Hacemos prueba con la herramienta ‘dig’ y ‘nslookup’

  1. ;; OPT PSEUDOSECTION:
  2. ; EDNS: version: 0, flags:; udp: 4096
  3. ;; QUESTION SECTION:
  4. ;servdns1.ochobits.local.       IN      A
  5.  
  6. ;; ANSWER SECTION:
  7. servdns1.ochobits.local. 86400  IN      A       192.168.0.101
  8.  
  9. ;; AUTHORITY SECTION:
  10. ochobits.local.         86400   IN      NS      servdns2.ochobits.local.
  11. ochobits.local.         86400   IN      NS      servdns1.ochobits.local.
  12.  
  13. ;; ADDITIONAL SECTION:
  14. servdns2.ochobits.local. 86400  IN      A       192.168.0.111
  15.  
  16. ;; Query time: 6 msec
  17. ;; SERVER: 192.168.0.101#53(192.168.0.101)
  18. ;; WHEN: sáb feb 09 16:01:08 CET 2019
  19. ;; MSG SIZE  rcvd: 121

Y con ‘nslookup’

  1. Server:         192.168.0.101
  2. Address:        192.168.0.101#53
  3.  
  4. Name:   ochobits.local
  5. Address: 192.168.0.111
  6. Name:   ochobits.local
  7. Address: 192.168.0.75
  8. Name:   ochobits.local
  9. Address: 192.168.0.101

Y con esto ya tenemos nuestros servidores DNS con Bind configurados.

Espero que alguna ocasión os sea de utilidad.

Fuentes consultadas:

Unixmen.com – Setting Up DNS Server On CentOS 7