simple/dns/check-ptr

69 lines
1.7 KiB
Perl
Executable File

#!/usr/bin/perl -w
use strict;
use Net::DNS;
sub usage {
print STDERR "Usage: $0 ip-address\n";
exit(1);
}
usage() unless (@ARGV == 1);
# generic resolver
my $res0 = new Net::DNS::Resolver;
my $ipv4 = $ARGV[0];
my $rev_domain = join(".", reverse (split(/\./, $ipv4)), "in-addr", "arpa");
print STDERR "$rev_domain\n";
my $reply = $res0->send($rev_domain, 'PTR');
if ($reply->answer) {
for my $rr ($reply->answer) {
if ($rr->type eq 'PTR') {
print STDERR "\t", $rr->ptrdname, "\n";
check_a($rr->ptrdname, $ipv4);
}
}
} elsif ($reply->authority) {
for my $rr ($reply->authority) {
if ($rr->type eq 'SOA') {
print STDERR "\t", $rr->mname, "\n";
my $res1 = Net::DNS::Resolver->new();
$res1->nameservers($rr->mname);
my @zone = $res1->axfr($rev_domain);
for my $rr (@zone) {
if ($rr->type eq 'PTR') {
print STDERR "\t\t", $rr->ptrdname, "\n";
my $ipv4 = join(".", (reverse(split(/\./, $rr->name)))[2..5]);
check_a($rr->ptrdname, $ipv4);
}
}
}
}
} else {
$reply->print
}
sub check_a {
my ($domain_name, $a) = @_;
# check that $domain_name resolves to $a
my $reply = $res0->send($domain_name, 'A');
if ($reply->answer) {
for my $rr ($reply->answer) {
if ($rr->type eq 'A') {
print STDERR "\t\t", $rr->address, "\n";
if ($rr->address eq $a) {
print STDERR "\t\t\tfound\n";
return 1;
}
}
}
}
print " $a $domain_name FWD_FAIL\n";
return 0;
}