El objetivo de este tutorial es mostrar cómo configurar un servidor DNS Bind9
que funcione como provedor (delegar responsabilidad de subdominios a otros servidores) y servidor con zonas delegadas. Como tutorial en sí, se le guiará a través de todo el proceso de configuración, pero se requieren conocimientos iniciales de DNS
y Bind9
. En las referencias, encontrará enlaces a sitios de Internet
que le pueden ayudar.
NOTA: La implementación de esta configuración ayuda a los administradores de red cubanos a mitigar la vulnerabilidad
DDoS por Amplificación de DNS
, notificada por la OSRI, como consecuencia de la recursividad en servidores DNS.
El sistema de nombres de dominio DNS permite dividir un espacio de nombres DNS
en zonas, que almacenan información de nombres de uno o varios dominios DNS
. Para cada nombre de dominio DNS
incluido en una zona, la zona pasa a ser el origen autorizado de la información acerca de ese dominio.
Debido al importante papel que desempeñan las zonas en DNS
, se pretende que éstas estén disponibles desde varios servidores DNS
en la red para proporcionar disponibilidad y tolerancia a errores al resolver consultas de nombres. En caso contrario, si sólo se utiliza un servidor y éste no responde, se pueden producir errores en las consultas de nombres de la zona. Para que otros servidores alojen una zona, son necesarias transferencias de zona que repliquen y sincronicen todas las copias de la zona utilizadas en cada servidor configurado para alojar la zona.
Una zona se inicia como una base de datos de almacenamiento para un único nombre de dominio DNS
. Si se agregan otros dominios bajo el dominio utilizado para crear la zona, estos dominios pueden formar parte de la misma zona o pertenecer a otra zona. Después de agregar un subdominio, se puede: administrarlo e incluirlo como parte de los registros de la zona original, o bien delegarlo a otra zona creada para admitir el subdominio.
Por tanto, se pueden definir dos métodos o estrategias de delegación de subdominios:
-
Delegación completa de subdominios
En este caso, se deben agregar al archivo de zona directa del dominio superior, los correspondientes registros
NS
, según el tipo; los registrosA
óAAAA
-conocidos como (glue records
)-, y uno o más servidores de nombres para los subdominios; así como crear los archivos de zona por cada inversa gestionada.NOTA: Tiene como ventaja que cualquier cambio, sólo requerirá una recarga de la zona principal o el subdominio, respectivamente.
-
Creación de subdominios virtuales o pseudo dominios
En este caso, se definirá la configuración de los subdominios, así como la configuración de la zona principal; en un mismo archivo de zona de dominio.
NOTA: Significa que la definición del dominio principal y la de los subdominios se incluyen en un archivo de zona única; no requiere nuevos servidores de nombres, ni registros
NS
niglue records
de tipoA / AAAA
. Lo negativo es que cualquier cambio en la zona principal o en los subdominios requerirá una recarga total de la primera.
El escenario ejemplo lo constituye una red corporativa, donde el nodo principal administra la zona example.tld
con direccionamiento IPv4 172.16.0.0/16
, y ha decidido delegar la responsabilidad del subdomino foo.example.tld
conjuntamente con la subred 172.16.23.192/29
. Teniendo en cuenta lo anterior podemos definir los siguientes parámetros:
-
Dominio de nivel superior
- Zona
DNS
:example.tld
- Zona inversa:
16.172.in-addr.arpa
FQND
servidorDNS
primario:ns1.example.tld
- Dirección
IP
servidorDNS
primario:172.16.0.18
FQND
servidorDNS
secundario:ns2.example.tld
- Dirección
IP
servidorDNS
secundario:172.16.2.18
- Zona
-
Subdominio delegado
- Subdominio
DNS
:foo.example.tld
FQND
servidorDNS
:ns.foo.example.tld
- Subred:
192/29.23.16.172.in-addr.arpa
- Dirección
IP
servidorDNS
:172.16.23.194
- Subdominio
En las distribuciones Debian GNU/Linux
, los ficheros de configuración del paquete bind9
, se encuentran en /etc/bind
. Ellos son: named.conf
(fichero de configuración principal), named.conf.default-zones
(contiene las zonas predefinidas de reenvío (forward
), inversa (reverse
) y difusión (broadcast
) para el localhost
), named.conf.options
(contiene todos los parámetros para la operación del servicio), y named.conf.local
(contiene las opciones de configuración y las declaraciones de zonas del servidor DNS
local).
NOTA: Es importante leer el archivo
/usr/share/doc/bind9/README.Debian.gz
antes de realizar modificaciones en los ficheros mencionados en el párrafo anterior, para obtener información sobre la estructura de los archivos de configuración del servicioBIND
enDebian
. De igual forma es una buena práctica realizar copias de seguridad de esos ficheros en su estado por defecto.
apt install bind9 dnsutils
NOTA: Para disponer de la documentación
off-line
, instalar ademásbind9-doc
.
- Ficheros de configuración
/etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.log";
include "/etc/bind/rndc.key";
/etc/bind/named.conf.options
options {
version none;
directory "/var/cache/bind";
dnssec-validation auto;
listen-on { 172.16.0.18; 127.0.0.1; };
auth-nxdomain no;
listen-on-v6 { none; };
empty-zones-enable no;
allow-query { any; };
recursion yes;
minimal-responses yes;
max-cache-size 128m;
rate-limit {
responses-per-second 15;
log-only no;
};
flush-zones-on-shutdown yes;
prefetch 0;
allow-transfer { none; };
};
controls {
inet 127.0.0.1 port 953
allow { localhost; 172.16.0.18; } keys { rndc-key; };
};
/etc/bind/named.conf.local
view "proveedor" {
match-clients { localhost; 172.16.0.0/16; };
recursion yes;
allow-recursion { localhost; 172.16.0.0/16; };
allow-recursion-on { localhost; 172.16.0.1; };
include "/etc/bind/named.conf.default-zones";
zone "example.tld" {
type master;
file "/etc/bind/db.example.tld";
allow-transfer { 172.16.2.18; };
also-notify { 172.16.2.18; };
notify yes;
};
zone "0.16.172.in-addr.arpa" {
type master;
file "/etc/bind/db.0.16.172.in-addr.arpa";
allow-transfer { 172.16.2.18; };
also-notify { 172.16.2.18; };
notify yes;
};
zone "2.16.172.in-addr.arpa" {
type slave;
file "/etc/bind/db.2.16.172.in-addr.arpa";
allow-transfer { 172.16.2.18; };
also-notify { 172.16.2.18; };
notify yes;
};
zone "23.16.172.in-addr.arpa" {
type master;
file "/etc/bind/db.23.16.172.in-addr.arpa";
allow-transfer { 172.16.2.18; };
also-notify { 172.16.2.18; };
notify yes;
};
};
- Ficheros de declaración de zonas
/etc/bind/db.example.tld
;
; example.tld DNS Domain Zone File
;
$ORIGIN .
$TTL 1W
example.tld IN SOA ns1.example.tld. postmaster.example.tld. (
2019091201 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
NS ns1.example.tld.
NS ns2.example.tld.
A 172.16.0.18
A 172.16.2.18
MX 10 mx.example.tld.
TXT "v=spf1 ip4:172.16.0.10 a:mx.example.tld ~all"
;
$ORIGIN example.tld.
$TTL 5M
ns1 IN A 172.16.0.18
mx IN A 172.16.0.10
ns2 IN A 172.16.2.18
;
; subdominio delegado "foo.example.tld"
$ORIGIN foo.example.tld.
$TTL 5M
@ IN NS ns.foo.example.tld.
A 172.16.23.194
ns IN A 172.16.23.194
/etc/bind/db.0.16.172.in-addr.arpa
;
; 172.16.0.0/24 Reverse Zone File
;
$ORIGIN .
$TTL 1W
0.16.172.IN-ADDR.ARPA IN SOA ns1.example.tld. postmaster.example.tld. (
2019091001 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
NS ns1.example.tld.
NS ns2.example.tld.
;
$ORIGIN 0.16.172.in-addr.arpa.
$TTL 5M
18 IN PTR ns1.example.tld.
10 IN PTR mx.example.tld.
/etc/bind/db.2.16.172.in-addr.arpa
;
; 172.16.2.0/24 Reverse Zone File
;
$ORIGIN .
$TTL 1W
2.16.172.IN-ADDR.ARPA IN SOA ns1.example.tld. postmaster.example.tld. (
2019091001 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
NS ns1.example.tld.
NS ns2.example.tld.
;
$ORIGIN 2.16.172.in-addr.arpa.
$TTL 5M
18 IN PTR ns2.example.tld.
/etc/bind/db.23.16.172.in-addr.arpa
;
; 172.16.23.0/24 Reverse Zone File
;
$ORIGIN .
$TTL 1W
23.16.172.IN-ADDR.ARPA IN SOA ns1.example.tld. postmaster.example.tld. (
2019091001 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
NS ns1.example.tld.
NS ns2.example.tld.
;
; zona inversa delegada "172.16.23.192/29"
; usando "/" sintaxis de CIDR y macro $GENERATE
$ORIGIN 23.16.172.IN-ADDR.ARPA.
$TTL 5M
192/29 IN NS ns.foo.example.tld.
$GENERATE 192-199 $ CNAME $.192/29.23.16.172.IN-ADDR.ARPA.
; o abreviando
$GENERATE 192-199 $ CNAME $.192/29
NOTA: La sintaxis
192/29
es un modo artificial (pero legítimo) para la construcción de zonas inversas delegadas. Antes del RFC 2181 el símbolo/
no era un caracter legal para ser usado en el sistema de nombres de dominio, en su lugar se usaba el símbolo-
.
Entonces es válido también realizar la delegación de esta forma:
; zona inversa delegada "172.16.23.192/29"
; usando "-" sintaxis de rango y macro $GENERATE
$ORIGIN 23.16.172.IN-ADDR.ARPA.
192-199 IN NS ns.foo.example.tld.
$GENERATE 192-199 $ CNAME $.192-199.23.16.172.IN-ADDR.ARPA.
; o abreviando
$GENERATE 192-199 $ CNAME $.192-199
- Ficheros de configuración
/etc/bind/named.conf
Igual que el servidor primario.
/etc/bind/named.conf.options
Cambiar
listen-on { 172.16.2.18; 127.0.0.1; };
yallow { localhost; 172.16.2.18; } keys { rndc-key; };
.
/etc/bind/named.conf.local
view "proveedor" {
match-clients { localhost; 172.16.0.0/16; };
recursion yes;
allow-recursion { localhost; 172.16.0.0/16; };
allow-recursion-on { localhost; 172.16.2.18; };
include "/etc/bind/named.conf.default-zones";
zone "example.tld" {
type slave;
file "/etc/bind/db.example.tld";
masters { 172.16.0.18; };
};
zone "0.16.172.in-addr.arpa" {
type slave;
file "/etc/bind/db.0.16.172.in-addr.arpa";
masters { 172.16.0.18; };
};
zone "2.16.172.in-addr.arpa" {
type slave;
file "/etc/bind/db.2.16.172.in-addr.arpa";
masters { 172.16.0.18; };
};
zone "23.16.172.in-addr.arpa" {
type slave;
file "/etc/bind/db.23.16.172.in-addr.arpa";
masters { 172.16.0.18; };
};
};
- Ficheros de declaración de zonas
Se obtienen por transferencia desde el servidor primario. Para forzar la transferencia de todas las zonas, ejecutar
rndc reload
, y para una específicarndc reload 23.16.172.in-addr.arpa
. Para el buen funcionamiento de las transferencias, tiene que existir comunicación a través del puertotcp/udp 53
, entre los servidores.
- Ficheros de configuración
/etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.log";
include "/etc/bind/rndc.key";
/etc/bind/named.conf.options
options {
version none;
directory "/var/cache/bind";
dnssec-validation auto;
listen-on { 172.16.23.194; 127.0.0.1; };
auth-nxdomain no;
listen-on-v6 { none; };
forwarders { 172.16.0.18; 172.16.2.18; };
forward first;
empty-zones-enable no;
allow-query { any; };
recursion no;
minimal-responses yes;
max-cache-size 128m;
rate-limit {
responses-per-second 15;
log-only no;
};
flush-zones-on-shutdown yes;
prefetch 0;
};
controls {
inet 127.0.0.1 port 953
allow { localhost; 172.16.23.194; } keys { rndc-key; };
};
/etc/bind/named.conf.local
view "cliente" {
match-clients { localhost; 172.16.0.0/16; };
recursion no;
include "/etc/bind/named.conf.default-zones";
zone "foo.example.tld" {
type master;
file "/etc/bind/db.foo.example.tld";
allow-update { none; };
notify no;
};
zone "192/29.23.16.172.in-addr.arpa" {
type master;
file "/etc/bind/db.23.16.172.in-addr.arpa";
allow-update { none; };
notify no;
};
};
NOTA: Si se usa
-
(sintaxis de rango), la definición de la zona inversa seríazone "192-199.23.16.172.in-addr.arpa"
.
- Ficheros de declaración de zonas
/etc/bind/db.foo.example.tld
;
; foo.example.tld DNS Domain Zone File
;
$ORIGIN .
$TTL 1W
foo.example.tld IN SOA ns.foo.example.tld. postmaster.foo.example.tld. (
2019091201 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
NS ns.foo.example.tld.
A 172.16.23.195
MX 10 mail.foo.example.tld.
TXT "v=spf1 ip4:172.16.23.195 a:mail.foo.example.tld include:example.tld ~all"
;
$ORIGIN foo.example.tld.
$TTL 5M
router IN A 172.16.23.193
ns IN A 172.16.23.194
mail IN A 172.16.23.195
www IN A 172.16.23.196
jb IN A 172.16.23.197
ftp IN A 172.16.23.198
/etc/bind/db.23.16.172.in-addr.arpa
;
; 172.16.23.192/29 Reverse Zone File
;
$ORIGIN .
$TTL 1W
192/29.23.16.172.IN-ADDR.ARPA IN SOA ns.foo.example.tld. postmaster.foo.example.tld. (
2019091001 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
NS ns.foo.example.tld.
;
$ORIGIN 192/29.23.16.172.IN-ADDR.ARPA.
$TTL 5M
193 IN PTR router.foo.example.tld.
194 IN PTR ns.foo.example.tld.
195 IN PTR mail.foo.example.tld.
196 IN PTR www.foo.example.tld.
197 IN PTR jb.foo.example.tld.
198 IN PTR ftp.foo.example.tld.
NOTA: Si se usa
-
(sintaxis de rango), la definición de la zona inversa sería192-199.23.16.172.IN-ADDR.ARPA
.
Fichero /etc/bind/named.conf.log
para almacenamiento de trazas, bitácora de eventos.
logging {
channel "named-query" {
file "/var/log/named_query.log" versions 1 size 5m;
severity debug 3;
print-time yes;
};
channel "debug" {
file "/var/log/named.log" versions 1 size 3m;
print-time yes;
print-category yes;
};
category "queries" { "named-query"; };
category "client" { "debug"; };
category "config" { "debug"; };
category "database" { "debug"; };
category "default" { "debug"; };
category "dispatch" { "debug"; };
category "dnssec" { "debug"; };
category "general" { "debug"; };
category "lame-servers" { "debug"; };
category "network" { "debug"; };
category "notify" { "debug"; };
category "resolver" { "debug"; };
category "security" { "debug"; };
category "unmatched" { "debug"; };
category "update" { "debug"; };
category "xfer-in" { "debug"; };
category "xfer-out" { "debug"; };
};
- Comprobar la existencia de errores tanto en la configuración como en los ficheros de zonas.
named-checkconf -z
- Servidor
DNS
nivel superior
named-checkzone example.tld /etc/bind/db.example.tld
named-checkzone 0.16.172.IN-ADDR.ARPA /etc/bind/db.0.16.172.in-addr.arpa
named-checkzone foo.example.tld /etc/bind/db.example.tld
named-checkzone 23.16.172.IN-ADDR.ARPA /etc/bind/db.23.16.172.in-addr.arpa
- Servidor
DNS
subzonas de dominio e inversa delegadas
named-checkzone foo.example.tld /etc/bind/db.foo.example.tld
named-checkzone 192/29.23.16.172.IN-ADDR.ARPA /etc/bind/db.23.16.172.in-addr.arpa
NOTA: Si se usa
-
(sintaxis de rango), la comprobación seríanamed-checkzone 192-199.23.16.172.IN-ADDR.ARPA /etc/bind/db.23.16.172.in-addr.arpa
.
- Reiniciar el servicio y realizar comprobaciones.
systemctl restart bind9.service
tail -fn100 /var/log/syslog
dig example.tld
host ns2.example.tld
dig foo.example.tld
host ns.foo.example.tld
host 172.16.23.194
dig +short 194.192/29.23.16.172.in-addr.arpa ptr
-
Cuando se utiliza las funcionalidad de vistas, todas las definiciones de zonas TIENEN que estar contenidas dentro de éstas, de lo contrario el servicio no iniciará y generará códigos de error. Es por ello que -en ambas configuraciones-, el fichero
/etc/bind/named.conf.default-zones
fue incluido en cada definición de vista y no en el fichero de configuración principal. -
En el caso de la delegación de zonas, la recursividad es obligatoria en el ámbito del proveedor, sin importar el uso o no de la funcionalidad de vistas. Ello se debe a que la consulta es redirigida desde el servidor
DNS
responsable de la zona principal hacia el responsable de la subred delegada, y viceversa. -
Las configuraciones mostradas en esta guía utilizan la estrategia de delegación completa de subdominios, y son aplicables a los entornos de red
VPN
corporativas existentes en Cuba. -
La delegación completa tiene como inconveniente que si los servidores de nombre del subdominio delegado llegan a estar inalcanzables, la resolución no tendrá éxito; por eso es común encontrarnos en Cuba con configuraciones que incluyen la transferecia de zonas.
- Bind9 - Debian Wiki
- HOWTO - Delegate a Sub-domain (a.k.a. subzone)
- HOWTO - Configure Sub-domains (a.k.a subzones)
- 3. DNS Reverse Mapping
- $GENERATE Directive
- Internet Systems Consortium
- Clarifications to the DNS Specification
- Domain Name System Structure and Delegation
- Classless IN-ADDR.ARPA delegation
- Classless in-addr.arpa subnet delegation
- Classless reverse address delegation
- Configure BIND as a slave DNS server