====== 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 [[tutoriales:nsd_como_alternativa_a_bind|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 //System// -> //Packages// 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