Configuración de un DNS Dinámico (Parte I)
Introducción
Un DNS Dinámico (DDNS) es un servidor DNS que no solo tiene configuradas direcciones IP de forma manual, sino que además hay un servidor DHCP que conforme va prestando o retirando direcciones IP de los clientes que tiene bajo su control va agregando o eliminado dichas direcciones de ese servidor DNS.
Hace ya más de un año que tengo un esquema así en mi casa y la verdad, cuando estoy en sitios en los que no existe tal servicio, lo echo de menos. Más que nada porque suelo utilizar mi equipo portátil para levantar máquinas virtuales y para cada una que levanto normalmente suelo acceder por ssh y es un infierno tener que andar verificando qué IP tiene cada máquina cada vez que quiero entrar en ellas.
– Sí, sí, sí… ya lo sé… ¡Móntate un DDNS en tu portátil, so melón!.
Hay muchas razones por las que esa opción, ahora mismo, no es muy factible.
Sigo…
Software a emplear
Si has llegado hasta aquí seguro que lo que buscas es: GNU/Linux + ISC-DHCP-SERVER + BIND… pues lo haré con Güindous.
Noooo, es broma. Soy malo pero tengo mis límites.
Infraestructura utilizada
El equipo en cuestión tendrá 2 tarjetas de red. Una de ellas con acceso a internet y la otra con acceso a la red privada de mi casa. Esto significa que también haré ‘source NAT’ para que los equipos de la red de mi casa tengan acceso a Internet.
Instalación del software
Los paquetes a instalar son:
- bind9
- isc-dhcp-server
root@deb-linuxarena:~# apt install bind9 isc-dhcp-server
Configuración del servidor DHCP
Consideraciones previas (¡¡importante!!)
A ver… Vamos a configurar un servidor DHCP en nuestra red local, en una máquina que tiene dos dispositivos de red. Lo que pase en la interfaz de nuestra LAN no importa mucho, pero hay que tener mucho cuidado con la interfaz que no está físicamente conectada a nuestra LAN, porque es muy habitual que haya un servidor DHCP en el otro lado y podríamos hacerle bastante daño a los equipos que se encuentren ella.
Configuración de las interfaces del demonio DHCP
Las interfaces por las cuales queremos que nuestro servidor vaya ofreciendo IP’s se configuran en ‘/etc/default/isc-dhcp-server‘, concretamente en la línea que pone ‘interfaces=»»‘. Como solo lo queremos poner en una interfaz basta con poner el nombre. Así quedaría esa línea en nuestro fichero’/etc/default/isc-dhcp-server‘:
/etc/default/isc-dhcp-server
root@deb-linuxarena:~# grep -Ev '^$|^#' /etc/default/isc-dhcp-server INTERFACES="eth0" root@deb-linuxarena:~#
Configuración del servicio
La configuración detallada del servidor DHCP se hace en el fichero ‘/etc/dhcp/dhcpd.conf‘:
/etc/dhcp/dhcpd.conf
# esta línea es necesaria si solo está este servidor dhcp authoritative; update-static-leases on; allow unknown-clients; use-host-decl-names on; # concesión máxima y por defecto de 1 día default-lease-time 86400; max-lease-time 86400; log-facility local7; # el dominio que se enviará a los clientes es linuxarena.net option domain-name "linuxarena.net"; option domain-search "linuxarena.net"; # los servidores dns serán, de momento, los de google option domain-name-servers 8.8.8.8,8.8.4.4; # gateway option routers 192.168.10.1; # dirección de broadcast de nuestra subred option broadcast-address 192.168.10.255; # máscara de red option subnet-mask 255.255.255.0; subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.50 192.168.10.254; }
De momento con estos valores ya debe funcionar nuestro servidor dhcp.
Iniciar el servidor DHCP
root@deb-linuxarena:~# systemctl restart isc-dhcp-server.service
Configuración del servidor DDNS
Ignorar IP’s privadas que no necesitamos
Como nuestro servidor DNS hará peticiones a los Servidores DNS raíz de Internet, para que no nos metan en ninguna lista negra porque hacemos ‘peticiones estúpidas‘ desde nuestra LAN hacia ellos, mandaremos todas las peticiones de IP’s privadas que no vamos a usar hacia un ‘pozo sin fondo‘.
Editamos el fichero ‘/etc/bind/zones.rfc1918‘ y comentamos el segmento de nuestra red local, quedando así:
/etc/bind/zones.rfc1918
zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; zone "31.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; // zone "168.192.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
Véase que se ha comentado la línea de nuestra subred al final del fichero.
/etc/bind/named.conf
En este fichero incluiré la ‘cookie’ necesaria para que el servidor DHCP pueda hacer actualizaciones de nombres y también definiré la IP, puerto de escucha y direcciones permitidas para realizar dichas modificaciones.
// This is the primary configuration file for the BIND DNS server named. // // Please read /usr/share/doc/bind9/README.Debian.gz for information on the // structure of BIND configuration files in Debian, *BEFORE* you customize // this configuration file. // // If you are just adding zones, please do that in /etc/bind/named.conf.local acl internals { 127.0.0.0/8; 192.168.10.1/24; }; include "/etc/bind/named.conf.options"; // incluyo la cookie include "/etc/bind/rndc.key"; controls { // si el servidor DHCP estuviera en otra máquina, se ve que es fácil // configurarlo para esa dirección // defino la ip y el puerto por el que se controlará el servidor DNS inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; include "/etc/bind/named.conf.local"; include "/etc/bind/named.conf.default-zones";
/etc/bind/named.conf.options
En este fichero se modifica el comportamiento del demonio la configuración por defecto, en principio, debe funcionarnos bien.
options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // forwarders { // 0.0.0.0; // }; //======================================================================== // If BIND logs error messages about the root key being expired, // you will need to update your keys. See https://www.isc.org/bind-keys //======================================================================== dnssec-validation auto; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; };
/etc/bind/named.conf.local
En este fichero se definen las zonas, tanto de resolución directa de nombres como la inversa. También se definen los ficheros donde estarán configurados y la ‘cookie’ necesaria para su modificación.
// // Do any local configuration here // // Consider adding the 1918 zones here, if they are not used in your // organization include "/etc/bind/zones.rfc1918"; // defino la zona de resolución directa zone "linuxarena.net" { type master; file "/var/cache/bind/db.linuxarena.net"; allow-update { key "rndc-key"; }; notify yes; }; // defino la zona de resolución inversa zone "10.168.192.in-addr.arpa" { type master; notify yes; file "/var/cache/bind/db.192.168.10"; allow-update { key "rndc-key"; }; };
/var/cache/bind/db.linuxarena.net
Con la directiva $ORIGIN nos ahorramos el tener que escribir los nombres de las máquinas completos. Tan solo basta con poner el nombre de host.
Fíjense que para la dirección de correo electrónico del administrador tampoco hace falta poner el dominio, solo el nombre del usuario.
$ORIGIN linuxarena.net. $TTL 86400 @ IN SOA deb-linuxarena postmaster ( 16122600 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL ; @ IN NS deb-linuxarena $ORIGIN linuxarena.net. deb-linuxarena A 192.168.10.1
/var/cache/bind/db.192.168.10
Los SERIAL deben coincidir en ambos ficheros. Se suele usar este formato: YYMMDDNN, donde NN es el número de revisión.
$TTL 86400 10.168.192.in-addr.arpa. IN SOA deb-linuxarena.linuxarena.net. postmaster.linuxarena.net. ( 16122600 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL ; @ IN NS deb-linuxarena.linuxarena.net. $ORIGIN 10.168.192.in-addr.arpa. 1 PTR deb-linuxarena.linuxarena.net.
Ojo con estos ficheros creados, el propietario debe ser el usuario ‘bind’, para asegurarme haré lo siguiente:
root@deb-linuxarena:/etc/bind# chown -R bind. /var/cache/bind/
Ajustes en el servidor DHCP
Ahora hay que dotar a nuestro DHCP de la capacidad de actualizar el servidor DNS. Para ello solo hay que darle la ‘cookie‘ y las zonas directa e inversa DDNS.
También cambiaré el servidor DNS que se ofrecerá a los clientes.
Así queda el fichero ‘/etc/dhcp/dhcpd.conf‘:
/etc/dhcp/dhcpd.conf
# Establezco el tipo de actualización ddns-update-style interim; # Añado la 'cookie' necesaria para poder controlar el servidor DNS include "/etc/bind/rndc.key"; authoritative; update-static-leases on; allow unknown-clients; use-host-decl-names on; # concesión máxima y por defecto de 1 día default-lease-time 86400; max-lease-time 86400; log-facility local7; # el dominio que se enviará a los clientes es linuxarena.net option domain-name "linuxarena.net"; option domain-search "linuxarena.net"; # añado las zonas directa e inversa ddns-domainname "linuxarena.net."; ddns-rev-domainname "10.168.192.in-addr.arpa."; # ahora el servidor DNS es este option domain-name-servers 192.168.10.1; # gateway option routers 192.168.10.1; # dirección de broadcast de nuestra subred option broadcast-address 192.168.10.255; # máscara de red option subnet-mask 255.255.255.0; # Añado la zona de resolución directa de nombres zone linuxarena.net. { primary 127.0.0.1; key "rndc-key"; } # Añado la zona de resolución inversa zone 10.168.192.in-addr.arpa. { primary 127.0.0.1; key "rndc-key"; } subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.50 192.168.10.254; }
Reiniciar el servidor DHCP y el DNS
root@deb-linuxarena:~# systemctl restart isc-dhcp-server.service bind9.service
Regla SNAT de iptables
Para que los equipos tengan acceso a internet hay que hacer 2 cosas:
- Poner las interfaces en modo forwarding
- Crear una regla de iptables
Forwarding
Esto se puede hacer de varias formas, yo lo haré de forma persistente para que al reiniciar el equipo esté bien configurado.
root@deb-linuxarena:~# printf 'net.ipv4.ip_forward=1\n' > /etc/sysctl.d/50-ipv4forward.conf
Ahora solo hay que hacer efectivo este cambio.
root@deb-linuxarena:~# sysctl -w -p /etc/sysctl.d/50-ipv4forward.conf
Y verificamos que se ha activado el bit de forward.
root@deb-linuxarena:~# sysctl -a | grep ipv4.ip_forward net.ipv4.ip_forward = 1 net.ipv4.ip_forward_use_pmtu = 0
Iptables
La regla a crear viene a significar esto: ‘Coge todos los paquetes que vengan de la subred 192.168.10.0/24 y los mandas a eth1‘.
root@deb-linuxarena:~# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE
Ahora hay que hacer que esos cambios sean persistentes, para eso existe un paquete en Debian que se llama ‘iptables-persistent‘.
root@deb-linuxarena:~# apt install iptables-persistent
Y con este último paso ya nos aseguramos que nuestra red tenga internet hasta el fin de los días.
Configurar el propio servidor
Como nuestro servidor es ya un servidor DNS de los buenos, y además, seguramente desde él algún día nos haga falta entrar a nuestras máquinas usando sus nombres en lugar de sus IP’s, lo dejaremos configurado para que use sus propias DNS’s.
root@deb-linuxarena:~# apt install resolvconf
Ahora solo hay que editar ‘/etc/network/interfaces‘
/etc/network/interfaces
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet static address 192.168.10.1 netmask 255.255.255.0 dns-nameservers 127.0.0.1 dns-search linuxarena.net allow-hotplug eth1 iface eth1 inet dhcp
Reiniciamos las interfaces…
root@deb-linuxarena:~# ifdown eth0 && ifup eth0 root@deb-linuxarena:~# ifdown eth1 && ifup eth1
Y magia..
Notas
Como aporte final solo me queda decir que si se quieren añandir direcciones de forma manual este es el procedimiento a seguir:
root@deb-linuxarena:~# rndc freeze root@deb-linuxarena:~# # hacer las modificaciones pertinentes root@deb-linuxarena:~# # en /var/cache/bind/db.linuxarena.net root@deb-linuxarena:~# # o en /var/cache/bind/db.192.168.10 root@deb-linuxarena:~# rndc thaw
Si no se hace así, los cambios no serán efectivos.
Comentarios recientes