Admin Libre - Administración de sistemas y redes

Delegación de zona DNS para red local usando un dominio real con DNSSEC
Por Francisco Gaitán el 16 de Septiembre de 2023

Este es un método alternativo al uso del dominio home.arpa., delegando una zona de un dominio real (en este caso example.net) al router, de forma que ésta no se resuelva desde el exterior. Tiene la ventaja de ser compatible con todo tipo de dispositivos y DNSSEC.

Estoy usando OpenBSD 7.3 y los siguientes servidores:

  • nsd como servidor no recursivo para servir la zona local.example.net.
  • unbound como servidor recursivo, de validación y de almacenamiento en caché.

Zonas DNS

  • El dominio example.net ya está funcionando con DNSSEC (DNSSEC con nsd y ldns)
  • De igual forma creo una nueva zona local.example.net y la firmo
  • El router de la casa es foo.local.example.net con dirección IP 192.168.1.1

example.net

Al igual que el registro DS de example.net. se inserta en la zona net. a través del registrador, el archivo DS de la nueva zona local.example.net. se inserta en la zona example.net., especificando también el servidor DNS y el registro de pegamento con la IP.

Esta zona la sirven los servidores públicos NS1 y NS2. He usado como servidores autoritativos ns1.example.com y ns2.example.com:

$TTL 3600
$ORIGIN example.net.

@       IN      SOA     ns1.example.net. hostmaster.example.net. (
                        2023091501     ; serial
                        14400           ; refresh
                        7200           ; retry
                        1814400        ; expire
                        3600 )         ; negative

		NS      ns1.example.com.
		NS      ns2.example.com.

; DS de la zona local.example.net.
local		IN	DS	24844 13 2 72996eb307417cec167ca88e4fa1af224dcedf6bce79e1b06ca2da85fcbe1168
local		IN	NS	foo.local.example.net.
foo.local	IN	A	192.168.1.1

local.example.net

Esta zona la servirá el router de la red local con nsd en el puerto 8053. Una vez creada hay que firmarla con ldns-signzone si se usa DNSSEC.

$TTL 3600
$ORIGIN local.example.net.

@	IN	SOA	foo.local.example.net.	hostmaster.example.net. (
                        2023091600      ; serial
                        7200            ; refresh
                        7200            ; retry
                        1814400         ; expire
                        3600 )          ; negative

	NS      foo.local.example.net.

foo	IN	A	192.168.1.1    
bar	IN	A	192.168.1.2
baz	IN	A	192.168.1.3

1.168.192.in-addr.arpa

Esta zona corresponde al DNS reverso de la red local y no lleva nada relacionado con DNSSEC. También la servirá nsd en el puerto 8053.

$TTL 3600
1.168.192.in-addr.arpa. IN SOA foo.local.example.net. hostmaster.example.net. (
                        2023091600      ; serial
                        7200            ; refresh
                        7200            ; retry
                        1209600         ; expire
                        3600 )          ; negative

        IN      NS      foo.local.example.net.

1	IN	PTR	foo.local.example.net.
2	IN	PTR	bar.local.example.net.
3	IN	PTR	baz.local.example.net.

Configuración de nsd en el router

nsd se encargará de servir la zona de la red local y la zona correspondiente al DNS reverso.

  • Escuchará en el puerto 8053 de la interfaz de red
  • El archivo de configuración es nsd.conf(5)
  • Las zonas local.example.net.signed y 1.168.192.in-addr.arpa irán al directorio /var/nsd/zones/master
server:
        hide-version: yes
        verbosity: 2
        database: "" # disable database
        server-count: 1
        ip-address: 192.168.1.1@8053

remote-control:
        control-enable: yes
        control-interface: /var/run/nsd.sock

zone:
        name: "local.example.net"
        zonefile: "master/local.example.net.signed"

zone:
        name: "1.168.192.in-addr.arpa"
        zonefile: "master/1.168.192.in-addr.arpa"

Configuración de unbound en el router

Al ser un servidor DNS recursivo, unbound se encargará de resolver todas las consultas DNS, reenviando a nsd las que correspondan a la red local.

  • El archivo de configuración es unbound.conf(5)
  • Las consultas locales las reenvía al servidor nsd en el puerto 8053
  • Está activada la validación DNSSEC
server:
        interface: 192.168.1.1
        do-ip6: no
        access-control: 127.0.0.0/8 allow
        access-control: 192.168.1.0/24 allow
        hide-identity: yes
        hide-version: yes
        prefetch: yes
        auto-trust-anchor-file: "/var/unbound/db/root.key"
        val-log-level: 1 
        aggressive-nsec: yes
        local-zone: "1.168.192.in-addr.arpa." transparent

remote-control:
        control-enable: yes
        control-interface: 127.0.0.1

forward-zone:
        name: "local.example.net"
        forward-addr: 192.168.1.1@8053

forward-zone:
        name: "1.168.192.in-addr.arpa."
        forward-addr: 192.168.1.1@8053

Como comprobar que funciona

$ host foo.local.example.net
foo.local.example.net has address 192.168.1.1
$ host 192.168.1.1
1.1.168.192.in-addr.arpa domain name pointer foo.local.example.net.

DNSSEC

Si la validación DNSSEC es correcta aparecerá el flag 'ad':

$ dig @192.168.10.1 foo.local.example.net

; <<>> dig 9.10.8-P1 <<>> foo.local.example.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21508
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;foo.local.example.net.     IN      A

;; ANSWER SECTION:
foo.local.example.net. 3600 IN      A       192.168.1.1

;; Query time: 126 msec
;; SERVER: 192.168.10.1#53(192.168.10.1)
;; WHEN: Sun Sep 17 00:07:58 CEST 2023
;; MSG SIZE  rcvd: 59

Configuración en el cliente

Esta sería la configuración en sistemas tipo UNIX con resolv.conf(5):

nameserver 192.168.1.1
lookup file bind
search local.example.net example.net
  • Envía las consultas DNS al servidor 192.168.1.1
  • Consulta el archivo /etc/hosts y el servidor dns (en ese orden)
  • Busca en primer lugar hosts en el dominio local.example.net y si no lo encuentra en example.net

De esta forma se puede acceder a bar sin especificar el dominio:

$ host bar
bar.local.adminlibre.net has address 192.168.10.2

unwind

Si se usa unwind hay que desactivar la validación para la zona de DNS reverso como indica unwind.conf(5):

[...]
force accept bogus forwarder { 1.168.192.in-addr.arpa }

Destacado

Contacto

Si has encontrado algún error o quieres comentarme algo mándame un correo a webmaster@adminlibre.org