Esta pagina se ve mejor con JavaScript habilitado

Bind FreeBSD: DNS-RPZ

 ·  🎃 kr0m

En esta ocasión veremos la instalación de un servidor Bind/Named bajo FreeBSD, esta configuración corresponde a mi setup local necesario para evitar los problemas que causa el HairPinning en equipos internos cuando intentan conectar a servicios LAN pero que resuelven a IPs públicas.

Este problema se puede resolver de varias maneras:

  • Retocar el /etc/hosts en todos los equipos afectados, el inconveniente es que a veces se trata de equipos empotrados o teléfonos móviles por no mencionar que el mantenimiento es completamente manual.
  • Si tenemos acceso al router y se trata de Linux, podemos optar por configurar IPTables.
  • Si las dos opciones anteriores no son viables, siempre podremos montar un servidor DNS en modo DNS-RPZ.

El tutorial se compone de los siguientes pasos:


Jail e instalación de herramientas básicas:

Creamos la jail y le asignamos una IP via Bastille :

bastille create -T RosettaStone 14.3-RELEASE 192.168.69.22/24 nfe0

Instalamos las herramientas básicas mediante el sistema de templates :

bastille template RosettaStone datadyne.alfaexploit.com/bastille-basicconfiguration

Instalación de Bind:

Instalamos Bind y algunas herramientas útiles de diagnóstico:

pkg install -y bind920 bind-tools

El pripio instalador nos advierte que debemos generar una key para rndc :

BIND requires configuration of rndc, including a "secret"key.  The easiest, and most secure way to configure rndc is
to run 'rndc-confgen -a' to generate the proper conf file,with a new random key, and appropriate file permissions.

Procedemos tal como nos indica:

rndc-confgen -a

Habilitamos el servicio y lo arrancamos:

service named enable
service named start

Configuración de Bind:

Cambiamos el socket de escucha, habilitamos el DNS-RPZ y configuramos los forwarders para el resto de las queries:

vi /usr/local/etc/namedb/named.conf
options {
  ...
      listen-on       { 192.168.69.22; };
      response-policy { zone "rpz.zone"; };
      forwarders {
                8.8.8.8;
                1.1.1.1;
        };
  ...
};


// DNS RPZ (Response Policy Zone)
zone "rpz.zone" {
    type master;
    file "/usr/local/etc/namedb/db.rpz.local";
    allow-query { any; };
    allow-update { none; };
};

Configuramos las entradas de la zona DNS-RPZ:

vi /usr/local/etc/namedb/db.rpz.local
$TTL    604800
@       IN      SOA     localhost.local. hostmaster.local. (
                              9         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL

@                       IN NS   localhost.local.

poudriere.alfaexploit.com                       IN A    192.168.69.2
goaccess.alfaexploit.com                        IN A    192.168.69.2
mightymax.alfaexploit.com                       IN A    192.168.69.2
paperstreet.alfaexploit.com                     IN A    192.168.69.4
hellstorm.alfaexploit.com                       IN A    192.168.69.17
baikal.alfaexploit.com                          IN A    192.168.69.19
grafana.alfaexploit.com                         IN A    192.168.69.19
alfaexploit.com                                 IN A    192.168.69.19
www.alfaexploit.com                             IN A    192.168.69.19
atlas.alfaexploit.com                           IN A    192.168.69.19
metacortex.alfaexploit.com                      IN A    192.168.69.20
rosettastone.alfaexploit.com                    IN A    192.168.69.22
minibeast.alfaexploit.com                       IN A    192.168.69.205

Comprobamos que la configuración sea correcta, si no sale nada, todo está en orden:

named-checkconf

Reiniciamos el servicio:

service named restart

Habilitar query_log:

En un momento dado puede resultar útil habilitar el log de las queries para comprobar que todo esté funcionando correctamente:

vi /usr/local/etc/namedb/named.conf
logging {
    channel query_log {
        file "/var/log/named/queries.log" versions 3 size 50m;
        severity info;
        print-time yes;
        print-category yes;
        print-severity yes;
    };

    category queries { query_log; };
};

Creamos el directorio de logs y asignamos permisos:

mkdir -p /var/log/named
chown bind:bind /var/log/named
chmod 750 /var/log/named

Reiniciamos el servicio:

service named restart

Reglas de firewall:

Si fuese necesario configurar PF estas serían las ACLs, en mi caso solo quiero permitir el tráfico desde la red interna:

# LAN DNS-RPZ:
pass in proto udp from 192.168.69.0/24 to 192.168.69.22 port 53
pass in proto tcp from 192.168.69.0/24 to 192.168.69.22 port 53

Pruebas funcionamiento:

Comprobamos que funcione correctamente:

dig @192.168.69.22 baikal.alfaexploit.com +short
192.168.69.19
dig @8.8.8.8 baikal.alfaexploit.com +short
alfaexploit.com.
79.112.0.29