Este tutorial le mostrará cómo anular registros DNS públicos en su sistema de resolución de DNS BIND con zona de política de respuesta (RPZ) en Debian/Ubuntu.
¿Qué es la Zona de política de respuesta?
Zona de política de respuesta (RPZ) permite que un solucionador de DNS modifique los registros de DNS. Originalmente fue desarrollado como una forma de bloquear el acceso a sitios web peligrosos. Por ejemplo, si una computadora consulta la dirección IP de un sitio peligroso conocido que propaga malware, la resolución de DNS puede devolver 127.0.0.1
como la respuesta DNS, por lo que la computadora no puede 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 de DNS. .
Puede utilizar RPZ de otras formas. Por ejemplo,
- Si tiene servicios autohospedados como Nextcloud en la red local, puede usar RPZ para apuntar su dominio de Nextcloud (nextcloud.your-domain.com) a la dirección IP local, para que no tenga que salir a Internet y luego regrese a su red local para acceder al servidor Nextcloud.
- Los padres pueden usar RPZ para impedir que sus hijos accedan a sitios pornográficos.
- Puede bloquear los anuncios no deseados.
- Instalo muchas aplicaciones web en mi VPS. Cuando la aplicación web no está diseñada para el acceso público, agrego un registro DNS solo en BIND RPZ y no publico un registro DNS en mi registrador de dominio para evitar la piratería.
Sí, puede crear una entrada de DNS en /etc/hosts
archivo en la computadora local para anular los registros DNS públicos, pero no escala bien. Además, iOS y Android no le permiten crear entradas DNS locales. ¿No sería bueno si el sistema de resolución de BIND DNS anula el registro de DNS público, de modo que todos los dispositivos de la red que utilicen el sistema de resolución de BIND puedan utilizar el registro de DNS personalizado?
Requisitos
Para seguir este tutorial, se supone que tiene un sistema de resolución de DNS BIND ejecutándose en su servidor Debian/Ubuntu. De lo contrario, lea uno de los siguientes tutoriales para configurar la resolución BIND.
- Configure su propio solucionador de DNS BIND9 en Debian 10 Buster
- Configure su propio solucionador de DNS BIND9 en Ubuntu 16.04/18.04
- Configure su propio solucionador de DNS BIND9 en Ubuntu 20.04
Una vez que su BIND Resolver esté funcionando, siga las instrucciones a continuación.
Cómo configurar la zona de política de respuesta BIND en el servidor Debian/Ubuntu
Primero, edite named.conf.options
archivo.
sudo nano /etc/bind/named.conf.options
Agregue las siguientes líneas en las opciones options {...}
cláusula para habilitar la zona de política de respuesta. (La primera línea es un comentario).
//enable response policy zone. response-policy { zone "rpz.local"; };
Guarde y cierre el archivo. Luego abra el named.conf.local
archivo.
sudo nano /etc/bind/named.conf.local
Agregue una zona RPZ en este archivo.
zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; };
Notas:
- Es importante que utilice una ruta absoluta en lugar de un nombre de archivo simple en el
file
directiva, o BIND asumiría que el archivo está en/var/cache/bind/
. - Las zonas RPZ deben permitir consultas solo desde localhost. No necesita agregar clientes de red local.
- Reemplazar
12.34.56.78
con la dirección IP del resolutor de DNS BIND esclavo, que puede realizar transferencias de zona. Si solo hay una resolución de DNS, puede usarlocalhost
así:allow-transfer { localhost; };
Guarde y cierre el archivo. Luego necesitamos crear el archivo de zona. En lugar de crear un archivo de zona desde cero, podemos usar un archivo de plantilla de zona. Copie el contenido de db.empty
a un archivo nuevo.
sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local
Luego edite el db.rpz
archivo.
sudo nano /etc/bind/db.rpz.local
No hay necesidad de cambiar el contenido existente. Simplemente agregamos nuestros registros DNS personalizados. Por ejemplo, si tiene un servidor Nextcloud en la red local con una dirección IP 192.168.0.103, agregue el siguiente registro DNS, para que los clientes de Nextcloud no tengan que salir a Internet para conectarse al servidor Nextcloud. .
nextcloud.your-domain.com A 192.168.0.103
Si no desea que sus hijos visiten sitios de pornografía como pornhub.com, agregue la siguiente línea en este archivo para bloquear todo el dominio de pornhub.com.
*.pornhub.com CNAME .
Si no desea ver anuncios de Google Adsense en las páginas web, puede agregar la siguiente línea para bloquear doubleclick.net
dominio, que se utiliza para publicar anuncios de Adsense.
*.doubleclick.net CNAME .
Estos son algunos dominios de servidores de anuncios más que puede bloquear.
*.pubmatic.com CNAME . *.mopub.com CNAME . *.eskimi.com CNAME . *.adcolony.xyz CNAME . *.adsrvr.org CNAME . *.adsymptotic.com CNAME . *.servedby-buysellads.com CNAME . srv.buysellads.com CNAME . *.powerinboxedge.com CNAME . *.defof.com CNAME . *.licasd.com CNAME . *.liadm.com CNAME .
Para anular el registro MX de un nombre de dominio, agregue una línea como la siguiente.
example.com MX 0 mail.example.com.
Nota que todos los nombres de la mano izquierda NO deben terminar con un punto y todos los nombres de la mano derecha deben terminar con un punto.
Si necesita equilibrar la carga para un nombre de host, cree un registro con varios valores como se muestra a continuación. Los clientes DNS utilizarán las dos direcciones IP de forma aleatoria y el tráfico se distribuirá entre ellas.
host.example.com A 12.34.56.78 A 12.34.56.79
Guarde y cierre el archivo. Se recomienda usar un archivo de registro separado para RPZ para analizar mejor el registro. Para configurar, edite el archivo de configuración principal de BIND.
sudo nano /etc/bind/named.conf
Agregue las siguientes líneas al archivo.
logging { 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; }; };
Guarde y cierre el archivo. Luego crea el /var/log/named/
directorio y hacer bind
como propietario.
sudo mkdir /var/log/named/ sudo chown bind:bind /var/log/named/ -R
A continuación, ejecute el siguiente comando para verificar si hay errores de sintaxis en el archivo de configuración principal. Una salida silenciosa indica que no se encontraron errores.
sudo named-checkconf
Luego verifique la sintaxis de los archivos de zona RPZ.
sudo named-checkzone rpz /etc/bind/db.rpz.local
Si no se encuentran errores, reinicie BIND9.
sudo systemctl restart bind9
Ahora puedes ejecutar dig
Comando en el servidor BIND para ver si RPZ está funcionando. Por ejemplo, consulte un registro DNS de un nombre de dominio que se incluye en la zona de política de respuesta.
dig A nextcloud.your-domain.com @127.0.0.1
Debería ver algo como a continuación en la salida del comando, lo que indica que la respuesta de DNS se envió desde RPZ local.
;; AUTHORITY SECTION: rpz.local 86400 IN NS localhost.
También puede consultar el registro de consultas de BIND9.
sudo tail /var/log/named/rpz.log
Vería algo como a continuación, lo que significa que la respuesta se envió desde RPZ local.
(example.com): rpz QNAME Local-Data rewrite example.com via example.com.rpz.local
¿El cliente de Fedora no usa RPZ?
De forma predeterminada, Fedora no utiliza RPZ. Puedes usar el dig
utilidad de línea de comandos para encontrar la dirección IP de un nombre de host en la zona RPZ, pero si hace ping al nombre de host, no puede encontrar la dirección IP.
Para resolver este problema, debe cambiar el parámetro hosts en /etc/nsswitch.conf
archivo en el cliente de Fedora.
sudo nano /etc/nsswitch.conf
De forma predeterminada, el parámetro hosts se define como:
hosts: files myhostname mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns
Cámbialo por:
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname mymachines
Guarde y cierre el archivo. RPZ debería estar funcionando ahora.
Uso de RPZ con reenviadores
Si agrega un fowarders
directiva como a continuación en las options
cláusula en /etc/bind/named.conf.options
entonces su resolución BIND se convierte en un reenviador, que reenviará las solicitudes de DNS a una resolución de DNS ascendente como 8.8.8.8
.
options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. forwarders { 8.8.8.8; 8.8.4.4; }; ... };
La zona de política de respuesta funciona con esta configuración de reenviador. Bind consultará primero la zona de política de respuesta local. Si no se encuentra el registro DNS en la RPZ, la solicitud se reenviará a un solucionador de DNS ascendente. Es posible que desee utilizar un reenviador para acelerar la resolución de DNS cuando su propio sistema de resolución de BIND tarda demasiado en resolver los nombres de DNS.
Configurar transferencia de zona
Si tiene otro solucionador de DNS BIND, puede configurarlo como un solucionador esclavo para recibir automáticamente actualizaciones del solucionador de DNS maestro.
Primero, debe editar el /etc/bind/named.conf.local
archivo en el resolvedor de DNS maestro .
sudo nano /etc/bind/named.conf.local
Agregue la dirección IP del solucionador de DNS esclavo a allow-transfer
directiva.
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 tiene varios solucionadores de DNS esclavos, agregue varias direcciones IP como se muestra a continuación.
allow-transfer { 12.34.56.78; 12.34.56.79; };
El also-notify
La directiva hará que el solucionador de DNS maestro envíe un mensaje de notificación al solucionador de esclavos cuando se cambie la zona RPZ. Guarde y cierre el archivo. Reinicie BIND para que los cambios surtan efecto.
sudo systemctl restart bind9
Si hay un cortafuegos ejecutándose en el solucionador de DNS maestro, debe permitir que el solucionador de DNS esclavo se conecte al puerto 53. Por ejemplo, si usa un cortafuegos UFW, ejecute el siguiente comando.
sudo ufw insert 1 allow in from 12.34.56.78 to any port 53
A continuación, edite named.conf.options
archivo en el resolutor de DNS esclavo .
sudo nano /etc/bind/named.conf.options
Agregue las siguientes líneas en las opciones options {...}
cláusula para habilitar la zona de política de respuesta. (La primera línea es un comentario).
//enable response policy zone. response-policy { zone "rpz.local"; };
Guarde y cierre el archivo. Luego edite el named.conf.local
archivo.
sudo nano /etc/bind/named.conf.local
Agregue una zona RPZ esclava en este archivo. Reemplace 11.22.33.44 con la dirección IP del solucionador de DNS maestro.
zone "rpz.local" { type slave; file "db.rpz.local"; masters { 11.22.33.44;}; allow-notify { 11.22.33.44; }; allow-transfer { none; }; allow-query { localhost; }; };
Guarde y cierre el archivo.
También debe configurar el cortafuegos del resolutor esclavo para permitir que el resolutor DNS maestro envíe notify
mensajes.
sudo ufw insert 1 allow in from 11.22.33.44 to any port 53
A continuación, ejecute el siguiente comando para verificar si hay errores de sintaxis en el archivo de configuración principal. Una salida silenciosa indica que no se encontraron errores.
sudo named-checkconf
Si no se encuentran errores, reinicie BIND9.
sudo systemctl restart bind9
Después de que BIND9 se reinicie, la transferencia de zona comenzará de inmediato. Verifique el registro de BIND9 con el siguiente comando.
sudo journalctl -eu bind9
o
sudo journalctl -eu named
Puede ver mensajes como los siguientes, que indican que la transferencia de zona se realizó correctamente.
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)
Creación de múltiples zonas RPZ
A veces, es posible que no desee que ciertos registros DNS se transfieran a los resolutores esclavos. Puede crear una zona RPZ independiente. Edite las named.conf.options
archivo.
sudo nano /etc/bind/named.conf.options
Agregue una nueva zona RPZ.
//enable response policy zone. response-policy { zone "rpz.local"; zone "rpz.local.notransfer"; };
Nota :Si las dos zonas RPZ tienen registros DNS en conflicto, la primera entrada tendrá prioridad. Si desea invertir la precedencia, cambie su posición, como se muestra a continuación:
//enable response policy zone. response-policy { zone "rpz.local.notransfer"; zone "rpz.local"; };
Guarde y cierre el archivo. Luego abra el named.conf.local
archivo.
sudo nano /etc/bind/named.conf.local
Agregue una definición para la nueva zona en este archivo.
zone "rpz.local.notransfer" { type master; file "/etc/bind/db.rpz.local.notransfer"; allow-query { localhost; }; allow-transfer { localhost; }; };
Guarde y cierre el archivo. Luego necesitamos crear el archivo de zona. En lugar de crear un archivo de zona desde cero, podemos usar un archivo de plantilla de zona. Copie el contenido de db.empty
a un archivo nuevo.
sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local.notransfer
Luego edite el db.rpz
archivo y agregue registros DNS personalizados.
sudo nano /etc/bind/db.rpz.local.transfer
Consejos para solucionar problemas
Si el sistema de resolución de DNS secundario no puede replicar los registros RPZ del sistema de resolución de DNS principal, es posible que en el sistema de resolución de DNS secundario:
- La regla del cortafuegos es incorrecta.
- La resolución BIND no se está ejecutando.
- BIND no está escuchando en la interfaz de red requerida.
Cómo usar RPZ con vistas en BIND
Si desea que su RPZ sea accesible solo para redes internas de confianza, puede usar vistas en BIND para lograrlo. Esta configuración será compatible con la transferencia de zona maestro-esclavo.
Primero, edite named.conf.options
archivo.
sudo nano /etc/bind/named.conf.options
Defina una red interna y una red de invitados con acl
directiva.
options { ..... ..... } acl internal { 10.10.10.0/24; }; acl guest { 10.10.20.0/24; };
Aquí el 10.10.10.0/24
network es la red de confianza interna. 10.10.20.0/24
es la red de invitados. Además, elimine las siguientes líneas de este archivo.
response-policy { zone "rpz.local"; };
Guarde y cierre el archivo.
A continuación, edite el named.conf.local
archivo.
sudo nano /etc/bind/named.conf.local
Debe colocar la definición de la zona dentro de una view
cláusula como la siguiente. Tenga en cuenta que debemos habilitar la zona de política de respuesta dentro de la view
cláusula.
view "internal" { match-clients { internal; }; //enable the response policy zone. response-policy { zone "rpz.local"; }; zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; }; };
Guarde y cierre el archivo. Luego edite el named.conf
archivo.
sudo nano /etc/bind/named.conf.default-zones
Ponga las zonas por defecto en el guest
ver.
view guest { match-clients { guest; }; allow-recursion { any; }; zone "." { type hint; file "/usr/share/dns/root.hints"; }; zone "localhost" { type master; file "/etc/bind/db.local"; }; ..... ..... };
Guarde y cierre el archivo. Ejecute el siguiente comando para verificar si hay errores de sintaxis en el archivo de configuración. Una salida silenciosa indica que no se encontraron errores.
sudo named-checkconf
Si no se encuentran errores, reinicie BIND9 para que los cambios surtan efecto.
sudo systemctl restart bind9