Herramientas de usuario

Herramientas del sitio


tutoriales:pfsense_dns_publico_nsd

Como configurar un DNS público en pfSense con NSD

En este tutorial mostraremos cómo instalar y configurar un servicio de nombres de dominio en pfSense 2.2.2 mediante NSD 4. Esta aplicación es exclusivamente autoritaria, no tiene implementada la funcionalidad de recursividad, es eficiente y tiene un rendimiento suficientemente alto como para no necesitar funcionalidades adicionales de cacheo, por lo que desde el punto de vista de robustez y seguridad su implementación para un servidor DNS público puede ser, por ejemplo, una solución superior a realizar un NAT a un DNS interno implementado con BIND mediante una vista externa.

En este tutorial se asumen ciertas cosas:

  • pfSense ya está configurado de modo que tenga acceso a internet.
  • Se posee un nivel de familiaridad básico con la consola de pfSense (al menos lo suficiente como para poder ejecutar comandos y editar archivos).

Instalación

El paquete NSD desafortunadamente no es uno de los que vienen integrados en el repositorio de paquetes con gestión gráfica de pfSense. No obstante, dado que pfSense se basa en FreeBSD y este sí tiene dicho paquete, realizaremos una instalación desde los repositorios de FreeBSD.

Para esto, ejecutamos desde la consola de pfSense el siguiente comando:

pkg install nsd

El sistema debería utilizar los repositorios de FreeBSD, e instalar la versión 4 de NSD. Esta versión tiene algunas diferencias con respecto a la versión 3, pero son bastante parecidas.

Configuración

pfSense suele tener la práctica de colocar la configuración de las aplicaciones instaladas por el usuario en /usr/local/etc, de modo que ejecutaremos los siguientes comandos para crear algunos directorios de trabajo y el archivo de configuración del servicio:

mkdir -p /usr/local/etc/nsd/db  /usr/local/etc/nsd/pid  /usr/local/etc/nsd/zones
vi /usr/local/etc/nsd/nsd.conf

El archivo de configuración podría contener algo como esto:

server:
        server-count: 2
        debug-mode: no
        ip4-only: yes
        hide-version: yes
        database: "/usr/local/etc/nsd/db/nsd.db"
        logfile: "/var/log/nsd.log"
        username: nsd
        tcp-count: 32
        xfrdfile: "/usr/local/etc/nsd/db/xfrd.state"
        pidfile: "/usr/local/etc/nsd/pid/nsd.pid"
        zonesdir: "/usr/local/etc/nsd/zones"
        verbosity: 0
        ip-address: 203.0.113.10
        ip-address: 127.0.0.1
 
remote-control:
        control-enable: yes
 
zone:
        name: "midominio.tld"
        zonefile: "midominio.tld.direct.zone"
        provide-xfr: 0.0.0.0/0 NOKEY
 
zone:
        name: "113.0.203.in-addr.arpa"
        zonefile: "midominio.tld.reverse1.zone"
        provide-xfr: 0.0.0.0/0 NOKEY
 
zone:
        name: "8/29.113.0.203.in-addr.arpa"
        zonefile: "midominio.tld.reverse2.zone"
        provide-xfr: 0.0.0.0/0 NOKEY

En la versión 4 de nsd ha quedado obsoleto el comando nsdc que se utilizaba en la versión 3. En su lugar puede utilizarse nsd-control, pero solo si se especifica en el archivo de configuración, de ahí la sección remote-control con la entrada control-enable habilitada. Además, antes de ejecutar nsd-control, puede ser necesario ejecutar el siguiente comando para generar los certificados requeridos:

nsd-control-setup

En cuanto a los archivos de zonas (que en este caso deberían crearse en el directorio /usr/local/etc/nsd/zones/), se mantiene la compatibilidad con la sintaxis de BIND, de modo que en este tutorial no detallaremos sobre ese particular. Ya en otro tutorial se explica detalladamente cómo configurar las zonas.

Adicionalmente podríamos hacer el archivo de configuración (y quizás también los de zonas) inmutable para evitar posibles intentos no autorizados de modificación:

chflags schg /usr/local/etc/nsd/nsd.conf

Una vez hecho esto, procedemos a iniciar el servicio y comprobar si se está ejecutando:

nsd-control start
nsd-control status

Deberíamos obtener un resultado como este, que indica que el servidor está funcionando:

version: 4.1.1
verbosity: 0
ratelimit: 200

Persistencia

Por defecto, NSD no inicia automáticamente con el sistema. En teoría esto debería lograrse editando un archivo de configuración del paquete, pero por algún motivo no muy claro, esto no ocurre. De modo que para cerciorarnos de que el servicio inicia y se mantiene activo, tomaremos ciertas medidas alternativas.

Primeramente, en la interfaz de gestión de pfSense vamos a SystemPackages e instalaremos dos paquetes: Shellcmd y Cron.

Una vez hecho esto, configuramos cada uno desde el menú Services.

En el caso de Shellcmd, crearemos una nueva entrada haciendo clic en el botón con el signo de suma. Introducimos estas preferencias:

Command nsd-control start
Type shellcmd

Con esto, NSD iniciará con el sistema. Elegimos shellcmd y no earlyshellcmd porque conviene que NSD inicie solo cuando todo lo demás esté funcionando y no al principio.

Lo segundo es configurar cron. En este caso, para que cada 5 minutos (o el tiempo que uno decida) verifique si el DNS está funcionando, y en caso contrario inicie. Esto podría lograrse invocando un script desde una entrada como esta:

minute */5
hour *
mday *
month *
wday *
who root
comand /usr/local/bin/nsd-supervisor

El script podría contener algo como esto:

#!/bin/sh
MYVARPDNS=203.0.113.10
MYVARMXDN=mail.midominio.tld.
MYVARHOST=`which host`
MYVARNSDC=`which nsd-control`
($MYVARHOST -t a $MYVARMXDN $MYVARPDNS > /dev/null) || $MYVARNSDC start > /dev/null
unset MYVARNSDC MYVARHOST MYVARMXDN MYVARPDNS
exit

Como puede verse, el script es una especie de supervisor simple, que hace una consulta DNS solicitando a la dirección pública de NSD la ip del mx, y en caso de no obtener respuesta, iniciar el servicio. Otra variante podría ser detectando el fallo del comando nsd-control status.

Y bueno, con esto deberíamos tener una seguridad razonable de que el servicio se mantendrá activo, y damos por terminado el tutorial.

Notas

Este método no parece funcionar para la versión 2.3.x de pfSense.

Atribuciones

  • Autor: Hugo Florentino
tutoriales/pfsense_dns_publico_nsd.txt · Última modificación: 2020/04/22 20:57 (editor externo)