Usar RPZ con forwarders
Contents
La zona de política de respuesta (RPZ, por sus siglas en inglés) permite a un DNS modificar los registros. Se desarrolló originalmente como una forma de bloquear el acceso a sitios web peligrosos.
Por ejemplo, si una computadora consulta la dirección IP de un sitio conocido por difundir malware, el DNS puede devolver 127.0.0.1 como respuesta, de modo que la computadora no pueda conectarse al sitio peligroso. Este es el caso de uso original. Como tal, la zona de política de respuesta también se conoce como cortafuegos DNS.
Es posible utilizar la RPZ de otras maneras. Por ejemplo,
- Al tener servicios autoalojados en la red local se puede usar RPZ para apuntar un dominio a la dirección IP local, para no tener que salir a Internet y luego volver a tu red local para acceder al servidor.
- Los padres pueden utilizar el RPZ para bloquear el acceso de sus hijos a los sitios para adultos.
- Se pueden bloquear los anuncios no deseados.
Cómo configurar la zona de política de respuesta de BIND en un servidor CentOS/RHEL
Primero, editamos el archivo named.conf.options
$ nano /etc/bind/named.conf.options
Añadimos las siguientes líneas en la cláusula options {…} para habilitar la zona RPZ.
//habilitar la zona de política de respuesta. response-policy { zona "rpz.local"; };
Luego editamos el archivo named.conf.local
$ nano /etc/bind/named.conf.local
Al final añadimos la zona RPZ.
zone "rpz.local" { type master; file "/etc/bind/rpz.local"; allow-query { localhost; }; allow-transfer { XX.XX.XX.XX; }; };
Notas:
- Es necesario utilizar una ruta absoluta en la directiva file, de lo contrario BIND asumiría que el archivo está en /var/bind/.
- Las zonas RPZ deben permitir las consultas desde localhost solamente. No es necesario añadir clientes de la red local.
- Sustituir XX.XX.XX.XX por la dirección IP del esclavo, al que se le permite hacer la transferencia de zona. Si sólo hay un DNS, se puede utilizar localhost de la siguiente manera: allow-transfer { localhost; };
Es mejor usar un archivo de log separado para RPZ y tener así un mejor análisis, así que agregamos las siguientes líneas a la clásula logging {…}; de /etc/bind/named.conf.options.
channel rpzlog { file "/var/log/named/rpz.log" versions unlimited size 100m; print-time yes; print-category yes; print-severity yes; severity info; }; category rpz { rpzlog; };
Guardar y cerrar el archivo. Luego creamos el directorio /var/log/named/ y hacemos que pertenezca al grupo bind.
mkdir /var/log/named/ chgrp bind /var/log/named/ -R
Bind no crea automáticamente los archivos de log, así que debemos encargarnos de ello. Además de cerciorarnos que tenga el propietario y los permisos adecuados.
touch /var/log/named/rpz.log chmod 664 /var/log/named/rpz.log chgrp bind /var/log/named/rpz.log
A continuación, tenemos que crear el archivo de zona. En lugar de hacerlo desde cero, podemos utilizar un archivo de plantilla de zona. Copiamos el contenido de db.local a un nuevo archivo.
cp /etc/bind/db.local /etc/bind/rpz.local
Editamos el archivo de zona.
nano /var/named/rpz.local
No es necesario cambiar el contenido existente. Simplemente añadimos nuestros registros personalizados. Por ejemplo, si tenemos un servidor local con la dirección IP 192.168.0.103 añadiremos el siguiente registro.
nube.dominio.edu.ar A 192.168.0.103
Para que nuestros hijos no visiten sitios para adultos añadimos la siguiente línea en este archivo para bloquear todo el dominio sitioparaadultos.com.
*.sitioparaadultos.com CNAME .
Podemos evitar los anuncios de Google Adsense en las páginas bloqueando el dominio doubleclick.net, que se utiliza para entregar los anuncios de Adsense.
*.doubleclick.net CNAME .
Para sustituir el registro MX de un dominio añadiríamos lo siguiente.
dominio.edu.ar MX 0 correo.dominio.edu.ar.
Todos los nombres de la izquierda NO deben terminar con un punto y todos los de la derecha SI deben terminar con un punto.
Guardar y cerrar el archivo. A continuación, debemos establecer a bind como propietario del grupo del archivo /etc/bind/rpz.local, o bind no podrá cargar esta zona.
chown root:bind /etc/bind/rpz.local
Comprobamos si hay errores de sintaxis en el archivo de configuración principal. Una salida silenciosa indica que no se han encontrado errores.
named-checkconf
Comprobamos la sintaxis de los archivos de zona RPZ.
named-checkzone rpz /etc/bind/rpz.local
Si no se encuentran errores, reiniciar BIND.
systemctl restart named
Con el comando dig podemos comprobar el funcionamiento de RPZ.
dig A nube.dominio.edu.ar @127.0.0.1
El resultado debería ser similar al siguiente, que indica que la respuesta DNS fue servida desde la RPZ local.
;; AUTHORITY SECTION: rpz.local 86400 IN NS localhost.
También puede comprobar el registro de consultas de BIND9.
tail /var/log/named/rpz.log
Deberías ver algo como lo siguiente, lo que significa que la respuesta fue servida desde el RPZ local.
(dominio.edu.ar): rpz QNAME Local-Data rewrite dominio.edu.ar via dominio.edu.ar.rpz.localSi añadimos la directiva fowarders en la cláusula de opciones del archivo /etc/named.conf, BIND se convertirá en un redireccionador, que reenviará las peticiones a otro DNS como 8.8.8.8.
options { // listen-on port 53 { 127.0.0.1; }; // listen-on-v6 port 53 { ::1; }; directory "/var/named"; max-cache-size 100m; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; allow-query { localhost; 10.10.60.0/24;}; //enable response policy zone. response-policy { zone "rpz.local"; }; forwarders { 8.8.8.8; 8.8.4.4; }; ... };
La zona de política de respuesta funciona con esta configuración del redireccionador. Bind consultará primero la zona de política de respuesta local. Si el registro DNS no se encuentra en la RPZ, entonces la petición será reenviada a un DNS situado más arriba. Podemos utilizar un redireccionador para acelerar la resolución de DNS cuando el resolvedor propio tarda demasiado.
En caso que contemos con un segundo servidor BIND, podemos configurarlo como esclavo/secundario de modo que reciba automáticamente las actualizaciones del servidor maestro/primario.Editamos /etc/bind/named.conf en el maestro/primario.
nano /etc/bind/named.conf
Agregamos la dirección IP del servidr esclavo/secundario a la directiva allow-transfer.
zone “rpz.local” {
type master;
file “/etc/bind/db.rpz.local”;
allow-query { localhost; };
allow-transfer { 12.34.56.78; };
also-notify { 12.34.56.78; };
};
Si hubiera múltiples esclavos/secundarios, agregaríamos varias direcciones IP como se indica a continuación.
allow-transfer { 12.34.56.78; 12.34.56.79; };
La directiva also-notify hará que el DNS maestro envíe un mensaje de notificación al esclavo cuando se modifique la zona RPZ. Guardamos y cerramos el archivo. Reiniciamos BIND para que los cambios surtan efecto.
systemctl restart named
Si hay un cortafuegos en el DNS maestro, es necesario permitir que el DNS esclavo se conecte al puerto 53.
Luego editamos el archivo /etc/bind/named.conf en el DNS esclavo.
nano /etc/named.conf
Agregamos las siguientes líneas en la clásusula opciones {…} para habilitar zona de política de respuesta. (La primera línea es un comentario).
//habilita zona de política de respuesta response-policy { zone "rpz.local"; };
Añadimos una zona RPZ esclava al final de este archivo. Sustituyendo 11.22.33.44 por la dirección IP del DNS maestro.
zone "rpz.local" { type slave; file "rpz.local"; masters { 11.22.33.44;}; allow-notify { 11.22.33.44; }; allow-transfer { none; }; allow-query { localhost; }; };
Guardamos y cerramos el archivo
También debemos configurar el cortafuegos del esclavo para permitir que el DNS maestro envíe mensajes de notificación.
Luego comprobamos si hay errores de sintaxis en el archivo de configuración principal. Una salida silenciosa indica que no los hay.
named-checkconf
Si no hay errores, reiniciamos BIND.
systemctl restart named
Después de que BIND se reinicie, la transferencia de zonas comenzará inmediatamente. Podemos comprobar el registro de BIND9 con.
journalctl -eu named
Veremos mensajes como el siguiente, que indica que la transferencia de la zona se ha realizado con éxito.
transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer status: success transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer completed: 1 messages, 34 records, 899 bytes, 0.248 secs (3625 bytes/sec)
El archivo de zona será guardado como /etc/bind/named/rpz.local en el esclavo.
Nota: Con cualquier modificación de la zona en el maestro resulta necesario actualizar el número de serie. Incrementarlo, de modo que los secundarios sepan que la zona RPZ ha tenido cambios.
A veces puede que no queramos que ciertos registros DNS se transfieran a los esclavos. Podemos crear una zona RPZ independiente. Editamos el archivo /etc/bind/named.conf.nano /etc/bind/named.conf
Agregamos una nueva zona RPZ.
//habilita zona de política de respuesta. response-policy { zone "rpz.local"; zone "rpz.local.notransfer"; };
Añadimos la definición para la nueva zona al final de este archivo.
zone "rpz.local.notransfer" { type master; file "/etc/bind/rpz.local.notransfer"; allow-query { localhost; }; allow-transfer { localhost; }; };
Guardamos y cerramos el archivo. Luego necesitamos crear el archivo de zona y, en lugar de hacerlo desde cero, vamos a usar una plantilla. Copiamos el contenido de named.local a un nuevo archivo.
cp /etc/bind/named.empty /etc/bind/rpz.local.notransfer
Editamos el archivo de zona.
nano /etc/bind/rpz.local.notransferSi estamos trabajando con vistas, podemos agregar RPZ. Para ello editamos /etc/bind/named.conf.local y agregamos allí tanto la habilitación como la definición de la zona.
//habilitar la zona de política de respuesta. response-policy { zone "rpz.local"; }; view "interna" { ... zone "rpz.local" { type master; file "/etc/bind/rpz.local"; allow-query { localhost; }; // allow-transfer { XX.XX.XX.XX; }; }; ... };
Si la habilitación de la zona está fuera de la vista veremos errores como
rpz 'rpz.local' is not a master or slave zone
Basado en Set Up Response Policy Zone (RPZ) in BIND Resolver on CentOS/RHEL