Contents

Montar un servidor casero con Raspberry Pi (Parte 5): DNS local con actualizaciones dinámicas DHCP

Después de configurar nuestro servidor DHCP y nuestro servidor DNS caché toca darle una vuelta de tuerca a nuestro servidor Raspberry Pi y aprovechar las capacidades de DHCP junto a las de DNS para crear un servidor DNS local que actualice automáticamente los registros para las direcciones concedidas por DHCP.

/wp-content/uploads/2013/05/banner-tutorial-raspi_-dnsdhcp-e1367835431964.png
Servidor casero con Raspberry Pi: DNS local con actualizaciones dinámicas DHCP

Índice de tutoriales:

  1. Objetivos e índice.
  2. Instalar Raspbian en una tarjeta SD.
  3. Primera ejecución de Raspbian.
  4. Configurar servidor DHCP.
  5. Configurar servidor DNS caché.
  6. DNS local con actualizaciones DHCP.
  7. Acceder al servidor desde el exterior.
  8. Instalación y configuración de OpenVPN.
  9. NAS con Raspberry Pi y Samba

Tutoriales relacionados:

Servidor DNS local con actualizaciones DHCP

Antes de ponernos manos a la obra es necesario entender que implica tener un servidor DNS local con actualizaciones DHCP. Esto es, cada vez que el servidor DHCP conceda una dirección IP a un dispositivo se dirigirá al servidor DNS y creará/actualizará el registro correspondiente a dicho dispositivo. Con eso conseguimos poder acceder a recursos compartidos en la red sin la necesidad de memorizar las direcciones IP completas, solo necesitamos recordar el nombre, cosa mucho más amigable.

Dicho esto podemos proceder a la configuración.

Asegurando las comunicaciones

Por razones de seguridad no podemos permitir que cualquier dispositivo actualice registros DNS, ya que esto podría suponer una infinidad distinta de ataques contra nuestra infraestructura. Si bien este servidor Raspberry Pi está ubicado en un domicilio nunca está de más intentar aplicar algunas medidas. Para aportar seguridad a las comunicaciones entre DHCP y Bind generaremos una clave compartida que será usada para la actualización de registros:

1
$ sudo /usr/sbin/rndc-confgen -a

Esto nos generará un archivo /etc/bind/rndc.key. Esta clave deberá ser configurada tanto en el servidor DNS como en el DHCP para que las comunicaciones se realicen correctamente.

Configuración de zonas DNS

Ahora toca configurar la zona de resolución directa e inversa para nuestro dominio. En el tutorial DHCP este era home.local, así que ese será el nombre que le daremos al dominio. El archivo de configuración de zonas locales se encuentra en /etc/bind/named.conf.local. Así que:

1
$ sudo nano /etc/bind/named.conf.local

Y deberemos configurar el archivo así:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
include "/etc/bind/rndc.key"; # Incluímos la clave compartida al archivo

zone home.local { # Zona de resolución directa
 type master; # Generamos respuestas autoritativas
 file "/var/lib/bind/home.local"; # Archivo de zona
 allow-update { key rndc-key; }; # Permitimos actualizaciones solo con la clave compartida
};

zone 66.168.192.in-addr.arpa { # Zona de resolución inversa
 type master;
 file "/var/lib/bind/66.168.192";
 allow-update { key rndc-key; };
};

Hecho esto podemos asegurarnos de que la configuración es correcta con:

1
$ sudo named-checkconf

Que no debería darnos salida alguna, indicando que no hay errores en la configuración.

En este punto tenemos las zonas declaradas, pero necesitamos configurarlas. Lo siguiente será editar los archivos de zona establecidos anteriormente, empezamos con home.local:

1
$ sudo nano /var/lib/bind/home.local

Deberemos dejar el archivo 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
# Definimos que el dominio cuelga directamente del dominio “.”, root.
$ORIGIN .
# Time-to-live del servicio.
$TTL 604800

# Definimos el Start Of Authority, el serial para seguir los eventos relacionados con la zona
# y los registros de intervalo.
home.local IN SOA raspberry.home.local. webmaster.home.local. (
 1353527646 ; serial
 10800 ; refresh
 3600 ; retry
 604800 ; expire
 38400 ; minimum
 )
;

# Definimos el registro Name Server para el dominio.
 NS raspberry
# Y su IP asociada.
 A 192.168.66.101
;

# Definimos el origen en nuestro dominio.
$ORIGIN home.local

# Aquí definiremos los registros fijos, en nuestro caso nuestro servidor.
raspberry A 192.168.66.101

Finalizada la configuración la comprobamos con:

1
$ sudo named-checkzone home.local /var/lib/bind/home.local

A lo que deberíamos recibir:

1
2
zone home.local/IN: loaded serial 1353527646
OK

Ahora toca hacer lo mismo para la zona de resolución inversa:

1
$ sudo nano /var/lib/bind/66.168.192

Y dejaremos la configuración así:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ORIGIN .
$TTL 604800

66.168.192.in-addr.arpa IN SOA raspberry.home.local. webmaster.home.local. (
 1353527647 ; serial
 10800 ; refresh
 3600 ; retry
 604800 ; expire
 38400 ; minimum
 )

NS raspberry.home.local.

$ORIGIN 66.168.192.in-addr.arpa.
101 PTR raspberry.home.local.

Comprobamos la configuración con:

1
$ sudo named-checkzone 66.168.192.in-addr.arpa /var/lib/bind/66.168.192

Vamos a comprobar que las zonas configuradas están funcionando reiniciando el servicio bind:

1
$ sudo /etc/init.d/bind9 restart

Ahora nuestro DNS local está funcionando, para comprobarlo nos valdremos de la herramienta nslookup para comprobar la resolución directa e inversa:

1
$ nslookup

Para la resolución directa:

1
> raspberry.home.local

Que nos mostrará su dirección IP. Ahora la resolución inversa:

1
> 192.168.66.101

Que nos mostrará el campo “name” junto con el nombre de red del dispositivo. Si las pruebas son satisfactorias querrá decir que nuestro dominio está montado.

Configurar DHCP para realizar actualizaciones DNS

Aquí viene lo realmente interesante del caso, y es que montar un servidor DNS local para simplemente relacionar una IP con el nombre de un servidor es como poco matar moscas a cañonazos, ahora bien, si podemos hacer lo mismo con todos los dispositivos de nuestra red local sin tener que modificar registros a mano cada vez que estos cambian de dirección IP la cosa se vuelve bastante curiosa.

Para conseguir que DHCP actualice registros DNS necesitamos editar la configuración que vimos el tutorial sobre DHCP. Así que vamos a ello:

1
$ sudo nano /etc/dhcp/dhcpd.conf

Buscamos el campo ddns-update-style configurado anteriormente, lo borramos y escribimos lo siguiente:

1
2
3
4
5
6
7
ddns-updates on; # Activamos la función de Dynamic DNS
ddns-update-style interim; # Método de actualización dinámica
update-static-leases on; # Actualizamos también los registros con reserva DHCP
include "/etc/bind/rndc.key"; # Incluímos la clave compartida

ddns-domainname "home.local."; # Nombre de dominio ddns
ddns-rev-domainname "in-addr.arpa."; # Nombre de dominio ddns inverso

Comprobando las actualizaciones DNS vía DHCP

Hasta aquí la parte de configuración del servidor, ahora solo nos falta cruzar los dedos mientras comprobamos que todo funciona correctamente. Para ello lo primero será reiniciar ambos servicios:

1
2
$ sudo /etc/init.d/bind9 restart
$ sudo /etc/init.d/isc-dhcp-server restart

Ahora abriremos el log del sistema para ver qué pasa cuando conectamos un cliente vía DHCP.

1
$ tail -f /var/log/syslog

Con esto en pantalla podemos proceder a conectar un nuevo cliente a la red. Automáticamente debería aparecer algo parecido a esto en nuestro log:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
May 5 20:14:04 raspberrypi named[6586]: client 127.0.0.1#39456: signer "rndc-key" approved
May 5 20:14:04 raspberrypi named[6586]: client 127.0.0.1#39456: updating zone 'home.local/IN': adding an RR at 'HTPC.home.local' A
May 5 20:14:04 raspberrypi named[6586]: client 127.0.0.1#39456: updating zone 'home.local/IN': adding an RR at 'HTPC.home.local' TXT
May 5 20:14:05 raspberrypi dhcpd: DHCPREQUEST for 192.168.66.6 from AA:BB:CC:DD:EE:FF (HTPC) via eth0
May 5 20:14:05 raspberrypi dhcpd: DHCPACK on 192.168.66.6 to AA:BB:CC:DD:EE:FF (HTPC) via eth0
May 5 20:14:06 raspberrypi dhcpd: Added new forward map from HTPC.home.local. to 192.168.66.6
May 5 20:14:06 raspberrypi named[6586]: zone home.local/IN: sending notifies (serial 1353527647)
May 5 20:14:06 raspberrypi named[6586]: client 127.0.0.1#39456: signer "rndc-key" approved
May 5 20:14:06 raspberrypi named[6586]: client 127.0.0.1#39456: updating zone '66.168.192.in-addr.arpa/IN': deleting rrset at '6.66.168.192.in-addr.arpa' PTR
May 5 20:14:06 raspberrypi named[6586]: client 127.0.0.1#39456: updating zone '66.168.192.in-addr.arpa/IN': adding an RR at '6.66.168.192.in-addr.arpa' PTR
May 5 20:14:10 raspberrypi dhcpd: Added reverse map from 6.66.168.192.in-addr.arpa. to HTPC.home.local.
May 5 20:14:10 raspberrypi named[6586]: client 127.0.0.1#39456: signer "rndc-key" approved
May 5 20:14:10 raspberrypi named[6586]: client 127.0.0.1#39456: updating zone '66.168.192.in-addr.arpa/IN': deleting rrset at '6.66.168.192.in-addr.arpa' PTR
May 5 20:14:10 raspberrypi named[6586]: client 127.0.0.1#39456: updating zone '66.168.192.in-addr.arpa/IN': adding an RR at '6.66.168.192.in-addr.arpa' PTR

Si prestamos atención al log podemos ver como hay dos grupos de registros, los procedentes de dhcpd y los procedentes named. También podemos observar el uso de la clave compartida así como de la comunicación entre un servicio y el otro.

Así que a partir de ahora, para referirnos a cualquier dispositivo de la red bastará con usar su nombre, esto es, para conectarnos a la Raspberry Pi vía ssh ahora podemos utilizar:

1
$ ssh pi@raspberry.home.local

Hasta aquí todo lo relacionado con DHCP y DNS en este tutorial.

Advertencia: Si dispones un ordenador con *buntu o derivadas (a partir de la versión 12.04) y la configuración de DNS no se te actualiza (apuntando siempre a 127.0.0.1 o 127.0.1.1) lee esto.