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/perlMi 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 :)
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;
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/perlEl 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:
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;
#!/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/perlEl 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).
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 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/perlOtra 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.
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;
#!/usr/bin/perlOtro 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:
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;
# find /ubicacion/deficheros/dezona -type f | xargs grep nas.dominoBueno 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:
Muchas gracias por el aporte, estaba buscando desde hace unos dias el como jugar con el named.conf, me ayudo bastante, gracias
Mateman
Publicar un comentario