#!/usr/bin/perl use Net::DNS; open(OUT, '>>dns.txt'); if($#ARGV < 1) { print "Usage: rdns.pl \n"; exit; } @DNSServers = split(/,/, $ARGV[0]); if($ARGV[1] =~ /\//) { ($begin, $end) = iprange_cidr($ARGV[1]); } else { ($begin, $end) = iprange($ARGV[1]); } # instantiate the DNS resolver $resolver = new Net::DNS::Resolver; $resolver->nameservers(@DNSServers); for($i = $begin; $i <= $end; $i++) { $ip_string = long2ip($i); print $ip_string, " "; $answer = $resolver->query($ip_string); if(defined($answer)) { $name = ($answer->answer)[0]; ($x1, $x2, $x3, $x4, $sym_name) = split(/\t/, $name->string); print "$sym_name\n"; printf(OUT "%s\n", $sys_name); } else { print OUT "unknown\n"; print "unknown\n"; } } sub ip2long { local($ip) = @_; local(@octets, $octet, $long); @octets = split(/\./, $ip); $long = 0; foreach $octet (@octets) { $long <<= 8; $long |= $octet; } $long; } sub long2ip { local($long) = @_; local($i, @octets, $retval); for($i = 3; $i >= 0; $i--) { $octets[$i] = ($long & 0xFF); $long >>= 8; } $retval = join('.', @octets); } sub iprange_cidr { local($masked_ip) = @_; local($begin_ip, $end_ip, $begin_mask, $end_mask, $ip, $mask, $mask_bits); ($ip, $mask) = split(/\//, $masked_ip); $mask_bits = 32 - $mask; $end_mask = 0xFFFFFFFF; $begin_mask = $end_mask << $mask_bits; $end_mask = ~$begin_mask; $begin_ip = $end_ip = ip2long($ip); $begin_ip &= $begin_mask; $end_ip |= $end_mask; ($begin_ip, $end_ip); } sub iprange { local($range) = @_; local($start, $end, $begin_ip, $end_ip); ($start, $end) = split(/-/, $range); $begin_ip = ip2long($start); $end_ip = ip2long($end); ($begin_ip, $end_ip); }