Skip to content

kurosaki1976/bind9-views

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

64 Commits
 
 
 
 

Repository files navigation

Configuración de un servidor DNS Bind9 con vistas en Debian 12

Autor

Resumen

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.

Escenario

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.

Administración del servidor

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

Ajustes de los parámetros de red

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

Instalación

apt install bind9 dnsutils

Para disponer de la documentación off-line, instalar además bind9-doc.

Configuración

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 servicio BIND en Debian. 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.

  1. 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";
  1. 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; };
};
  1. 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.

  1. 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.
  1. 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
}
  1. 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
  1. 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

Conclusiones

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.

Referencias