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.
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 2 3 | servdns1.ochobits.local 192.168.0.101 servdns2.ochobits.local 192.168.0.111 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | options { listen-on port 53 { 127.0.0.1; 192.168.0.101; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots"; allow-query { localhost; 192.168.0.0/24;}; allow-transfer { localhost; 192.168.0.111; }; recursion yes; dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; zone "ochobits.local" IN { type master; file "forward.ochobits"; allow-update { none; }; }; zone "0.168.192.in-addr.arpa" IN { type master; file "reverse.ochobits"; allow-update { none; }; }; include "/etc/named.rfc1912.zones"; 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $TTL 86400 @ IN SOA servdns1.ochobits.local. root.ochobits.local. ( 2011071001 ;Serial 3600 ;Refresh 1800 ;Retry 604800 ;Expire 86400 ;Minimum TTL ) @ IN NS servdns1.ochobits.local. @ IN NS servdns2.ochobits.local. @ IN A 192.168.0.101 @ IN A 192.168.0.111 @ IN A 192.168.0.75 servdns1 IN A 192.168.0.101 servdns2 IN A 192.168.0.111 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $TTL 86400 @ IN SOA servdns1.ochobits.local. root.ochobits.local. ( 2011071001 ;Serial 3600 ;Refresh 1800 ;Retry 604800 ;Expire 86400 ;Minimum TTL ) @ IN NS servdns1.ochobits.local. @ IN NS servdns2.ochobits.local. @ IN PTR unixmen.local. servdns1 IN A 192.168.0.101 servdns2 IN A 192.168.0.111 raspberry IN A 192.168.0.75 101 IN PTR servdns1.ochobits.local. 111 IN PTR servdns2.ochobits.local. 75 IN PTR raspberrypi.ochobits.local |
Añadimos al arranque el servicio Bind y lo encendemos
Utilizamos las siguientes órdenes:
1 2 | systemctl enable named
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 2 | firewall-cmd --permanent --add-port=53/tcp 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 2 3 4 | chgrp named -R /var/named chown -v root:named /etc/named.conf restorecon -rv /var/named 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 2 3 | [root@servdns1 ~]# named-checkzone ochobits.local /var/named/forward.ochobits zone ochobits.local/IN: loaded serial 2011071001 OK |
Y ahora le toca el turno a la revisión de la zona «reverse»
1 2 3 | [root@servdns1 ~]# named-checkzone ochobits.local /var/named/reverse.ochobits zone ochobits.local/IN: loaded serial 2011071001 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 3 4 5 6 7 | (...) ONBOOT=yes IPADDR=192.168.0.101 PREFIX=24 GATEWAY=192.168.0.1 DNS1=192.168.0.101 (...) |
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [root@servdns1 ~]# dig servdns1.ochobits.local ; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> servdns1.ochobits.local ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47262 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;servdns1.ochobits.local. IN A ;; ANSWER SECTION: servdns1.ochobits.local. 86400 IN A 192.168.0.101 ;; AUTHORITY SECTION: ochobits.local. 86400 IN NS servdns1.ochobits.local. ochobits.local. 86400 IN NS servdns2.ochobits.local. ;; ADDITIONAL SECTION: servdns2.ochobits.local. 86400 IN A 192.168.0.111 ;; Query time: 1 msec ;; SERVER: 192.168.0.101#53(192.168.0.101) ;; WHEN: sáb feb 09 15:36:38 CET 2019 ;; MSG SIZE rcvd: 121 |
Y si utilizamos la herramienta ‘nslookup’
1 2 3 4 5 6 7 8 9 10 | [root@servdns1 ~]# nslookup ochobits.local Server: 192.168.0.101 Address: 192.168.0.101#53 Name: ochobits.local Address: 192.168.0.101 Name: ochobits.local Address: 192.168.0.111 Name: ochobits.local 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | options { listen-on port 53 { 127.0.0.1; 192.168.0.111; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots"; allow-query { localhost; 192.168.0.0/24;}; recursion yes; dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; zone "ochobits.local" IN { type slave; file "slaves/ochobits.fwd"; masters { 192.168.0.101; }; }; zone "0.168.192.in-addr.arpa" IN { type slave; file "slaves/ochobits.rev"; masters { 192.168.0.101; }; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; |
Encendemos el servicio bind y lo añadimos al arranque:
1 2 | systemctl enable named
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 2 | [root@servdns2 ~]# ls /var/named/slaves/ 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 3 4 5 6 | (...) PREFIX=24 GATEWAY=192.168.0.1 DNS1=192.168.0.101 DNS2=192.168.0.111 (...) |
También añadimos los datos de los servidores DNS, en el fichero «/etc/resolv.conf»
1 2 | nameserver 192.168.0.101 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 2 | firewall-cmd --permanent --add-port=53/tcp firewall-cmd --reload |
Modificamos permisos de ficheros y configuración de SELinux
1 2 3 4 | chgrp named -R /var/named chown -v root:named /etc/named.conf restorecon -rv /var/named restorecon /etc/named.conf |
Pruebas de funcionamiento
Hacemos prueba con la herramienta ‘dig’ y ‘nslookup’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;servdns1.ochobits.local. IN A ;; ANSWER SECTION: servdns1.ochobits.local. 86400 IN A 192.168.0.101 ;; AUTHORITY SECTION: ochobits.local. 86400 IN NS servdns2.ochobits.local. ochobits.local. 86400 IN NS servdns1.ochobits.local. ;; ADDITIONAL SECTION: servdns2.ochobits.local. 86400 IN A 192.168.0.111 ;; Query time: 6 msec ;; SERVER: 192.168.0.101#53(192.168.0.101) ;; WHEN: sáb feb 09 16:01:08 CET 2019 ;; MSG SIZE rcvd: 121 |
Y con ‘nslookup’
1 2 3 4 5 6 7 8 9 | Server: 192.168.0.101
Address: 192.168.0.101#53
Name: ochobits.local
Address: 192.168.0.111
Name: ochobits.local
Address: 192.168.0.75
Name: ochobits.local
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
Buenas David, gran artículo como siempre.
Una consulta, el serverdns2 podria ser una interfaz de red virtualizada (eth0:0) (?)
Un saludo y gracias.
Hola Javi,
¿Te refieres a una interfaz de red virtual en el mismo nodo? Piensa que el nodo secundario debe tener el servicio corriendo apuntando contra su propio fichero de configuración.
Piensa que la idea de tener dos nodos, es que si cae uno de ellos tienes el otro disponible.
Igualmente he visto algo de documentación por Internet, para crear dos instancias de BIND en el mismo nodo. Aunque yo no lo he probado.
Saludos
Totalmente de acuerdo.
Te comento, compartí el artículo en un grupo de linuxen Facebook, y alguien comentó esta posibilidad, yo le dije que la intención es que si uno cae, tener otro disponible, por eso el tener este tipo de configuración, pero no perdía nada en preguntarlo.
Un saludo y gracias.
Muy buen tutorial.
Lo probe con mas zonas y va perfecto.
Por cierto, si no pones las ips en el fichero hosts tambien va como la seda.
Me alegro que te haya servido. Saludos!
Hola, necesito crear un servidor para reverse DNS que lo solicita LACNIC para la resolucion de los host de servidores de exchange. Deberia configurar el servidor con IP Publica para que las consultas le caigan a el? en ese caso donde deberia ponerla en los script que desplegaste.
Gracias
excelente articulo, lo probe y anda muy bien para las resoluciones internas, pero me ha estado dando error con las resoluciones externas, he puesto los dns públicos en la configuración de la interfaz de red como secundaria y como nuevo servidor de nombre en el resolver pero aun asi, no logro ver internet, se le ocurre que pueda ser?