Permitir resolución externa de un dominio local en Bind9 con dnssec validation

Esta mañana al actualizar Zentyal a la versión 8, me he dado cuenta que viene activado por defecto con DNSSEC, cosa más que recomendable. El problema ha venido cuando el sistema tiene que resolver DNS de nombres de dominio «inventados».

En mi caso bind9 está configurado para enviar a un Pi Hole todas las direcciones que no puede resolver y es en PiHole donde creo las resoluciones locales. El problema de DNSSEC actvado como auto es que no permite la resolución de nombres de dominio no legales, dando error en el log:

insecurity proof failed resolving 'tld1.inventado/NS/IN': 192.168.1.13#53

Para permitir este tipo de resoluciones debemos activar la excepción para el dominio insertando en /etc/bind/named.conf.options la siguiente linea debajo de dnsssec-validation auto;

validate-except { "tld1.inventado"; "tld2.inventado";};

De esta manera quedará todo de forma correcta y cuando queramos resolver maquina.tld.inventado nuestro servidor contestará OK.

Espero que os valga este auto recordatorio.

 

Cambios masivos en Bind

Creo esta entrada como autonota para recordar los comandos que utilizo para hacer cambios masivos en los archivos de Bind9, ya que cada vez que hago cambios de servidores necesito hacer cambios en todos los dominios que tengo y cada vez son más.

Sólo para recordar la estructura de archivo bind os lo pongo aquí, los puntos importantes son el serial, ya que en cada cambio debe cambiar y luego las IPs a la que los registro A deben apuntar.

$ORIGIN example.com.
$TTL 86400
@     IN     SOA    dns1.example.com.     hostmaster.example.com. (
                    2001062501 ; serial
                    21600      ; refresh after 6 hours
                    3600       ; retry after 1 hour
                    604800     ; expire after 1 week
                    86400 )    ; minimum TTL of 1 day
;
@            IN     NS     dns1.example.com.
@            IN     NS     dns2.example.com.
@            IN     MX     10     mail.example.com.
@            IN     MX     20     mail2.example.com.
;
@            IN     A       10.0.1.2
server1      IN     A       10.0.1.2
server2      IN     A       10.0.1.2
dns1         IN     A       10.0.1.2
dns2         IN     A       10.0.1.3
;
ftp          IN     CNAME   server1
mail         IN     CNAME   server1
mail2        IN     CNAME   server2
www          IN     CNAME   server2

Para hacer un cambio en todos los archivos de zona, por ejmplo cambiar la ip del servidor de nombre dns1 10.0.1.2 por 130.89.56.76 debemos ejecutar este comando:

root@improvisa:~# find /var/cache/bind/ -type f -exec  sed -i ‘s/10.0.1.2/130.89.56.76/g’ {} \;

Este comando entrara en el directorio donde tengamos los archivos de zona, en este caso /var/cache/bind/, y sustituirá todas las ocurrencias de la ip 10.0.1.2 por 130.89.56.76.

Ahora nos queda eliminar la linea donde esté el serial y sustituirla por el nuevo serial, no nos vale encontrar el serial ya que en los archivos este será distinto, sino que tendremos que buscar la linea donde aparezca el texto «serial2» y sustituir toda la linea por la nueva, para ello utilizaremos el siguiente comando:

root@improvisa:~# find /var/cache/bind/ -type f -exec  sed -i ‘s/\(.*; serial\)/                        2013031901   ; serial/’ {} \;

Lo que hace este comando es entrar en el directorio /var/cache/bind/ donde tenemos los archivos de zona y buscar la cadena «; serial» con cualquier cosa delante, es lo que indica la expresión regular .*, es decir nos da igual el número que tenga, y sustituiremos esa ocurrencia por »                        2013031901   ; serial»

Espero que os sirva de ayuda.

Un saludo.