Delegación de zona DNS para red local usando un dominio real con DNSSEC
Por 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:
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 }