Por: Jose G. Cotua (@SimeonSpa) / Alejandro Acosta (@ITandNetworking)

1) Introducción

El siguiente artículo presenta de manera ordenada los pasos a seguir y consideraciones a tener para administrar un servidor DNS IPv6 Only.

En el siguiente post intentaremos cubrir varios aspectos básicos, principales funciones y otras funcionalidades. Sin embargo, es importante recordar que existen muchas funcionalidades adicionales que hay que considerar.

2) Prerrequisitos

Este artículo trata de la administración y operación de un servidor DNS en sistema operativo GNU/Linux, con una instalación orientada a servidor. Para este estudio usaremos el servidor DNS BIND9 (link oficial: https://www.isc.org/bind/), instalado sobre S.O. Debian. BIND9 es uno de los servidores DNS más ampliamente utilizados en ambientes de redes de ISP y operadores de red. Iniciamos el análisis asumiendo que ya tiene instalado en su linux el servidor BIND9, preferiblemente en una versión actualizada y/o superior a v9.10. No obstante, los conceptos aquí analizados son aplicables a cualquier servidor DNS en cualquier sabor de distribución de linux e incluso en cualquier otro servidor DNS.

Servidor Linux: BIND9, operando en sistema operativo Debian GNU/Linux.

De igual manera, asumimos que el lector está familiarizado con los conceptos básicos de operación y configuración de servidores en ambientes GNU/Linux y la operación básica de BIND9, como la configuración de opciones, configuración de zonas, entre otros.

3) Topología de Red a Utilizar para el Estudio

Información de direccionamiento IPv6 de la Topología:

  • Prefijo de Red Clientes: 2001:db8:abcd::/48
  • Servidor DNS Recursivo: 2001:db8:123::2
  • Servidores DNS Autoritativos: 2001:db8:cafe::2 y 2001:db8:cafe::3

Información importante para comprender mejor este documento:

Archivos de configuración que utilizaremos:

/etc/bind/named.conf


/etc/bind/named.conf.options


/etc/bind/named.conf.default-zones 

4) Configuración General y Primeros Pasos

  1. Lo primero es asegurarnos que tenemos Bind9 instalado. Lo podemos revisar con el el siguiente comando en nuestra consola Linux:

    #named -v

BIND 9.16.15-Debian (Stable Release) <id:4469e3e>

También, podemos ejecutar el siguiente comando para validar que el servidor Bind9 esté activo y operando normalmente:


_#systemctl status named_

_named.service - BIND Domain Name Server_

_Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)_
_Active: active (running) since Tue 2022-MM-DD HH:MM:SS UTC; 1 day 8h ago_
_Docs: man:named(8)_
_Main PID: 2779031 (named)_
_Tasks: 26 (limit: 9507)_
_Memory: 156.5M_
_CPU: 2min 8.314s_
_CGroup: /system.slice/named.service_
_└─2779031 /usr/sbin/named -f -u bind_


Este comando nos muestra no solamente el status de la operación del servidor Bind9, sino también parámetros como PID, memoria, uptime, entre otros. 
  1. Luego, debemos revisar la configuración del direccionamiento IPv6 del servidor. Para ello es importante conocer con cuáles interfaces cuenta el servidor Linux y sus direcciones IP. Es importante de igual manera conocer con antelación la dirección IPv6 donde deseamos que Bind9 escuche conexiones entrantes y aquellas desde las cuales se harán las conexiones salientes.

    Es común incluso utilizar interfaces de tipo ‘bridge’ en linux para configurar direccionamiento IPv6 a objeto de que sean utilizadas por Bind9. Esta práctica es recomendada para evitar ‘flapping’ e incrementar la estabilidad del servicio DNS.

    Hay muchas maneras de gestionar las interfaces y el direccionamiento IPv6 de un servidor Debian Linux, a continuación recordamos algunos de los más ampliamente utilizados:

Ver las interfaces de red del servidor:

#ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

link/ether 9e:11:7b:f0:98:b9 brd ff:ff:ff:ff:ff:ff

altname enp0s18

3: loopback: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000

link/ether 4e:c0:be:49:cb:23 brd ff:ff:ff:ff:ff:ff

Ver las direcciones IPv6 configuradas en el servidor:

#ip -6 address show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000

inet6 2001:db8:cafe::2/64 scope global

valid_lft forever preferred_lft forever

inet6 fe80::9c11:7bff:fef0:98b9/64 scope link

valid_lft forever preferred_lft forever

Los comandos anteriores permiten observar el direccionamiento IPv6 y las interfaces de red del servidor. En nuestro caso, usaremos la interfaz ens18 con la IPv6 2001:db8:cafe::2/64 (GUA). Note que adicionalmente podemos observar el direccionamiento LLA (LLA: Link Local Address) de las interfaces.

Conocer de manera precisa las interfaces de red del servidor y el direccionamiento IPv6 de cada una de ellas es un insumo importante a la hora de realizar troubleshooting, tanto del servidor linux como de Bind9.

5) Conceptos básicos de DNS: Servidor Autoritativo versus Servidor Recursivo

Recordemos que existen muchos tipos de servidores DNS, siendo los más comunes los servidores recursivos y servidores autoritativos.

Según dnslookup.es [2]:

Un servidor DNS autoritativo: es aquel que tiene una respuesta en su base de datos local para un dominio sobre el que se le pregunte.

Un servidor con recursión: es aquél que cuando no encuentra una respuesta en su base de datos local para un dominio intenta consultarlo con otros servidores DNS para tratar de resolver la petición que se le hace.

Volviendo a nuestro ejemplo (ver topología) será:

  • El Servidor DNS Recursivo le ofrece servicio DNS a los clientes de la red: 2001:db8:abcd::/48
  • Los Servidores autoritativos tienen la autoridad para el dominio example.com.
  • Adicionalmente el server 2001:db8:cafe::3 copia la zona vía “zone transfer” del 2001:db8:cafe::2

6) Configuración de un Servidor DNS Recursivo IPv6 Only

Paso 1:

Visto y asegurado el tema de las interfaces de red, del direccionamiento IPv6 del servidor linux y de la operación normal de Bind9, debemos comenzar la configuración de Bind9 para asegurarnos en primera instancia que escuche en IPv6 y permita conexiones entrantes desde la red 2001:db8:abcd::/48.

El archivo de configuración principal del servidor Bind9 es ‘/etc/bind/named.conf’. Lo que hacemos es configurar los parámetros adecuados de IPv6 en la sección ‘options{ …};’ ubicada en la primera parte de este archivo. Es posible utilizar la directiva ‘include’ dentro del archivo de configuración para citar a otros archivos y programar más organizadamente las configuraciones en su totalidad, usando varios archivos y segmentando la configuración a conveniencia.

La configuración de la sección ‘options { … };’ para operación IPv6 se ilustra a continuación:

options {

directory “/var/cache/bind”;

forwarders {

2001:db8:db8::8888;

2001:db8:db8::8844;

};

listen-on-v6 { any; };

query-source-v6 address 2001:db8:cafe::2;

listen-on-v6 { ::1; 2001:db8:cafe::2; };

recursion yes;

…;

};

Por simplicidad y solo para enfocarnos en la configuración para IPv6 hemos colocado únicamente los parámetros de IPv6.

A continuación, una breve explicación de los parámetros de configuración IPv6 más importantes:

  • La opción ‘forwarders { 2001:db8:db8::8888; 2001:db8:db8::8844; };’ es opcional y la colocamos solo si queremos hacer forwarding de TODAS las consultas DNS a otro servidor DNS. En este caso hemos configurado dos (02) servidores de reenvío en IPv6.
  • La opción _‘listen-on-v6 { any; };’ _permite especificarle a Bind9 las direcciones IPv6 en las que quiero que escuche peticiones DNS IPv6. Podemos dejarla con la directiva ‘any’ especificando a Bind9 que escuchará en toda dirección IPv6 configurada en el servidor linux, incluso en la localhost6 ‘::1’. También, podemos explicitar las direcciones IPv6 en las que quiero que Bind9 escuche, indicándose las direcciones IPv6 separadas por ‘;’. Por ejemplo:

    listen-on-v6 { ::1; 2001;db8:cafe::2; };

    Claramente, toda dirección IPv6 especificada acá debe estar previamente configurada en una interfaz del servidor linux.

  • La opción ‘query-source-v6 address 2001:db8:cafe::2;’ permite especificar la(s) dirección(es) IPv6 desde las cuales Bind9 establecerá conexiones salientes. Las conexiones salientes son fundamentales para resolver DNS, sea vía ‘forwarding’ o de manera recursiva.

Es importante destacar que toda vez hecha actualizaciones de la configuración del archivo ‘/etc/bind/named.conf’ debemos aplicar dichos cambios o bien reiniciando el servidor Bind9 o recargando su configuración, a continuación los comandos:

#systemctl reload named

#systemctl restart named

Luego de aplicar los cambios, podemos ejecutar los siguientes comandos para validar que Bind9 está escuchando en las direcciones IPv6 configuradas:

_#netstat -puan grep named_

Paso 2:

Debemos permitir la recursividad a nuestros clientes. Específicamente, a los clientes de la red 2001:db8:abcd::/48. Para permitir recursividad se utiliza la directiva ‘allow-recursion’, hay que tener en cuenta que el comportamiento de esta directiva ha cambiado en las versiones más recientes de Bind. Lo que hacemos en este caso es crear un ACL con el direccionamiento IPv6 de la red cliente y le aplicamos la directiva, de la siguiente manera:

_;;;Configuración de Bind9, archivo /etc/bind/named.conf, para recursión. _

_acl my_ipv6_net { _

2001:db8:abcd::/48;

};

options {

recursion yes;

allow-recursion { my_ipv6_net; };

};

Con el ejemplo anterior estamos creando un ACL llamado_ ‘my_ipv6net’ y posteriormente permitiendo recursión a dicho ACL. Es decir, nuestros clientes podrán utilizar el servidor perfectamente.

Como recomendación de seguridad importante: por favor nunca utilizar la opción ‘allow-recursion { any; }’, ya que haciendo esto estaríamos creando un servidor ‘Open Resolver’ con todo lo que ello implica,

7) Configuración de un Servidor DNS Autoritativo IPv6 Only

Paso 1: configuración general y básica.

De la misma manera que hicimos para un servidor DNS recursivo, debemos asegurarnos que Bind9 escuche y permita conexiones adecuadamente en IPv6. Es decir, la configuración de red IPv6 del servidor y la configuración general y básica de Bind9 se mantiene.

Paso 2: configuración para ‘solo’ autoritativo.

Si queremos que Bind9 sea ‘SOLO’ autoritativo y no permita recursión, debemos configurar el archivo ‘/etc/bind/named.conf’ con las siguientes opciones:

options {

directory “/var/cache/bind”;

forwarders {

2001:db8:db8::8888;

2001:db8:db8::8844;

};

listen-on-v6 { any; };

query-source-v6 address 2001:db8:cafe::2;

listen-on-v6 { ::1; 2001:db8:cafe::2; };

_recursion no; _

…;

};

Paso 3: .

Como el servidor DNS es autoritativo, debemos establecer la configuración de la zona ‘example.com’ en el archivo ‘/etc/bind/named.conf’. Esto, lo hacemos de la siguiente manera:

options {

…;

};

zone “example.com” {

type master;

file “/etc/bind/example.com.db”;

};

Nota importante: un servidor DNS puede ser autoritativo y de recursividad simultáneamente, pero dicha configuración debe contemplar un análisis más riguroso de aspectos de seguridad.

8) Configuración de Zone-Transfer

Configuración en el servidor DNS Primario (Master)

En la configuración del archivo ‘/etc/bind/named.conf’ del Servidor DNS Primario, le indicamos que es master y definimos el direccionamiento IPv6 de los que tienen permitido solicitar zone-transfer.

A continuación la configuración correspondiente::

options {

…;

};

zone “example.com” {

_ type master;_

_ file “/etc/bind/zones/example.com.db”;_

_ allow-transfer { 2001:db8:cafe::3; };_

};

Configuración en el servidor DNS Secundario (Slave)

En la configuración del archivo ‘/etc/bind/named.conf’ del Servidor DNS Secundario, le especificamos que es slave y el direccionamiento IPv6 de los servidores master.

A continuación la configuración correspondiente::

options {

…;

};

zone “example.com” {

type slave;

file “example.com.db”;

masters { 2001:db8:cafe::2; };

};

9) Resumen de la Configuración de Bind9 para IPv6 Only

10) Resumen de los Comandos para Operación del Servidor Linux y Bind9

Gestión de Interfaces y Direccionamiento IPv6

ip link show

ifconfig -a

ip -6 address show

ip -6 route show

Gestión de Bind9

systemctl status named

systemctl reload named

systemctl restart named

Ver Procesos y Binding de Bind9

netstat -puan | grep named

Probar el DNS IPv6 Localmente

nslookup www.google.com ::1

nslookup www.google.com 2001:db8:cafe::2

nslookup -type=AAAA www.google.com ::1

dig @::1 AAAA www.google.com

11) Errores comunes a la hora de implementar un Servidor DNS IPv6

  • Errores de tipeo en la configuración del archivo ‘/etc/bind/named.conf’, sobre todo en las opciones que terminan o usan el símbolo ‘;’. Por ello,s e recomienda ser muy cuidadoso a la hora de editar y crear configuraciones.
  • Usar inapropiadamente las opciones de recursividad y de servidor autoritativo de Bind9, colocándolo como un ‘Open Resolver’ con todas las implicaciones de seguridad asociadas.
  • No validar apropiadamente las direcciones IPv6 del servidor y no hacerlas coincidir en las configuraciones del Bind9.
  • Hacer que el servidor Bind9 escuche en direcciones IPv6 configuradas en interfaces con ‘flapping’. Esto hace que el servicio DNS sea intermitente.
  • Otro error muy típico es editar erróneamente el nombre de los archivos de las zonas.

12) Referencias y Enlaces de Interés