#!/usr/local/bin/perl -w use strict; use Getopt::Std; use Net::DNS; use Time::HiRes qw(gettimeofday tv_interval); $|=1; my %opts; getopts('46tus',\%opts); my $dom = $ARGV[0]; if (!defined $dom) { die "usage: $0 [-46tus] domain\n\t4: ipv4 only\n\t6: ipv6 only\n\tt: tcp only\n\tu: udp only\n\ts: disable dnssec test\n"; }; my $res = Net::DNS::Resolver->new( defnames => 0 ); my $query=$res->query($dom,'NS'); my %servers; if($query) { foreach my $rr (grep { $_->type eq 'NS' } $query->answer) { @{$servers{lc $rr->nsdname}}=(); }; } else { print "Unknown domain: $dom\n"; exit 1; };; foreach my $server (keys %servers) { if (!$opts{'6'}) { $query=$res->query($server,'A'); if($query) { foreach my $rr (grep { $_->type eq 'A' } $query->answer) { push @{$servers{$server}},$rr->address; }; }; }; if (!$opts{'4'}) { $query=$res->query($server,'AAAA'); if($query) { foreach my $rr (grep { $_->type eq 'AAAA' } $query->answer) { push @{$servers{$server}},$rr->address; }; }; }; if(scalar @{$servers{$server}} ==0) { print "There is no address for $server\n"; } else { print "$server\n"; foreach my $ip (@{$servers{$server}}) { my @usevc; if($opts{'u'}) { @usevc=(0); } elsif($opts{'t'}) { @usevc=(1); } else { @usevc=(0,1); }; foreach my $usevc ( @usevc ) { my @dnssec; if ($opts{'s'}) { @dnssec=(0); } else { @dnssec=(0,1); }; foreach my $dnssec ( @dnssec) { next if $dnssec && $opts{'s'}; my $transport = ($dnssec?'+dnssec ':'').($usevc?'TCP':'UDP'); my $auth=Net::DNS::Resolver->new( nameservers => [$ip], recurse => 0, defnames => 0, tcp_timeout => 30, udp_timeout => 10, retry => 2, usevc => $usevc, dnssec => $dnssec, udppacketsize => $dnssec?2048:undef, ); my $t0 = [gettimeofday]; $query=$auth->query($dom,'SOA'); my $t1 = [gettimeofday]; my $t0_t1 = int(1000*tv_interval $t0, $t1); if ($query) { foreach my $rr (grep { $_->type eq 'SOA' } $query->answer) { print "\t$ip ($transport) has serial number ".$rr->serial; print " $t0_t1 ms"; }; } else { print "There was no response from $ip ($transport)"; }; print "\n"; }; }; }; }; };