Configuración de un servidor DNS en Linux Centos

Hosting SSD

La configuración de un servidor DNS en Linux Centos 7 es muy sencilla. Primero de todo, tendremos que instalar el producto bind.

Instalación de bind

yum -y install bind bind-utils

Configuración del fichero named.conf

Seguidamente, en el fichero /etc/named.conf, definimos la zona del servicio que queremos resolver. En este caso, quiero resolver el nombre de servicio main.webserver.local:

zone «webserver.local» IN {
type master;
file «forward.webserverlocal.db«;
allow-update { none; };
};

zone «2.0.0.10.in-addr.arpa» IN {
type master;
file «reverse.webserverlocal.db«;
allow-update { none; };
};

Configuración del fichero forward

En el fichero forward.webserverloca.db definimos las IPs y el nombres del servicio. Es decir, un servicio puede apuntar a varios servidores como puede ocurrir con google.com:

C:\Users\dmartinez28>nslookup www.google.com
Server: resolver.hp.net
Address: 16.110.135.51

Non-authoritative answer:
Name: www.google.com
Addresses: 2607:f8b0:4000:815::2004
74.125.195.105
74.125.195.147
74.125.195.99
74.125.195.104
74.125.195.106
74.125.195.103

C:\Users\dmartinez28>

Así que veamos nuestro fichero de «forward»:

[[email protected] ~]# cat /var/named/forward.webserverlocal.db
$TTL 86400
@ IN SOA maindns.webserver.local. root.webserver.local. (
2011071001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
@ IN NS maindns.webserver.local.
@ IN NS secondarydns.webserever.local.
@ IN A 10.0.0.2
@ IN A 10.0.0.3
maindns IN A 10.0.0.2
secondarydns IN A 10.0.0.3
[[email protected] ~]#

Configuración del fichero reverse

En el fichero «reverse» definimos el camino de respuesta, por llamarlo de alguna manera:

[[email protected] ~]# cat /var/named/reverse.webserverlocal.db
$TTL 86400
@ IN SOA main.webserver.local. root.webserver.local. (
2011071001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
@ IN NS masterdns.webserver.local.
maindns IN A 10.0.0.2
secondarydns IN A 10.0.0.3
101 IN PTR maindns.webeserver.local.
102 IN PTR secondarydns.unixmen.local.
[[email protected] ~]#

Probando el servidor de DNS

Una vez definidos todos los parámetros, reiniciamos el servicio named con el comando systemctl restart named.

En nuestro fichero /etc/resolv.conf, tenemos que apuntar a la IP donde corre el servicio de DNS. En el caso para este ejemplo, todo lo he ubicado en el mismo servidor:

[[email protected] ~]# cat /etc/resolv.conf
nameserver 10.0.0.2
[[email protected] ~]#

Finalmente, probamos la resolución del nombre vía DNS:

  chmod - chown - ACL - Administración de permisos en archivos y directorios de Linux

[[email protected] ~]# dig maindns.webserver.local

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> maindns.webserver.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33754
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;maindns.webserver.local. IN A

;; ANSWER SECTION:
maindns.webserver.local. 86400 IN A 10.0.0.2

;; AUTHORITY SECTION:
webserver.local. 86400 IN NS secondarydns.webserever.local.
webserver.local. 86400 IN NS maindns.webserver.local.

;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Mon Nov 12 13:27:25 CET 2018
;; MSG SIZE rcvd: 120

[[email protected] ~]#

A lo mejor estás más acostumbrado al antiguo nslookup:

[[email protected] ~]# nslookup maindns.webserver.local
Server: 10.0.0.2
Address: 10.0.0.2#53

Name: maindns.webserver.local
Address: 10.0.0.2

[[email protected] ~]#

También voy a comprobar el servidor WEB de pruebas que tengo arrancado en cada uno de los servidores:

[[email protected] ~]# curl -s http://maindns.webserver.local
<html>
<body>
Hola desde el Webserver 1
</body>
</html>
[[email protected] ~]# curl -s http://secondarydns.webserver.local
<html>
<body>
Hola desde el Webserver 2
</body>
</html>
[[email protected] ~]#

¿Quieres, todavía, más información sobre un dominio? Instala whois para Linux

Si con la información que te da nslookup no tienes suficiente y quieres conocer más datos sobre un dominio, instala el comando whois en Linux.

En distribuciones RedHat, lo instalaremos de la siguiente manera:

dnf install -y whois

o

yum install -y whois

Una vez instalado el comando, obtendremos más información sobre un dominio ejecutando whois dominio, tal y como hacemos en el siguiente ejemplo:

[[email protected] ~]# whois puerto53.com
   Domain Name: PUERTO53.COM
   Registry Domain ID: 2164721598_DOMAIN_COM-VRSN
   Registrar WHOIS Server: whois.registrar.eu
   Registrar URL: http://www.openprovider.com
   Updated Date: 2022-08-15T05:31:59Z
   Creation Date: 2017-09-19T06:39:46Z
   Registry Expiry Date: 2024-09-19T06:39:46Z
   Registrar: Hosting Concepts B.V. d/b/a Registrar.eu
   Registrar IANA ID: 1647
   Registrar Abuse Contact Email: [email protected]
   Registrar Abuse Contact Phone: +31.104482297
   Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
   Name Server: HOWARD.NS.CLOUDFLARE.COM
   Name Server: JOCELYN.NS.CLOUDFLARE.COM
   DNSSEC: unsigned
   URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/
>>> Last update of whois database: 2022-10-15T05:57:37Z <<<

Configuración del DNS por round robin

Ahora queremos que si la aplicación de un servidor cae, el servicio se siga dando por el otro servidor WEB. A esta configuración se la denomina «alta disponibilidad» por round robin de DNS.

  Configuración de SAMBA en Linux

Lo que voy a hacer es configurar el DNS para que un mismo nombre apunte a varias IPs distintas. Cada IP está levantada en un servidor (sistema operativo) diferente, por lo que si cae el «Webserver 1», el servicio se seguirá dando por el «Webserver 2».

El nombre del servicio al que voy a apuntar se llama webservertest y tengo un servidor WEB arrancado en el servidor con IP 10.0.0.2 y el otro Webserver en el servidor 10.0.0.3.

El resultado es el siguiente:

[[email protected] named]# curl -s http://webservertest
<html>
<body>
Hola desde el Webserver 1
</body>
</html>
[[email protected] named]# systemctl stop httpd
[[email protected] named]# curl -s http://webservertest
<html>
<body>
Hola desde el Webserver 2
</body>
</html>
[[email protected] named]#

Como podemos observar, aunque para el Apache del servidor con IP 10.0.0.2, la URL sigue dando servicio a través del Apache con IP 10.0.0.3.

Para conseguir esto, he configurado nuevas entradas en el DNS. Veámoslas:

  • Fichero /etc/named.conf:

# webservertest
zone «webservertest» IN {
type master;
file «forward.webservertest.db»;
allow-update { none; };
};

zone «reverse.webservertest» IN {
type master;
file «reverse.webservertest.db»;
allow-update { none; };
};

  • Fichero  /var/named/forward.webservertest.db:

$TTL 86400
@ IN SOA webservertest. root.webserver.local. (
2011071001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)

@ IN NS webservertest.
@ IN NS webserevertest.
@ IN A 10.0.0.2
@ IN A 10.0.0.3
webservertest IN A 10.0.0.2
webservertest IN A 10.0.0.3

Vemos que el mismo nombre de servicio apunta a IPs distintas.

  • Fichero /var/named/reverse.webservertest.db:

$TTL 86400
@ IN SOA webservertest. root.webservertest. (
2011071001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)

@ IN NS webservertest.
webservertest IN A 10.0.0.2
webservertest IN A 10.0.0.3
101 IN PTR webservertest.
102 IN PTR webservertest.

Configuración de Bind (Named) sólo como forwarding

En algunas configuraciones puede que nos interese tener nuestro propio servidor de DNS pero que resuelva las direcciones de Internet utilizando los DNS públicos de otro proveedor como, por ejemplo, desde los DNSs públicos de Google.

La configuración es muy sencilla. Solamente tendremos que configurar nuestro servidor de DNS como only forwarding.

  • Configuramos el fichero /etc/resolv.conf con los DNSs de Google:
nameserver      8.8.4.4
nameserver      8.8.8.8

Obviamente, nuestro sistema deberá poder llegar a las esas IPs y puerto 53.

  • Configuramos el fichero named.conf para que use los DNSs de Google y únicamente redirija las peticiones a ellos (forward only):
acl redsegura {
        172.21.208/27;
        localhost;
        localnets;
};

options {
        listen-on port 53 { any; };
        listen-on-v6 { any; };
        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";
        //allow-query     { any; };
        allow-query     { redsegura; };
        recursion yes;
        notify yes;

        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;
        forwarders {
           8.8.4.4;     # DNS Google
           8.8.8.8;     # DNS Google
        };
        forward only;

        /* Path to ISC DLV key */
        //bindkeys-file "/etc/named.iscdlv.key";

        //managed-keys-directory "/var/named/dynamic";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

Prestar especial atención a las IPs permitidas para usar el servidor de DNS (directiva acl). Si queremos que cualquier pueda usar nuestro servicio de DNS, el valor de la directiva «allow_query» será «any» en lugar de la sección de acl.

  • Chequeamos el fichero de configuración que acabamos de generar:
named-checkconf
  • Si todo está OK, reiniciamos el servicio de DNS para aplicar la configuración:
  VDO - Deduplicación y Compresión de datos en Linux

systemctl restart named
  • Comprobamos que el puerto 53, el del servicio de DNS, está levantado:

[root]# netstat -an |grep 53 |grep LISTEN
tcp        0      0 172.21.208.11:53            0.0.0.0:*                   LISTEN
tcp        0      0 172.21.208.10:53            0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:53                0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LISTEN
tcp        0      0 ::1:53299                   :::*                        LISTEN
tcp        0      0 :::53                       :::*                        LISTEN
tcp        0      0 ::1:953                     :::*                        LISTEN
[root]#
  • Finalmente, comprobamos que nuestro servidor de DNS es capaz de resolver nombres públicos en Internet:
[root]# nslookup
> server 172.21.208.10
Default server: 172.21.208.10
Address: 172.21.208.10#53
> www.google.com
Server:         172.21.208.10
Address:        172.21.208.10#53

Non-authoritative answer:
Name:   www.google.com
Address: 216.58.213.164
> exit

[root]#

Error (FORMERR) resolving ‘/AAAA/IN’: xx.xx.xx.xx#53

En un servidor DNS que configuré me daba el error «error (FORMERR) resolving ‘/AAAA/IN’: xx.xx.xx.xx#53» de manera aleatoria. Resulta que esta máquina tenía configuradas IPs v4 y v6, pero solamente las v4 tenían permisos para llegar a la IP y puerto del servidor DNS.

La solución pasaba por eliminar todas las directivas de IPV6 del fichero /etc/named.conf para forzar que el servicio escuche solamente por una IPv4 específica y editar el fichero /etc/sysconfig/named, añadiendo la directiva «OPTIONS=-4» para forzar el servicio named por IPV4.

[[email protected] ~]# tail -1 /etc/sysconfig/named
OPTIONS=-4
[[email protected] ~]#

Una vez realizados los cambios, hay que reiniciar el servicio named.

Compárteme

Contenido Relacionado

Deja un comentario