0

Is there a way to export DNS Reverse lookup entries from a Windows Server 2003 box running dnsmgmt into a reverse zone file that can be used by a Unix server running Bind?

If not, is there a way to automate the exportation of the reverse DNS information into text files so I can hack something up in Perl?

3 Answers 3

1

You could use the DNSCMD utility from the Windows Support Tools to export the zones using the /ZoneExport parameter. The export is a little quirky, because it exports to the %windir%\system32\dns directory on the server hosting the zones.

I'm not certain the format is exactly BIND format, but it's close. You could get it the rest of the way with a script fairly easily.

3
  • I found the zone files are automatically added to %SystemRoot%\System32\dns so now I have some text files to work with. Nov 2, 2009 at 19:51
  • You must be using "Standard Primary" zones, then. If you were using Active Directory integrated zones there wouldn't be any zone files there. Nov 2, 2009 at 19:52
  • Yes, I am not using Active Directory, just plain ol' DNS Nov 3, 2009 at 0:32
2

Why not set up a secondary DNS zone on the *nix box, authorise Zone Transfers on the 2003 server to that nix box, and then have a nice relaxing coffee?

3
  • 1
    Or just authorize transfers and use dig/host/nslookup and request a transfer.
    – Zoredache
    Nov 2, 2009 at 20:04
  • Yup - that too!
    – Izzy
    Nov 2, 2009 at 20:05
  • I am actually changing the authoritative Name Server of a bunch of domains over from one name server to another, so the above lazy solution will not work. Nov 3, 2009 at 0:33
0

Here is a Perl Script that I wrote to convert reverse DNS Zone Files from Windows to something that can be used by Bind on Unix. It creates a new Unix zone file for each Windows dns file and a named.conf.windows file (to put into your named.conf file on Unix) and a named.slave.inc.windows file (to put into named.slave.inc or named.slave.conf file on Unix).

#!/usr/bin/perl -w

# Author: John Scipione @ Netsville (http://www.netsville.com)
# This script converts reverse zone files found in 
# %SystemRoot%\System32\dns on a Windows server to ones that can 
# be used by Bind on a Unix server.


use strict;

my $primarydns = ''; # Hostname of your primary DNS server (w/o trailing .)
my $primarydnsip = ''; # IP of your primary DNS server
my $rootname = ''; # Domain Contact Root Name
my $secondarydns = ''; # Hostname of your secondary DNS server (w/o trailing .)
my $refresh = '3600';
my $retry = '600';
my $expire = '604800';
my $ttl = '3600'; # Minimum TTL


my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$year += 1900; # Perl uses years since 1900 by default
$mon = sprintf("%02d", $mon + 1); # Perl uses month [0..11] by default
$mday = sprintf("%02d", $mday);

open(MASTER, '>', 'named.conf.windows'); # blank file out
close(MASTER);

open(SLAVE, '>', 'named.slave.inc.windows'); # blank file out
close(SLAVE);

my @files = <*>;
foreach my $file (@files) {
    if (substr($file, -3) ne 'dns') {
        next; # skip if file does not end in .dns
    }
    my $outfilename = substr($file, 0, -3) . 'zone';
    my @pieces = split(/\./, $file);
    my $third_octet = $pieces[0];
    my $classB = $pieces[1] . '.' . $pieces[2];
    my $classC = $pieces[0] . '.' . $pieces[1] . '.' . $pieces[2];
    open(INFH, '<', $file);
    open(OUTFH, '>', $outfilename);
    print OUTFH "\$TTL $ttl\n";
    print OUTFH "\$ORIGIN $classB.in-addr.arpa.\n";
    print OUTFH "$third_octet\tIN\tSOA $primarydns. $rootname. (\n";
    print OUTFH "\t\t\t\t\t\t" . $year . $mon . $mday . "00\t; serial number\n";
    print OUTFH "\t\t\t\t\t\t$refresh\t\t; refresh\n";
    print OUTFH "\t\t\t\t\t\t$retry\t\t\t; retry\n";
    print OUTFH "\t\t\t\t\t\t$expire\t\t; expire\n";
    print OUTFH "\t\t\t\t\t\t$ttl )\t\t; default ttl\n\n";
    print OUTFH "\tIN\tNS\t$primarydns.\n";
    print OUTFH "\tIN\tNS\t$secondarydns.\n\n";
    print OUTFH "\$ORIGIN $classC.in-addr.arpa.\n";
    while (<INFH>) {
        if (substr($_, 0, 1) eq ';') {
            next; # skip comment lines
        }
        $_ =~ s/\r//g; # trim off \r

        if ($_ =~ /(\d+)\s+PTR\s+(\S+\.\S+\.\S+\.)/) {
            print OUTFH "$1\tIN\tPTR\t$2\n";
        } elsif ($_ =~ /\s+PTR\s+(\S+\.\S+\.\S+\.)/) {
            print OUTFH "\tIN\tPTR\t$1\n";
        }
    }

    close(INFH);
    close(OUTFH);

    open(MASTER, '>>', "named.conf.windows");
    print MASTER "zone \"$classC.in-addr.arpa\" {\n";
    print MASTER "  type master;\n";
    print MASTER "  file \"$classC.in-addr.arpa.zone\";\n";
    print MASTER "};\n";
    close(MASTER);

    open(SLAVE, '>>', "named.slave.inc.windows");
    print SLAVE "zone \"$classC.in-addr.arpa\" {\n";
    print SLAVE "  type slave;\n";
    print SLAVE "  file \"$classC.in-addr.arpa.bak\";\n";
    print SLAVE "  masters { $primarydnsip; };\n";
    print SLAVE "};\n";
    close(SLAVE);
}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .