Tabla de contenidos
- 1 Instalación de bind
- 2 Configuración del fichero named.conf
- 3 Configuración del fichero forward
- 4 Configuración del fichero reverse
- 5 Probando el servidor de DNS
- 6 Configuración del DNS por round robin
- 7 Configuración de Bind (Named) sólo como forwarding
- 8 Error (FORMERR) resolving ‘/AAAA/IN’: xx.xx.xx.xx#53
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:
[[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.
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:
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.