有没有办法将运行 dnsmgmt 的 Windows Server 2003 中的 DNS 反向查找条目导出到运行 Bind 的 Unix 服务器可以使用的反向区域文件中?
如果没有,有没有办法可以自动将反向 DNS 信息导出到文本文件中,以便我可以用 Perl 进行破解?
答案1
您可以使用DNS命令使用 Windows 支持工具中的实用程序,使用 /ZoneExport 参数导出区域。导出过程有点奇怪,因为它会导出到托管区域的服务器上的 %windir%\system32\dns 目录。
我不确定格式是否完全符合 BIND 格式,但很接近。您可以相当轻松地使用脚本完成其余操作。
答案2
为什么不在 *nix 盒上设置辅助 DNS 区域,授权 2003 服务器上的区域传输到该 nix 盒,然后喝一杯舒适的咖啡呢?
答案3
这是我编写的 Perl 脚本,用于将 Windows 中的反向 DNS 区域文件转换为 Unix 上的 Bind 可以使用的文件。它为每个 Windows dns 文件创建一个新的 Unix 区域文件和一个 named.conf.windows 文件(在 Unix 上放入您的 named.conf 文件)和一个 named.slave.inc.windows 文件(在 Unix 上放入 named.slave.inc 或 named.slave.conf 文件)。
#!/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);
}