AllKnowingDNS
view release on metacpan or search on metacpan
script/all-knowing-dns view on Meta::CPAN
#!/usr/bin/env perl
# vim:ts=4:sw=4:expandtab
use strict;
use warnings;
# These modules are in core:
use FindBin;
use lib "$FindBin::Bin/../lib";
use Getopt::Long;
use Sys::Syslog;
# All these modules are not in core:
use App::AllKnowingDNS::Util;
use App::AllKnowingDNS::Handler;
use Net::DNS::Nameserver;
use Privileges::Drop;
use v5.10;
our $VERSION = '1.7';
my $configfile = '/etc/all-knowing-dns.conf';
my $querylog = 0;
GetOptions(
'configfile=s' => \$configfile,
'querylog!' => \$querylog,
'version' => sub {
say "AllKnowingDNS v$VERSION " .
"© 2012 Michael Stapelberg and contributors";
exit 0;
},
'help' => sub {
say "all-knowing-dns [--configfile <path>] [--querylog]";
say "";
say "\t--configfile <path>\tSpecifies an alternate configfile location.";
say "\t\t\t\tThe default is /etc/all-knowing-dns.conf";
say "\t--querylog\t\tLogs every query to stdout (for debugging).";
say "";
exit 0;
},
);
openlog('all-knowing-dns', 'pid', 'daemon');
syslog('info', "AllKnowingDNS v$VERSION starting");
my $input;
my $fh;
if (!open($fh, '<', $configfile)) {
my $errormsg = qq|Could not load configfile ("$configfile"): $!|;
syslog('err', $errormsg);
die $errormsg;
}
{
local $/;
$input = <$fh>;
}
close($fh);
my $config = App::AllKnowingDNS::Util::parse_config($input);
# TODO: sanity check config
# XXX: port configurable? better error message when running without privileges
my $ns = Net::DNS::Nameserver->new(
LocalPort => 53,
LocalAddr => [ $config->all_listen_addresses ],
ReplyHandler => sub {
App::AllKnowingDNS::Handler::reply_handler($config, $querylog, @_)
},
# For Net::DNS < 0.67 we need this handler, otherwise it exits on notify.
NotifyHandler => sub { ('SERVFAIL', undef, undef, undef) },
Verbose => 0);
# Now that we are listening, drop privileges.
drop_privileges('nobody');
$ns->main_loop;
__END__
=head1 NAME
all-knowing-dns - Tiny DNS server for IPv6 Reverse DNS
=head1 SYNOPSIS
all-knowing-dns [--configfile <path>] [--querylog]
=head1 DESCRIPTION
AllKnowingDNS provides reverse DNS for IPv6 networks which use SLAAC
(autoconf), e.g. for a /64 network.
The problem with IPv6 reverse DNS and traditional nameservers is that the
nameserver requires you to provide a zone file. Assuming you want to provide
RDNS for a /64 network, you have 2**64 = 18446744073709551616 different usable
IP addresses (a little less if you are using SLAAC). Providing a zone file for
that, even in a very terse notation, would consume a huge amount of disk space
and could not possibly be held in the memory of the computers we have nowadays.
( run in 0.578 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )