El objetivo de esta guía es mostrar cómo configurar un servidor DNS Bind9
que brinde información distinta tanto a redes privadas como públicas, mediante el uso de la funcionalidad de vistas (views
). 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.
Es común encontrarnos entornos de red, donde se necesite que un mismo servidor de nombres DNS
devuelva registros tanto de tipo canónico como direcciones IP
, dependiendo de la red desde donde se originen las consultas. Por ejemplo:
Existencia de un servidor DNS
dentro del direccionamiento TCP/IP
de la subred de servicios, o cómo se le conoce comúnmente red DMZ
, que da servicio a redes públicas (Internet
, la red externa del provedor ISP
o la VPN
externa de una organización) y redes privadas (Intranet
o red LAN
, una DMZ
, una VPN
interna, o a todas ellas). Si se realiza la consulta desde el exterior, deben devolverse los registros públicos; sin embargo, si se hace la misma consulta desde cualquiera de las subredes internas, la resolución deberá ser a un registro privado. Esto es posible lograrlo, gracias a la funcionalidad de vistas (views
) en Bind9
.
El servidor DNS
de ejemplo utilizá los siguientes parámetros de configuración de red:
- Dirección
IP
del servidor:192.168.0.1
- Dominio
DNS
:example.tld
FQDN
del servidor:ns.example.tld
- Subred interna de la zona de servicios:
192.168.0.0/24
- Subred externa para registros públicos:
172.16.0.0/29
nano /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.1/24
gateway 192.168.0.254
dns-nameservers 127.0.0.1
nano /etc/resolv.conf
domain example.tld
nameserver 127.0.0.1
nano /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.0.1 ns.example.tld ns
apt install bind9 dnsutils
Para disponer de la documentación off-line
, instalar además bind9-doc
.
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
, 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 los ficheros mencionados en el párrafo anterior en su estado por defecto, ANTES de realizar modificaciones.
- Editar fichero de configuración principal.
cp /etc/bind/named.conf{,.org}
nano /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";
- Editar parámetros para la operación del servicio.
cp /etc/bind/named.conf.options{,.org}
nano /etc/bind/named.conf.options
options {
version none;
directory "/var/cache/bind";
dnssec-validation auto;
auth-nxdomain no;
interface-interval 0;
listen-on { 127.0.0.1; 192.168.0.1; };
listen-on-v6 { none; };
allow-query { any; };
empty-zones-enable no;
forwarders { 8.8.8.8; 8.8.4.4; };
forward first;
recursion no;
prefetch 0;
pid-file "/var/run/named/named.pid";
session-keyfile "/var/run/named/session.key";
minimal-responses yes;
max-cache-size 128m;
rate-limit {
responses-per-second 15;
log-only no;
};
max-cache-ttl 60;
max-ncache-ttl 60;
flush-zones-on-shutdown yes;
};
controls {
inet 127.0.0.1 port 953
allow { localhost; 192.168.0.1; } keys { rndc-key; };
};
- Definir opciones de configuración y declaraciones de zonas del servidor
DNS
.
cp /etc/bind/named.conf.local{,.org}
nano /etc/bind/named.conf.local
acl "INTRANET" { 192.168.0.0/24; };
view "private" {
match-clients { localhost; INTRANET; };
recursion yes;
allow-recursion { localhost; INTRANET; };
allow-recursion-on { localhost; 192.168.0.1; };
include "/etc/bind/named.conf.default-zones";
zone "example.tld" {
type master;
file "/etc/bind/db.example.tld_private";
allow-query { localhost; INTRANET; };
allow-update { none; };
notify no;
};
zone "0.168.192.IN-ADDR.ARPA" {
type master;
file "/etc/bind/db.0.168.192.in-addr.arpa";
allow-query { localhost; INTRANET; };
allow-update { none; };
notify no;
};
};
view "public" {
match-clients { !INTRANET; any; };
recursion no;
include "/etc/bind/named.conf.default-zones";
zone "example.tld" {
type master;
file "/etc/bind/db.example.tld_public";
allow-query { any; };
allow-update { none; };
notify no;
};
zone "0.16.172.IN-ADDR.ARPA" {
type master;
file "/etc/bind/db.0.16.172.in-addr.arpa";
allow-query { any; };
allow-update { none; };
notify no;
};
};
NOTA: 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 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.
- Crear ficheros de zonas.
El sistema DNS
está compuesto por varios registros, conocidos como Registros de Recursos (Resource Records
o RR
, en Inglés), que definen la información en el sistema de nombres de dominio, tanto para resolución de nombre -conocida también como directa o canónica (conversión de nombre a dirección IP
)-, como para resolución de nombre inversa (conversión de dirección IP
a nombre).
- Zona directa para consultas públicas
nano /etc/bind/db.example.tld_public
;
; example.tld Public Forward Zone
;
$ORIGIN .
$TTL 1W
example.tld IN SOA ns.example.tld. postmaster.example.tld. (
2019103101 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
NS ns.example.tld.
A 172.16.0.2
MX 10 mail.example.tld.
TXT "v=spf1 ip4:172.16.0.3 a:mail.example.tld ~all"
;
$ORIGIN example.tld.
$TTL 5M
ns IN A 172.16.0.2
mail IN A 172.16.0.3
www IN A 172.16.0.4
jb IN A 172.16.0.5
;
smtp IN CNAME mail
imap IN CNAME mail
pop3 IN CNAME mail
webmail IN CNAME mail
conference IN CNAME jb
;
$ORIGIN _udp.example.tld.
$TTL 5M
_domain IN SRV 5 0 53 ns.example.tld.
;
$ORIGIN _tcp.example.tld.
$TTL 5M
_domain IN SRV 5 0 53 ns.example.tld.
_http IN SRV 5 0 80 www.example.tld.
_https IN SRV 5 0 443 www.example.tld.
_smtp IN SRV 10 0 25 smtp.example.tld.
_smtps IN SRV 10 0 465 smtp.example.tld.
_imap IN SRV 10 0 143 imap.example.tld.
_imaps IN SRV 10 0 993 imap.example.tld.
_pop3 IN SRV 10 0 110 pop3.example.tld.
_pop3s IN SRV 10 0 995 pop3.example.tld.
_submission IN SRV 10 0 587 pop3.example.tld.
_xmpp-client IN SRV 5 0 5222 jb.example.tld.
_xmpps-client IN SRV 5 0 5223 jb.example.tld.
_xmpp-server IN SRV 5 0 5269 jb.example.tld.
;
$ORIGIN _tcp.conference.example.tld.
$TTL 5M
_xmpp-server IN SRV 5 0 5269 jb.example.tld.
- Zona inversa para consultas públicas
nano /etc/bind/db.0.16.172.in-addr.arpa
;
; 0.16.172.in-addr.arpa Public Reverse Zone
;
$ORIGIN .
$TTL 1W
0.16.172.IN-ADDR.ARPA IN SOA ns.example.tld. postmaster.example.tld. (
2019103101 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
IN NS ns.example.tld.
;
$ORIGIN 0.16.172.IN-ADDR.ARPA.
$TTL 5M
2 IN PTR ns.example.tld.
3 IN PTR mail.example.tld.
PTR smtp.example.tld.
PTR imap.example.tld.
PTR pop3.example.tld.
PTR webmail.example.tld.
4 IN PTR www.example.tld.
5 IN PTR jb.example.tld.
- Zona directa para consultas privadas
nano /etc/bind/db.example.tld_private
;
; example.tld Public Forward Zone
;
$ORIGIN .
$TTL 1W
example.tld IN SOA ns.example.tld. postmaster.example.tld. (
2019103101 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
NS ns.example.tld.
A 192.168.0.1
MX 10 mail.example.tld.
TXT "v=spf1 ip4:192.168.0.2 a:mail.example.tld ~all"
;
$ORIGIN example.tld.
$TTL 5M
ns IN A 192.168.0.1
mail IN A 192.168.0.2
www IN A 192.168.0.3
jb IN A 192.168.0.4
;
smtp IN CNAME mail
imap IN CNAME mail
pop3 IN CNAME mail
webmail IN CNAME mail
conference IN CNAME jb
;
$ORIGIN _udp.example.tld.
$TTL 5M
_domain IN SRV 5 0 53 ns.example.tld.
;
$ORIGIN _tcp.example.tld.
$TTL 5M
_domain IN SRV 5 0 53 ns.example.tld.
_http IN SRV 5 0 80 www.example.tld.
_https IN SRV 5 0 443 www.example.tld.
_smtp IN SRV 10 0 25 smtp.example.tld.
_smtps IN SRV 10 0 465 smtp.example.tld.
_imap IN SRV 10 0 143 imap.example.tld.
_imaps IN SRV 10 0 993 imap.example.tld.
_pop3 IN SRV 10 0 110 pop3.example.tld.
_pop3s IN SRV 10 0 995 pop3.example.tld.
_submission IN SRV 10 0 587 pop3.example.tld.
_xmpp-client IN SRV 5 0 5222 jb.example.tld.
_xmpps-client IN SRV 5 0 5223 jb.example.tld.
_xmpp-server IN SRV 5 0 5269 jb.example.tld.
;
$ORIGIN _tcp.conference.example.tld.
$TTL 5M
_xmpp-server IN SRV 5 0 5269 jb.example.tld.
- Zona inversa para consultas privadas
nano /etc/bind/db.0.168.192.in-addr.arpa
;
; 0.168.192.in-addr.arpa Public Reverse Zone
;
$ORIGIN .
$TTL 1W
0.168.192.IN-ADDR.ARPA IN SOA ns.example.tld. postmaster.example.tld. (
2019103101 ; serial
1H ; refresh
10M ; retry
2W ; expire
1H ; negative cache ttl
)
;
IN NS ns.example.tld.
;
$ORIGIN 0.168.192.IN-ADDR.ARPA.
$TTL 5M
1 IN PTR ns.example.tld.
2 IN PTR mail.example.tld.
PTR smtp.example.tld.
PTR imap.example.tld.
PTR pop3.example.tld.
PTR webmail.example.tld.
3 IN PTR www.example.tld.
4 IN PTR jb.example.tld.
- Crear estructura para almacenamiento de trazas, bitácora de eventos.
mkdir -p /var/log/named/
chown -R bind /var/log/named/
chmod u+rw /var/log/named/
nano /etc/bind/named.conf.log
logging {
channel default_syslog {
syslog local2;
};
channel audit_log {
file "/var/log/named/audit.log" size 10m;
severity debug;
print-category yes;
print-severity yes;
print-time yes;
};
channel requests_log {
// DNS requests logging
file "/var/log/named/requests.log" size 10m;
severity debug;
print-time yes;
print-category yes;
print-severity yes;
};
channel null {
null;
};
category default { default_syslog; };
category general { audit_log; };
category security { audit_log; };
category config { audit_log; };
category resolver { audit_log; };
category xfer-in { audit_log; };
category xfer-out { audit_log; };
category notify { audit_log; };
category client { audit_log; };
category network { audit_log; };
category update { audit_log; };
category queries { requests_log; audit_log; };
category lame-servers { null; };
};
- Definir rotación de los archivos de bitácora.
nano /etc/logrotate.d/named
/var/log/named/audit.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 bind bind
postrotate
systemctl reload named > /dev/null
endscript
}
/var/log/named/requests.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 bind bind
postrotate
systemctl reload named > /dev/null
endscript
}
- Comprobar la existencia de errores tanto en la configuración como en los ficheros de zonas.
named-checkconf -z
named-checkzone example.tld /etc/bind/db.example.tld_public
named-checkzone 0.16.172.in-addr.arpa /etc/bind/db.0.16.172.in-addr.arpa
named-checkzone example.tld /etc/bind/db.example.tld_private
named-checkzone 0.168.192.in-addr.arpa /etc/bind/db.0.168.192.in-addr.arpa
- Reiniciar servicios y realizar comprobaciones.
systemctl restart logrotate named
tail -fn100 /var/log/syslog
- Comprobar correcta ejecución del servidor
netstat -tapn | grep 53
netstat -lptun
- Desde una red pública
dig example.tld
nslookup -q=any example.tld
host 172.16.0.2
dig -t SRV @example.tld _xmpp-server._tcp.example.tld
host -t SRV _imaps._tcp.example.tld
host -t MX example.tld
tail -fn100 /var/log/named_query.log
tail -fn100 /var/log/named.log
- Desde una red privada
nslookup example.tld
host ns.example.tld
dig @127.0.0.1 -x 192.168.0.1
dig -t SRV @example.tld _xmpp-client._tcp.example.tld
host -t SRV _domain._udp.example.tld
host -t NS example.tld
tail -fn100 /var/log/named_query.log
tail -fn100 /var/log/named.log
Con la introducción en Bind9
de la funcionalidad de vistas, otro mecanismo muy útil en entornos de red que brindan servicios detrás de cortafuegos, es posible presentar una configuración del servidor DNS
distinta a varios dispositivos. Algo particularmente provechoso si se ejecuta un servidor que recibe consultas desde redes privadas y públicas como es el caso de Internet
.