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 )