lunes, enero 07, 2008

Mantención servidor DNS

Mi primera tarea fue revisar que el servidor DNS de la empresa no tuviese entradas repetidas, ni zonas que ya no son clientes o algún otro tipo de problema de configuración.
Primero obtuve una lista de todos los dominios (zonas) definidas en el archivo de configuración del bind, normalmente /etc/namedb/named.conf, para ello escribí este script en perl:

#!/usr/bin/perl
open(my $in, "<", "named.conf") or die "No se puede abrir named.conf: $!"; open(my $out, ">", "dominios.txt") or die "no se puede escribir la salida: $!";

while (<$in>) {
if (/zone\s\"([\w\-\.]+)\"/) {
print $out "$1\n";
}
}

close $in;
close $out;
Mi experiencia en perl antes de esta tarea es igual a 0 (cero) por lo que pido comprensión a la hora de criticar el código :)

Luego con la lista de 1200 zonas que obtuve como resultado, la pase por un script que genera dos ficheros, uno con los dominios .cl y otro con los demás (ya que la respuesta al whois es diferente para diferentes raíces de dominio):

#!/usr/bin/perl
open(my $in, "<", "dominios.txt") or die "No se puede abrir named.conf: $!"; open(my $out, ">", "cl.txt") or die "no se puede escribir la salida:
$!";
open(my $otro, ">", "otros.txt") or die "no se puede escribir la
salida:
$!";

while (<$in>) {
if (/\w\.(cl)/) {
print $out "$_";
} else {
print $otro "$_";
}
}

close $in;
close $out;
El objetivo de esto es realizar una consulta whois por cada dominio de la lista, en mi caso particular la gran mayoría (unos 1000) eran .cl y el resto otros, así es que genere dos scripts mas para esto ultimo:

#!/usr/bin/perl
open(my $in, "<", "otros.txt") or die "No se puede abrir named.conf: $!"; open(my $out, ">", "reporte.otros.txt") or die "no se puede escribir la
salida: $!";

while (<$in>) {
print $out "\n\n$_";
# $dominio=$_;
$resultado = qx/whois -H $_/;
@lineas = split(/\n/,$resultado);
foreach (@lineas) {
if (/Name Server:\s*([\w\-\.]+)/) {
# print "$dominio\n";
print $out "$1\n";
}
}
}

close $in;
close $out;

#!/usr/bin/perl
open(my $in, "<", "cl.txt"); open(my $out, ">", "reporte.cl.txt");

while (<$in>) {
print $out "\n\n$_";
$resultado = qx/whois -H $_/;
@lineas = split(/\n/,$resultado);
foreach (@lineas) {
if (/([\w\.\-]+)\s\([\d\.]+\)/) {
print $out "$1\n";
}
}
}
close $in;
Close $out;
El primero guarda en reporte.otros.txt los nameserver registrados en donde corresponda para todos los dominios NO .cl y el segundo guarda en otro archivo (reporte.cl.txt) los nameservers registrados en nic.cl de los dominios .cl, luego con el gedit edite estos archivos y al buscar mi servidor DNS se destacaron todos los dóminos de los cuales actualmente somos servidor ya sea primario o secundario, y me permitió realizar la primera vuelta de eliminación de dóminos (aquellos de los cuales ya no somos nameserver, y aquellos que ya expiraron).

El siguiente problema era las zonas repetidas y/o mal definidas, para ello es útil referirse a los logs, en ellos encontré una linea que decía "cannot redefine zone 'dominio.dom' " lo que indica que existe un dominio definido mas de una vez, para ubicar todos estos errores en el log utilice el siguiente script perl:

#!/usr/bin/perl
open (IN,"named.log");
open (my $out,">", "repetidos.txt");

$i=0;

while() {
chomp;
if (/cannot redefine zone\s\'([\w\-\.]+)/) {
print $out "$1\n";
}
}
close IN;
close $out;
Otra información que encontré en los logs es " Err/TO getting serial# for "dominio.dom" " lo que significa que existen problemas para obtener información del DNS primario (por que nosotros somos servidor secundario para ese dominio) sobre ese dominio, lo que puede ser síntoma de que el dns primario que tenemos definido en nuestra configuración dejo de ser valido, a continuación script para encontrar esos dominios en el archivo de log.

#!/usr/bin/perl
open (IN,"named.log");
open (my $out,">", "serialerror.txt");

$i=0;

while() {
chomp;
if (/xfer-in: Err\/TO getting serial# for\s\"([\w\-\.]+)/) {
print $out "$1\n";
}
}
close IN;
close $out;
Otro error común que se puede detectar en los logs es "sysquery: findns error (NXDOMAIN) on " en mi caso correspondía a misspelling (meter mal los dedos al teclado) a la hora de definir zonas, sabrán que las zonas se definen en ficheros de texto independientes por lo tanto tratar de encontrar donde escribimos nas.dominio.dom en vez de ns.dominio.dom abriendo uno por uno los archivos de zona no es una opción para ellos tenemos find:

# find /ubicacion/deficheros/dezona -type f | xargs grep nas.domino
Bueno en base a esto pude generar un reporte con los dominios que debían ser reparados y aquellos que debían ser eliminados espero le sirva a alguien.

Saludos

1 comentario:

Anónimo dijo...

Muchas gracias por el aporte, estaba buscando desde hace unos dias el como jugar con el named.conf, me ayudo bastante, gracias

Mateman