Páginas

viernes, 25 de septiembre de 2026

Migrar un dominio local a casa.lan en FreeBSD usando Unbound

Montar o expandir un laboratorio en casa y quieres estructurar servicios bajo un dominio local limpio y profesional (como casa.lan), migrar desde un dominio heredado o genérico (local.com) es un proceso rápido usando FreeBSD y Unbound como servidor DNS recursivo y autoritativo.

Actualizar la configuración del sistema operativo, estructurar las zonas directas e inversas en Unbound para todos los dispositivos y asegurar la compatibilidad con servicios como NFSv4.

Requisitos previos

- Un servidor FreeBSD con IP fija (en nuestro ejemplo, 192.168.88.160). - Unbound instalado y configurado como servidor DNS principal de la red.

Actualizar /etc/rc.conf

Modificar los parámetros relacionados con el hostname, dominio y servicios que dependen de él (nfsuserd)

hostname="tormenta.casa.lan"
domain="casa.lan"
nfsuserd_flags="-domain casa.lan"

Actualizar la configuración de Unbound.

Editar el archivo /usr/local/etc/unbound/local-zone.conf

Registrar el nuevo dominio y la máquina

server:
  local-zone: "casa.lan." static
  local-data: "casa.lan. IN SOA tormenta.casa.lan. root.casa.lan. 2026092301 3600 900 1209600 3600"
  local-data: "casa.lan. IN NS tormenta.casa.lan."
  local-data: "tormenta.casa.lan. IN A 192.168.88.160"
  local-data: "tormenta. IN A 192.168.88.160"
 

Verificar la sintaxis de Unbound

  unbound-checkconf /usr/local/etc/unbound/unbound.conf
  

Aplicar los cambios y reiniciar servicios

Cambiar el hostname en caliente

  hostname tormenta.casa.lan
  
service unbound restart
service nfsuserd restart

Comprobar que la resolución DNS interna responde correctamente al nuevo dominio. Ejecutar

dig @127.0.0.1 tormenta.casa.lan  
; <<>> DiG 9.20.26 <<>> @127.0.0.1 tormenta.casa.lan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2667
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;tormenta.casa.lan.		IN	A

;; ANSWER SECTION:
tormenta.casa.lan.	3600	IN	A	192.168.88.160

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Fri Sep 25 06:36:50 CEST 2026
;; MSG SIZE  rcvd: 62

Actualizar /etc/hosts

El sistema consulta este archivo antes que el DNS. Reemplazar cualquier mención a local.com por casa.lan

192.168.88.160    tormenta.casa.lan   tormenta

Actualizar /etc/resolv.conf

Como la IP está configurada de forma estática en rc.conf se deben actualizar manualmente los sufijos de búsqueda DNS de la propia máquina.

search casa.lan
nameserver 127.0.0.1

Revisar exportaciones NFS

Si el acceso a los recursos compartidos nombre de dominio en lugar de IP

En /etc/exports comprobar si hay alguna línea que permita el acceso explícito a *.local.com

En el cliente solaris, archivo /etc/resolv.conf

Añadir la línea casa.lan para que el sistema sepa que debe buscar automáticamente en el dominio local al escribir nombre cortos, como hacer ping a tormenta en lugar de tormenta.casa.lan

search casa.lan
nameserver 192.168.88.160

Comprobar resolución desde el cliente

ping -c 3 tormenta

Configurar resolución DNS inversa (PTR) para la red 192.168.88.0/24.

Añadir zona inversa en Unbound

El archivo /usr/local/etc/unbound/local-zone.com necesita una zona de búsqueda inversa (in-addr.arpa) para traducir direcciones IP a nombres.

server:
  # Zona directa existente
  local-zone: "casa.lan." static
  local-data: "casa.lan. IN SOA tormenta.casa.lan. root.casa.lan. 2026092301 3600 900 1209600 3600"
  local-data: "casa.lan. IN NS tormenta.casa.lan."
  local-data: "tormenta.casa.lan. IN A 192.168.88.160"
  local-data: "tormenta. IN A 192.168.88.160"

  # Zona inversa para la red 192.168.88.x (el orden de la IP va invertido en arpa)
  local-zone: "88.168.192.in-addr.arpa." static
  local-data: "88.168.192.in-addr.arpa. IN SOA tormenta.casa.lan. root.casa.lan. 2026092301 3600 900 1209600 3600"
  local-data: "88.168.192.in-addr.arpa. IN NS tormenta.casa.lan."
  local-data: "160.88.168.192.in-addr.arpa. IN PTR tormenta.casa.lan."

Validar y reiniciar Unbound

unbound-checkconf /usr/local/etc/unbound/unbound.conf
service unbound restart

Probar la resolución inversa

Utilizar el comando dig con la opción -x para consultar la IP de tu servidor desde cualquier equipo de la red (o desde el propio servidor):

dig -x 192.168.88.160 @192.168.88.160                             carlos@solaris

; <<>> DiG 9.20.26 <<>> -x 192.168.88.160 @192.168.88.160
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21003
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;160.88.168.192.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
160.88.168.192.in-addr.arpa. 3600 IN	PTR	tormenta.casa.lan.

;; Query time: 208 msec
;; SERVER: 192.168.88.160#53(192.168.88.160) (UDP)
;; WHEN: Fri Sep 25 07:00:58 CEST 2026
;; MSG SIZE  rcvd: 87

Para añadir equipos de la red local, (clientes, impresoras, NAS, etc.), se utiliza el archivo /usr/local/etc/unbound/local-zone.conf

Por cada equipo registrado: El registro A (asocia el nombre a la IP) y el registro PTR en la zona inversa (asocia la IP al nombre), para que funcionen herramientas de red, SSH o NFS sin retrasos.

solaris.casa.lan

server:
  # --- ZONA DIRECTA (casa.lan) ---
  local-zone: "casa.lan." static
  local-data: "casa.lan. IN SOA tormenta.casa.lan. root.casa.lan. 2026092301 3600 900 1209600 3600"
  local-data: "casa.lan. IN NS tormenta.casa.lan."
  
  # Servidor principal
  local-data: "tormenta.casa.lan. IN A 192.168.88.160"
  local-data: "tormenta. IN A 192.168.88.160"

  # Nuevos equipos (Ejemplo: solaris)
  local-data: "solaris.casa.lan. IN A 192.168.88.50"
  local-data: "solaris. IN A 192.168.88.50"


  # --- ZONA INVERSA (88.168.192.in-addr.arpa) ---
  local-zone: "88.168.192.in-addr.arpa." static
  local-data: "88.168.192.in-addr.arpa. IN SOA tormenta.casa.lan. root.casa.lan. 2026092301 3600 900 1209600 3600"
  local-data: "88.168.192.in-addr.arpa. IN NS tormenta.casa.lan."
  
  # PTR para tormenta
  local-data: "160.88.168.192.in-addr.arpa. IN PTR tormenta.casa.lan."

  # PTR para solaris (el último octeto de la IP va primero en arpa)
  local-data: "50.88.168.192.in-addr.arpa. IN PTR solaris.casa.lan."
IMPORTANTE: No olvidar actualizar el número de serie del SOA (en el ejemplo 2026092301, que suele seguir el formato AAAAMMDDnn) cada vez que se modifique el archivo de zona, para que los cambios se refresquen adecuadamente. Cambiar 2026092301 por 2026092302 en la zona directa y zona inversa.

Verificar que la sintaxis sea correcta y reiniciar

unbound-checkconf /usr/local/etc/unbound/unbound.conf
service unbound restart

Comprobar que los registros (directos e inversos) funcionan y son leidos correctamente por Unbound con el nuevo número de serie

Verificar el registro A

dig @127.0.0.1 solaris.casa.lan

; <<>> DiG 9.20.26 <<>> @127.0.0.1 solaris.casa.lan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33984
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;solaris.casa.lan.		IN	A

;; ANSWER SECTION:
solaris.casa.lan.	3600	IN	A	192.168.88.51

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Fri Sep 25 07:17:43 CEST 2026
;; MSG SIZE  rcvd: 61

Verificar el registro PTR (IP responde a su nombre)

dig -x 192.168.88.50 @127.0.0.1

; <<>> DiG 9.20.26 <<>> -x 192.168.88.50 @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 43540
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;50.88.168.192.in-addr.arpa.	IN	PTR

;; AUTHORITY SECTION:
88.168.192.in-addr.arpa. 3600	IN	SOA	tormenta.casa.lan. root.casa.lan. 2026092401 3600 900 1209600 3600

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Fri Sep 25 07:19:26 CEST 2026
;; MSG SIZE  rcvd: 113

Guardar y reiniciar

unbound-checkconf /usr/local/etc/unbound/unbound.conf
service unbound restart

Comprobar que NFSv4 está alineado con casa.lan

Archivo /etc/rc.conf

nfsuserd_flags="-domain casa.lan"

Reiniciar servicio

service nfsuserd restart

En los clientes NFSv4 en FreeBSD archivo /etc/rc.conf

nfsuserd_enable="YES"
nfsuserd_flags="-domain casa.lan"

Reiniciar servicio

service nfsuserd restart

Montar los recursos compartidos en el cliente usando el nombre de dominio nuevo para referirte al servidor.

mount -t nfs tormenta.casa.lan:/tu/exportacion /punto/de/montaje

Agregar nuevos clientes (synology, tornado, macbook, kamikaze y raspberrypi incluidas las IPs de loopback IPv4/IPv6

server:
  # ==========================================
  # ZONA DIRECTA: casa.lan
  # ==========================================
  local-zone: "casa.lan." static
  local-data: "casa.lan. IN SOA tormenta.casa.lan. root.casa.lan. 2026092401 3600 900 1209600 3600"
  local-data: "casa.lan. IN NS tormenta.casa.lan."

  # Resoluciones locales (localhost y servidores)
  local-data: "localhost. IN A 127.0.0.1"
  local-data: "localhost. IN AAAA ::1"

  # Tus equipos
  local-data: "tormenta.casa.lan. IN A 192.168.88.160"
  local-data: "tormenta. IN A 192.168.88.160"

  local-data: "synology.casa.lan. IN A 192.168.88.247"
  local-data: "synology. IN A 192.168.88.247"

  local-data: "solaris.casa.lan. IN A 192.168.88.51"
  local-data: "solaris. IN A 192.168.88.51"

  local-data: "tornado.casa.lan. IN A 192.168.88.183"
  local-data: "tornado. IN A 192.168.88.183"

  local-data: "macbook.casa.lan. IN A 192.168.88.43"
  local-data: "macbook. IN A 192.168.88.43"

  local-data: "kamikaze.casa.lan. IN A 192.168.88.210"
  local-data: "kamikaze. IN A 192.168.88.210"

  local-data: "raspberrypi.casa.lan. IN A 192.168.88.200"
  local-data: "raspberrypi. IN A 192.168.88.200"


  # ==========================================
  # ZONA INVERSA: 88.168.192.in-addr.arpa
  # ==========================================
  local-zone: "88.168.192.in-addr.arpa." static
  local-data: "88.168.192.in-addr.arpa. IN SOA tormenta.casa.lan. root.casa.lan. 2026092401 3600 900 1209600 3600"
  local-data: "88.168.192.in-addr.arpa. IN NS tormenta.casa.lan."

  # Registros PTR (Inversos)
  local-data: "160.88.168.192.in-addr.arpa. IN PTR tormenta.casa.lan."
  local-data: "247.88.168.192.in-addr.arpa. IN PTR synology.casa.lan."
  local-data: "51.88.168.192.in-addr.arpa. IN PTR solaris.casa.lan."
  local-data: "183.88.168.192.in-addr.arpa. IN PTR tornado.casa.lan."
  local-data: "43.88.168.192.in-addr.arpa. IN PTR macbook.casa.lan."
  local-data: "210.88.168.192.in-addr.arpa. IN PTR kamikaze.casa.lan."
  local-data: "200.88.168.192.in-addr.arpa. IN PTR raspberrypi.casa.lan."
Actualizado el número de serie SOA a 2026092401 que coincide con la fecha de hoy (24)

Comprobar errores de sintaxis y reiniciar

unbound-checkconf /usr/local/etc/unbound/unbound.conf
service unbound restart

Verificar que los equipos nuevos responden en la resolución directa e inversa

Registros A

for equipo in tormenta synology solaris tornado macbook kamikaze raspberrypi; do
  echo "--- Probando $equipo.casa.lan ---"
  dig +short @127.0.0.1 $equipo.casa.lan
done

Registros PTR IPs a nombres

for ip in 160 247 51 183 43 210 200; do
  echo "--- Probando 192.168.88.$ip ---"
  dig +short -x 192.168.88.$ip @127.0.0.1
done

Qué debe ir realmente en el /etc/hosts de cada máquina?

El archivo /etc/hosts del sistema operativo solo se utiliza para la resolución local estática previa al DNS y para que la propia máquina se reconozca a sí misma (loopback y su propia IP). Solo se necesitan las líneas básicas de bucle local y la IP propia del host:

Archivo /etc/hosts del servidor tormenta

::1             localhost localhost.my.domain
127.0.0.1       localhost localhost.my.domain
192.168.88.160  tormenta.casa.lan tormenta
FreeBSD es genial!.

No hay comentarios:

Publicar un comentario