(Actualizado a 13 de Febrero de 2024)
En algunos casos puede resultar interesante tener configurado un servidor DNS en una red local especialmente si tenemos servicios montados en una Raspberry y queremos acceder a ellos por nombre en lugar de aprender la IP y el puerto.
Un servidor DHCP también nos permite personalizar el rango de direcciones y poder asignar direcciones específicas basadas en MAC, útiles para servidores o sistemas NAS.
Existen paquetes que agrupan estos dos servicios y permiten usarse con una configuración mínima pero en este caso vamos a usar dos paquetes diferentes basado en dos clásicos isc dhcp server y bind9.
Servidor DHCP
Primero instalamos el servidor DHCP
sudo apt-get install isc-dhcp-server
Es posible que al instalar este paquete aparezcan algunos errores, no hay que preocuparse porque es debido a que el servicio todavía no está configurado.
Ahora vamos a editar algunos valores el fichero /etc/dhcpcd.conf, en la parte de Example static IP configuration ponemos la siguiente configuración, vamos a suponer que el servidor tiene de IP 192.168.1.2 que el router de la red tiene de IP 192.168.1.1 y que el servidor DNS es este mismo (192.168.1.2) así como uno adicional 8.8.8.8
# Example static IP configuration:
interface eth0
static ip_address=192.168.1.2/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.1.1
static domain_name_servers=192.168.1.2 8.8.8.8 fd51:42f8:caae:d92e::1
Ahora editamos el fichero /etc/dhcp/dhcpd.conf quitamos el comentario de la opción authoritative y también de la opción log-facility local7; indicamos opciones para el nombre de la zona y aumentamos el tiempo de concesión (lease time), en una red doméstica es más práctico para no perder la IP en caso de que el servidor DHCP se caiga.
Al final del fichero agregamos la red que en nuestro caso es 192.168.1.0 y también creamos el rango en el que se entregarán IPs vamos a usar el rango 192.168.1.100-192.168.1.254.
En esta misma sección vamos a poder asignar las IP estáticas, por ejemplo máquinas que siempre tienen que recibir la misma IP, vamos a suponer por ejemplo que tenemos un servidor NAS en la IP 192.168.1.10, y por si acaso añadimos también el router aunque posiblemente ya tenga IP fija.
La configuración con todos estos cambios sería:
option domain-name "acme.local";
option domain-name-servers 192.168.1.2, 8.8.8.8;
default-lease-time 259200;
max-lease-time 604800;
authoritative;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.254;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
}
host router {
hardware ethernet 38:72:c0:30:26:6e;
fixed-address 192.168.1.1;
}
host NAS {
hardware ethernet 00:d0:4b:95:06:c0;
fixed-address 192.168.1.10;
}
Finalmente indicamos que solo procesaremos peticiones IPv4, para esto editamos el fichero /etc/default/isc-dhcp-server y al final dejamos solo lo siguiente comentando el resto:
INTERFACESv4="eth0"
Para poder empezar igual necesitamos establecer la dirección IP manualmente. Esto no interrumpirá la conexión existente.
sudo ifconfig eth0 192.168.1.1
También habilitamos algunos servicios para que el arranque sea correcto.
sudo systemctl enable dhcpcd
sudo systemctl enable isc-dhcp-server
Al terminar es aconsejable reiniciar los servicios para detectar cualquier posible error en la configuración:
sudo service dhcpcd restart
sudo service isc-dhcp-server restart
Servidor DNS
En este caso vamos a usar el servidor bind9, vamos a crear las zonas que servirá para identificar nuestra red y las maquinas que se tendrán que resolver cuando se acceda a ellas por nombre. Primero instalamos el servidor:
sudo apt-get install bind9
Una opción de configuración para habilitar bind9 solo para direcciones IPV4, editamos el fichero /etc/default/named y añadimos la opción -4 al final.
OPTIONS="-u bind -4"
Vamos a definir estas zonas en el fichero /etc/bind/named.conf.local a la zona la llamaremos acme
zone "acme.local" {
type master;
file "/etc/bind/db.acme.local";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.1";
};
En la primera sección creamos la zona acme que definiremos en la ruta indicada /etc/bind/db.acme.local en la segunda sección definiremos la zona inversa que permite hacer consultas en base a la IP para obtener el nombre, esta zona se suele nombrar usando la IP de red en sentido inverso.
Ahora editamos la opciones a través del fichero /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
auth-nxdomain no; # conform to RFC1035
# Reenviadores
forwarders { # Reenviamos las consultas a:
8.8.8.8; # DNS de Google.
8.8.4.4; # DNS de Google.
192.168.128.1; # IP del router.
};
# Opciones de seguridad
listen-on port 53 { # Escuchamos en el puerto 53 (Puerto por defecto)...
127.0.0.1; # ... por la interfaz de loopback...
192.168.1.2; # ... y por nuestra IP de red.
};
# Otras opciones
listen-on-v6 { none; }; # No escuchamos tráfico IPv6;
allow-query { # Permitimos consultas DNS desde...
127.0.0.1; # ... la interfaz de loopback ...
192.168.1.0/24; # ... y nuestra red interna.
};
allow-transfer { none; }; # Prohibimos la transferencia de zonas puesto que este es nuestro único servidor DNS de la LAN
allow-recursion { # Permitimos consultas recursivas desde...
127.0.0.1; # ... la interfaz de loopback...
192.168.1.0/24; # ... y la red interna.
};
};
Ahora creamos las zonas usando la configuración indicada al principio así que usaremos la carpeta /etc/bind, es importante respetar el formato del fichero con el punto al final (.) y los tabuladores.
- db.acme.local
- Contiene los nombres de la zona, aquí indicamos el nombre y su IP, al servidor DNS lo vamos a llamar server
$ORIGIN acme.local.
$TTL 86400 ; 1 dia
@ IN SOA server.acme.local admin.acme.local (
2 ; serie
6H ; refresco (6 horas)
1H ; reintentos (1 hora)
2W ; expira (2 semanas)
3H ; mínimo (3 horas)
)
; name servers - NS records
IN NS server.acme.local.
; name servers - A records
router.etxe.local. IN A 192.168.1.2
nas.etxe.local. IN A 192.168.1.3
- db.192.168.128
- Este fichero contiene la zona inversa que se ha comentado antes
$ORIGIN 1.168.192.in-addr.arpa.
$TTL 86400 ; 1 dia
@ IN SOA server.acme.local admin.acme.local (
2 ; serie
6H ; refresco (6 horas)
1H ; reintentos (1 hora)
2W ; expire (2 semanas)
3H ; mínimo (3 horas)
)
; name servers - NS records
IN NS server.acme.local.
; PTR Records
1.128 IN PTR router.etxe.local. ; 192.168.128.1
2.128 IN PTR nas.etxe.local. ; 192.168.128.2
Finalmente establecemos el servicio para que arranque automáticamente
sudo systemctl enable named
Para verificar que la configuración es correcta:
sudo named-checkconf
También podemos verificar la configuración de las zonas usando este comando donde el primer parámetro es el nombre de la zona y el segundo el nombre del fichero.
sudo named-checkzone acme.local db.acme.local
Y comprobamos que todo es correcto con:
sudo service named restart
