说明: 主要用于获取及检查DNS server 信息,确保其安全可靠运行。
 根据使用需求可以调整sub 函数来取得想要的信息。

 

 

  1. #!/usr/bin/perl 
  2. use strict; 
  3.  
  4. use Net::DNS; 
  5.  
  6. #my $domain=$ARGV[0]; 
  7. #my $dns_server=$ARGV[1]; 
  8. my $domain="google.com"
  9. my $dns_server="ns2.google.com"
  10.  
  11. #PRES(); 
  12. Separate ("List A_Record"); 
  13. A_Record(); 
  14.  
  15. Separate ("List SOA_Record"); 
  16. SOA_Record(); 
  17.  
  18. #Check_open_dns(); 
  19. Separate ("List MX_Record"); 
  20. MX_Records(); 
  21.  
  22. Separate ("List NS_Record"); 
  23. NS_Records(); 
  24.  
  25. Separate ("List SPF_Record"); 
  26. SPF_Record(); 
  27.  
  28. Separate ("List AXFR_Record"); 
  29. #AXFR(); 
  30.  
  31. sub Separate { 
  32.         my $key=shift; 
  33.         print "\n"
  34.         print "--------------------- $key ----------------------------\n\n"
  35.  
  36. sub A_Record { 
  37.         my @hosts=qw(www ftp mail dns vpn sslvpn); 
  38.         my $res = Net::DNS::Resolver->new; 
  39.         foreach my $host (@hosts) { 
  40.                 my $query_A=$res->search("$host\.$domain"); 
  41.  
  42.                 if ($query_A) { 
  43.                         foreach my $rr ($query_A->answer) { 
  44.                         next unless $rr->type eq "A"
  45.                         print "$host\.$domain: "
  46.                         print $rr->address, "\n"
  47.                 } 
  48.                 } else { 
  49.                         warn "Unable to obtain A record : ", $res->errorstring, "\n"
  50.                 } 
  51.         } 
  52.  
  53.  
  54. sub AXFR { 
  55.          print "AXFR records :\n"
  56.          my $res  = Net::DNS::Resolver->new; 
  57.          $res->nameservers("$dns_server"); 
  58.          my @zone = $res->axfr("$domain"); 
  59.          foreach my $rr (@zone) { 
  60.                   $rr->print; 
  61.          } 
  62.  
  63. sub PRES { 
  64.         use Net::DNS::Resolver::Recurse; 
  65.         my $pres = Net::DNS::Resolver::Recurse->new; 
  66.         $pres->tcp_timeout(2); 
  67.         $pres->udp_timeout(2); 
  68.         $pres->debug(1); 
  69.         my @root_ns = map $_ . '.root-servers.net''a'..'m'
  70.         $pres->hints(@root_ns); 
  71.         my $packet = $pres->query_dorecursion($domain, "NS"); 
  72.         print "Parent Nameservers:\n"
  73.         foreach my $pns ($packet->additional) { 
  74.                    print $pns->name,"(", $pns->rdatastr,")\n"
  75.         } 
  76.  
  77. sub SOA_Record { 
  78.         print "SOA record: \n"
  79.         my $res=Net::DNS::Resolver->new; 
  80.         my $soa_query = $res->query($domain, 'SOA'); 
  81.         if ($soa_query) { 
  82.                 ($soa_query->answer)[0]->print, "\n"
  83.         } 
  84.         else  { 
  85.             print "SOA record fail. Result:\n",$res->errorstring; 
  86.         } 
  87.  
  88. sub Check_open_dns { 
  89.         print "Checking recursion (open dns server)...\n"
  90.         my @nservers = qw(ns.xtera-ip.com.cn); 
  91.         my $rres = Net::DNS::Resolver->new( 
  92.                 nameservers => [@nservers], 
  93.                 recurse     => 1, 
  94.                 debug       => 0, 
  95.                 ); 
  96.         my $dest; 
  97.         my $r_query = $rres->query($dest,"A"); 
  98.         my @dest_ips=(); 
  99.         if ($r_query) { 
  100.                 foreach my $rrr ($r_query->answer) { 
  101.                         next unless $rrr->type eq "A"
  102.                         print "Recursive lookups are ENABLED in ",$rres->nameserver(),": ",$rrr->address, "\n"
  103.                 } 
  104.         } else { 
  105.                 warn "OK. Recursive queries are not answered.  Result: ", $rres->errorstring, "\n"
  106.         } 
  107.  
  108. sub MX_Records { 
  109.         print "MX Records is :\n"
  110.         my $res  = Net::DNS::Resolver->new; 
  111.         my @mx   = mx($res, $domain); 
  112.         if (@mx) { 
  113.                foreach my $rr (@mx) { 
  114.                     print $rr->preference, " ", $rr->exchange, "\n"
  115.               } 
  116.         } else { 
  117.                warn "Can't find MX records for $domain: ", $res->errorstring, "\n"
  118.         } 
  119.  
  120. sub NS_Records { 
  121.         print "NS Records : \n"
  122.         my $res   = Net::DNS::Resolver->new; 
  123.         my $query = $res->query("$domain""NS"); 
  124.         if ($query) { 
  125.             foreach my $rr (grep { $_->type eq 'NS' } $query->answer) { 
  126.                     print $rr->nsdname, "\n"
  127.             } 
  128.         } 
  129.         else { 
  130.             warn "query failed: ", $res->errorstring, "\n"
  131.         } 
  132.  
  133. sub Reverse_MX { 
  134.         my $ip; 
  135.         print "\nChecking Reverse MX Records ...\n"
  136.         my $mx_res = Net::DNS::Resolver->new(); 
  137.         my $mxanswer = $mx_res->query($ip->reverse_ip(),'PTR'); 
  138.         if($mxanswer) { 
  139.               foreach my $mrr (grep {$_->type eq "PTR" } $mxanswer->answer) { 
  140.                print $ip->reverse_ip()," PTR ",$mrr->ptrdname,"\n"
  141.                } 
  142.  
  143.  
  144.          } else { 
  145.           print "MX records not found\n"
  146.          } 
  147.  
  148. sub SPF_Record { 
  149.         print "SPF Records is : \n"
  150.         #my $domain=shift; 
  151.         my $res=Net::DNS::Resolver->new(); 
  152.         my $spf_query=$res->query($domain,"TXT"); 
  153.         if ($spf_query) { 
  154.                 foreach my $rr ($spf_query->answer) { 
  155.                         print "SPF record ok: ",$rr->txtdata, "\n"
  156.                 } 
  157.         } 
  158.         else { 
  159.                 warn "unable to get SPF record : ", $res->errorstring, "\n";       } 

脚本输出结果:
root@ubuntu:~/script# perl dns_check_google.pl

--------------------- List A_Record ----------------------------

www.google.com: 74.125.128.99
www.google.com: 74.125.128.103
www.google.com: 74.125.128.104
www.google.com: 74.125.128.105
www.google.com: 74.125.128.106
www.google.com: 74.125.128.147
Unable to obtain A record : NXDOMAIN
mail.google.com: 74.125.128.17
mail.google.com: 74.125.128.18
mail.google.com: 74.125.128.19
mail.google.com: 74.125.128.83
Unable to obtain A record : NXDOMAIN
vpn.google.com: 64.9.224.68
vpn.google.com: 64.9.224.69
vpn.google.com: 64.9.224.70
Unable to obtain A record : NXDOMAIN

--------------------- List SOA_Record ----------------------------

SOA record:
google.com.     86050   IN      SOA     ns1.google.com. dns-admin.google.com. (
                                        2013015000      ; Serial
                                        7200    ; Refresh
                                        1800    ; Retry
                                        1209600 ; Expire
                                        300 )   ; Minimum TTL

--------------------- List MX_Record ----------------------------

MX Records is :
10 aspmx.l.google.com
20 alt1.aspmx.l.google.com
30 alt2.aspmx.l.google.com
40 alt3.aspmx.l.google.com
50 alt4.aspmx.l.google.com

--------------------- List NS_Record ----------------------------

NS Records :
ns4.google.com
ns1.google.com
ns2.google.com
ns3.google.com

--------------------- List SPF_Record ----------------------------

SPF Records is :
SPF record ok: v=spf1 include:_netblocks.google.com include:_netblocks6.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all

--------------------- List AXFR_Record ----------------------------