El Módulo Net::DNS

El módulo Net::DNS permite un mayor control sobre la resolución de nombres. El siguiente programa permite obtener los resolutores de un dominio:
pp2@nereida:~/src/perl/NET_DNS$ ./nameservers.pl gobcan.es
seti.gobiernodecanarias.org
acatife.gobiernodecanarias.org

El Constructor de Net::DNS::Resolver

La llamada al constructor new en la línea 6 del programa que sigue retorna un objeto resolutor. Si a new no se le pasan argumentos el objeto queda configurado a los valores por defecto del sistema. Para ello - en un sistema Unix busca - en este orden - en los ficheros:

    /etc/resolv.conf
    $HOME/.resolv.conf
    ./.resolv.conf

El Método query

El método query realiza un query DNS para el nombre dado como primer argumento. Si el nombre no contiene puntos - si la opción defnames de new se activó - se completa con el nombre del dominio por defecto. El método retorna un objeto Net::DNS::Packet . Estos objetos disponen del método answer el cual retorna una lista de objetos Net::DNS::RR que representa la sección respuesta del paquete. El método type devuelve el tipo de la respuesta (MX para DNS Mail Exchanger, NS servidores de nombres, etc. cada uno de estos es una subclase de Net::DNS::RR). Cuando el objeto Net::DNS::RR es además de la clase Net::DNS::RR::NS dispone del método nsdname el cual retorna el nombre del servidor.

pp2@nereida:~/src/perl/NET_DNS$ cat -n nameservers.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3  use Net::DNS;
 4
 5  my $addr = shift || "ull.es";
 6  my $res   = Net::DNS::Resolver->new;
 7  my $query = $res->query($addr, "NS");
 8
 9  if ($query) {
10      foreach my $rr (grep { $_->type eq 'NS' } $query->answer) {
11          print $rr->nsdname, "\n";
12      }
13  }
14  else {
15      warn "query failed: ", $res->errorstring, "\n";
16  }

El Método nameservers

El método nameservers de un objeto Net::DNS::Resolver nos retorna los servidores actuales:

  DB<1> use Net::DNS
  DB<2> $res   = Net::DNS::Resolver->new
  DB<3> x $res->nameservers
0  '193.145.XXX.XX'
1  '193.145.YYY.YY'

Resolución de los Servidores MX de un Dominio

Los usos de DNS son múltiples y no están limitados a la traducción de direcciones IP. Los agentes de correo utilizan DNS para averiguar donde entregar el correo destinado a una dirección concreta.

En DNS un registro MX especifica como debe ser encaminado un correo cuando se usa Simple Mail Transfer Protocol (SMTP). Cada registro MX contiene una prioridad y un host, de manera que la colección de registros MX de un dominio dado referencia a los servidores que deberían recibir el correo para ese dominio asi como la prioridad relativa entre estos.

El siguiente programa muestra las máquinas MX de un dominio dado ordenadas por preferencia:

pp2@nereida:~/src/perl/NET_DNS$ mx.pl gmail.com
5       gmail-smtp-in.l.google.com
10      alt1.gmail-smtp-in.l.google.com
10      alt2.gmail-smtp-in.l.google.com
50      gsmtp163.google.com
50      gsmtp183.google.com

La función mx retorna una lista de objetos Net::DNS::RR::MX que representan registros MX para el nombre especificado. La lista será ordenada según preferencia.

 1 use strict;
 2 use File::Basename;
 3 use Net::DNS;
 4 
 5 die "Usage: ", basename($0), " domain\n" unless (@ARGV == 1);
 6 
 7 my $dname = $ARGV[0];
 8 my $res   = Net::DNS::Resolver->new;
 9 my @mx    = mx($res, $dname);
10 
11 if (@mx) {
12   foreach my $rr (@mx) {
13     print $rr->preference, "\t", $rr->exchange, "\n";
14   }
15 } else {
16   print "Can't find MX hosts for $dname: ", $res->errorstring, "\n";



Subsecciones
Casiano Rodríguez León
2012-02-29