raino's knowledge base
dns
最終更新:
Bot(ページ名リンク)
-
view
raino以外に使いたい人は居ないかもしれない。DNSレコード大量追加時に使用する。
仕様
1: 引数で -f が指定されていた場合、ファイル"/home/user/dnsrr"を一行ずつ読み込み、IPアドレスが存在する行に対して以下を実行
- IPアドレスを抽出
- ホスト名を抽出
- 正引きデータを作成&表示
2: 引数で -r が指定されていた場合、ファイル"/home/user/dnsrr"を一行ずつ読み込み、IPアドレスが存在する行に対して以下を実行
- IPアドレスの第4オクテットを抽出
- ホスト名を抽出、FQDN作成
- 逆引きデータを作成&表示
3: 引数で -c が指定されていた場合、ファイル"/home/user/dnsrr"を一行ずつ読み込み、IPアドレスが存在する行に対して以下を実行
- IPアドレスを抽出
- digで逆引きを実行
- 結果表示(引けなかった場合は"xxx.xxx.xxx.xxx is no match!!"を表示)
- 1行目からファイル"dnsrr"を再び読み込み、IPアドレスが存在する行に対して以下を実行
- ホスト名を抽出、FQDN作成
- digで正引きを実行
- 結果表示(引けなかった場合は"xxx is no match!!"を表示)
4: 引数が "-f" "-r" "-c" 以外 or 指定されていない場合は 1 & 2 を実行
補足:生成される正&逆引きファイルはTab=半角スペース×8の場合は見栄え良く整形されます。
使い方
1: ホームディレクトリ(/home/user)配下にファイル名"dnsrr"でhost名、IPアドレスを記述
2: seiseikun -c を実行し、登録内容に重複がないか調べる
3: seiseikun -f を実行し、正引きファイルを表示 クリップボードにコピーするなりして正引きゾーンファイルに貼り付け、シリアルを上書きする
4: seiseikun -r を実行し、逆引きファイルを表示 クリップボードにコピーするなりして逆引きゾーンファイルに貼り付け、シリアルを上書きする
5: named再起動、/var/adm/messaegsチェック
6: seiseikun -c を実行し、登録内容のチェックをする
2: seiseikun -c を実行し、登録内容に重複がないか調べる
3: seiseikun -f を実行し、正引きファイルを表示 クリップボードにコピーするなりして正引きゾーンファイルに貼り付け、シリアルを上書きする
4: seiseikun -r を実行し、逆引きファイルを表示 クリップボードにコピーするなりして逆引きゾーンファイルに貼り付け、シリアルを上書きする
5: named再起動、/var/adm/messaegsチェック
6: seiseikun -c を実行し、登録内容のチェックをする
#手順3
,4補足:
ゾーンファイルをviエディタで開いた後、RRを追加したい箇所に空行を入れカーソルをそこに合わせた状態で、コマンドモードに移行し !!seiseikun {-f|-r} と打ってやると超簡単。
ゾーンファイルをviエディタで開いた後、RRを追加したい箇所に空行を入れカーソルをそこに合わせた状態で、コマンドモードに移行し !!seiseikun {-f|-r} と打ってやると超簡単。
my $DATE = `date +%Y%m%d`;
my $MATCHIP = '(?:::(?:f{4}:)?)?(*1)';
my $MATCHHOST = '[0-9a-zA-Z\-]+.?[0-9a-zA-Z\-]+|[0-9a-zA-Z\-]?\.?[0-9a-zA-Z\-]+';
if ( @ARGV == 0 ) {
$ARGV[0] = 0;
}
open( DNSRR, "/home/user/dnsrr" );
if ( $ARGV[0] eq "-f" ) {
&ffile;
} elsif ( $ARGV[0] eq "-r" ) {
&rfile;
} elsif ( $ARGV[0] eq "-c" ){
print "\nreverse lookup start\n\n";
while (<DNSRR>) {
chomp;
if (/.*$MATCHIP.*/) {
s/($MATCHIP)//;
my $IP = $1;
my $DIG = `/usr/sbin/dig -x $IP ptr|grep 'IN PTR'`;
if ($DIG) {
print $DIG;
} else {
print "########$IP is no match!!########\n";
}
}
}
close( DNSRR );
open( DNSRR, "/home/user/dnsrr" );
print "\nforward lookup start\n\n";
while (<DNSRR>) {
chomp;
if (/.*$MATCHIP.*/) {
s/($MATCHIP)//;
/($MATCHHOST)/;
my $HOST = $1;
$HOST .= "\.example\.com\.";
my $DIG = `/usr/sbin/dig $HOST a|grep $HOST|grep 'IN A'`;
if ($DIG) {
print $DIG;
} else {
print "########$HOST is no match!!########\n";
}
}
}
} else {
&ffile;
close( DNSRR );
open(DNSRR, "/home/user/dnsrr" );
&rfile;
}
close( DNSRR );
sub ffile {
while (<DNSRR>) {
chomp;
if (/.*$MATCHIP.*/) {
s/($MATCHIP)//;
my $IP = $1;
/($MATCHHOST)/;
my $HOST = $1;
if (length( $HOST ) <= 7) {
print "$HOST\t\t\tIN\tA\t$IP\t\;$DATE";
} elsif (length( $HOST ) <= 15) {
print "$HOST\t\tIN\tA\t$IP\t\;$DATE";
} else {
print "$HOST\tIN\tA\t$IP\t\;$DATE";
}
}
}
}
sub rfile {
while (<DNSRR>) {
chomp;
if (/.*$MATCHIP.*/) {
s/($MATCHIP)//;
my $IP = $1;
my @OCTET = split /\./,$IP;
s/\s?//g;
/($MATCHHOST)/;
my $HOST = $1;
$HOST .= "\.example\.com\.";
if (length( $HOST ) <= 23) {
print "$OCTET[3]\tIN\tPTR\t$HOST\t\t\t\t\t\;$DATE";
} elsif (length( $HOST ) <= 31) {
print "$OCTET[3]\tIN\tPTR\t$HOST\t\t\t\t\;$DATE";
} elsif (length( $HOST ) <= 39) {
print "$OCTET[3]\tIN\tPTR\t$HOST\t\t\t\;$DATE";
} elsif (length( $HOST ) <= 47) {
print "$OCTET[3]\tIN\tPTR\t$HOST\t\t\;$DATE";
} else {
print "$OCTET[3]\tIN\tPTR\t$HOST\t\;$DATE";
}
}
}
}