说明: 主要用于获取及检查DNS server 信息,确保其安全可靠运行。
根据使用需求可以调整sub 函数来取得想要的信息。
?
- #!/usr/bin/perl?
- use?strict;?
- ?
- use?Net::DNS;?
- ?
- #my?$domain=$ARGV[0];?
- #my?$dns_server=$ARGV[1];?
- my?$domain="google.com";?
- my?$dns_server="ns2.google.com";?
- ?
- #PRES();?
- Separate?("List?A_Record");?
- A_Record();?
- ?
- Separate?("List?SOA_Record");?
- SOA_Record();?
- ?
- #Check_open_dns();?
- Separate?("List?MX_Record");?
- MX_Records();?
- ?
- Separate?("List?NS_Record");?
- NS_Records();?
- ?
- Separate?("List?SPF_Record");?
- SPF_Record();?
- ?
- Separate?("List?AXFR_Record");?
- #AXFR();?
- ?
- sub?Separate?{?
- ????????my?$key=shift;?
- ????????print?"n";?
- ????????print?"---------------------?$key?----------------------------nn";?
- }?
- ?
- sub?A_Record?{?
- ????????my?@hosts=qw(www?ftp?mail?dns?vpn?sslvpn);?
- ????????my?$res?=?Net::DNS::Resolver->new;?
- ????????foreach?my?$host?(@hosts)?{?
- ????????????????my?$query_A=$res->search("$host.$domain");?
- ?
- ????????????????if?($query_A)?{?
- ????????????????????????foreach?my?$rr?($query_A->answer)?{?
- ????????????????????????next?unless?$rr->type?eq?"A";?
- ????????????????????????print?"$host.$domain:?";?
- ????????????????????????print?$rr->address,?"n";?
- ????????????????}?
- ????????????????}?else?{?
- ????????????????????????warn?"Unable?to?obtain?A?record?:?",?$res->errorstring,?"n";?
- ????????????????}?
- ????????}?
- }?
- ?
- ?
- sub?AXFR?{?
- ?????????print?"AXFR?records?:n";?
- ?????????my?$res??=?Net::DNS::Resolver->new;?
- ?????????$res->nameservers("$dns_server");?
- ?????????my?@zone?=?$res->axfr("$domain");?
- ?????????foreach?my?$rr?(@zone)?{?
- ??????????????????$rr->print;?
- ?????????}?
- }?
- ?
- sub?PRES?{?
- ????????use?Net::DNS::Resolver::Recurse;?
- ????????my?$pres?=?Net::DNS::Resolver::Recurse->new;?
- ????????$pres->tcp_timeout(2);?
- ????????$pres->udp_timeout(2);?
- ????????$pres->debug(1);?
- ????????my?@root_ns?=?map?$_?.?'.root-servers.net',?'a'..'m';?
- ????????$pres->hints(@root_ns);?
- ????????my?$packet?=?$pres->query_dorecursion($domain,?"NS");?
- ????????print?"Parent?Nameservers:n";?
- ????????foreach?my?$pns?($packet->additional)?{?
- ???????????????????print?$pns->name,"(",?$pns->rdatastr,")n";?
- ????????}?
- }?
- ?
- sub?SOA_Record?{?
- ????????print?"SOA?record:?n";?
- ????????my?$res=Net::DNS::Resolver->new;?
- ????????my?$soa_query?=?$res->query($domain,?'SOA');?
- ????????if?($soa_query)?{?
- ????????????????($soa_query->answer)[0]->print,?"n";?
- ????????}?
- ????????else??{?
- ????????????print?"SOA?record?fail.?Result:n",$res->errorstring;?
- ????????}?
- }?
- ?
- sub?Check_open_dns?{?
- ????????print?"Checking?recursion?(open?dns?server)...n";?
- ????????my?@nservers?=?qw(ns.xtera-ip.com.cn);?
- ????????my?$rres?=?Net::DNS::Resolver->new(?
- ????????????????nameservers?=>?[@nservers],?
- ????????????????recurse?????=>?1,?
- ????????????????debug???????=>?0,?
- ????????????????);?
- ????????my?$dest;?
- ????????my?$r_query?=?$rres->query($dest,"A");?
- ????????my?@dest_ips=();?
- ????????if?($r_query)?{?
- ????????????????foreach?my?$rrr?($r_query->answer)?{?
- ????????????????????????next?unless?$rrr->type?eq?"A";?
- ????????????????????????print?"Recursive?lookups?are?ENABLED?in?",$rres->nameserver(),":?",$rrr->address,?"n";?
- ????????????????}?
- ????????}?else?{?
- ????????????????warn?"OK.?Recursive?queries?are?not?answered.??Result:?",?$rres->errorstring,?"n";?
- ????????}?
- }?
- ?
- sub?MX_Records?{?
- ????????print?"MX?Records?is?:n";?
- ????????my?$res??=?Net::DNS::Resolver->new;?
- ????????my?@mx???=?mx($res,?$domain);?
- ????????if?(@mx)?{?
- ???????????????foreach?my?$rr?(@mx)?{?
- ????????????????????print?$rr->preference,?"?",?$rr->exchange,?"n";?
- ??????????????}?
- ????????}?else?{?
- ???????????????warn?"Can't?find?MX?records?for?$domain:?",?"n";?
- ????????}?
- }?
- ?
- sub?NS_Records?{?
- ????????print?"NS?Records?:?n";?
- ????????my?$res???=?Net::DNS::Resolver->new;?
- ????????my?$query?=?$res->query("$domain",?"NS");?
- ????????if?($query)?{?
- ????????????foreach?my?$rr?(grep?{?$_->type?eq?'NS'?}?$query->answer)?{?
- ????????????????????print?$rr->nsdname,?"n";?
- ????????????}?
- ????????}?
- ????????else?{?
- ????????????warn?"query?failed:?",?"n";?
- ????????}?
- }?
- ?
- sub?Reverse_MX?{?
- ????????my?$ip;?
- ????????print?"nChecking?Reverse?MX?Records?...n";?
- ????????my?$mx_res?=?Net::DNS::Resolver->new();?
- ????????my?$mxanswer?=?$mx_res->query($ip->reverse_ip(),'PTR');?
- ????????if($mxanswer)?{?
- ??????????????foreach?my?$mrr?(grep?{$_->type?eq?"PTR"?}?$mxanswer->answer)?{?
- ???????????????print?$ip->reverse_ip(),"?PTR?",$mrr->ptrdname,"n";?
- ???????????????}?
- ?
- ?
- ?????????}?else?{?
- ??????????print?"MX?records?not?foundn";?
- ?????????}?
- }?
- ?
- sub?SPF_Record?{?
- ????????print?"SPF?Records?is?:?n";?
- ????????#my?$domain=shift;?
- ????????my?$res=Net::DNS::Resolver->new();?
- ????????my?$spf_query=$res->query($domain,"TXT");?
- ????????if?($spf_query)?{?
- ????????????????foreach?my?$rr?($spf_query->answer)?{?
- ????????????????????????print?"SPF?record?ok:?",$rr->txtdata,?"n";?
- ????????????????}?
- ????????}?
- ????????else?{?
- ????????????????warn?"unable?to?get?SPF?record?:?",?"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 ----------------------------