web-dev-qa-db-ja.com

リバースDNSの大量のIPをチェックする方法は?

IPの負荷に対してDNSチェックを逆にチェックする方法はありますか。チェックしたいIPのリストがありますか?

私はあなたがこれらを個別に行うことができることを知っています:

Host <ip-address>

そして

Dig -x <ip-address>

また、それらをエクスポートする方法はありますか?

6
Yen Deng

xargsはoptin --arg-fileを提供します。各行を引数として扱う-L1オプションを使用すると、作成できる最も簡単なコマンドは次のとおりです。

$ xargs -L1 --arg-file=ip-addr.txt Dig +short -x
google-public-dns-a.google.com.
resolver2.opendns.com.

解決されたドメインの横にIPアドレスを表示する必要がある場合は、次のこともできます。

$ xargs -L1 --arg-file=ip-addr.txt sh -c 'printf "%s: " "$1"; Dig +short -x "$1"' sh
8.8.8.8: google-public-dns-a.google.com.
208.67.220.220: resolver2.opendns.com.

もちろん、xargsは追加のプロセスです。 ShellとDigのみを使用する場合はどうなりますか? bashバージョン4以降では、mapfileまたはreadarrayを使用してテキストファイルの行を配列に取得し、ループでアイテムを処理できます。

$ mapfile -t -d $'\n' < ip-addr.txt
$ for i in "${MAPFILE[@]}" ; do printf "%s:" "$i"; Dig +short -x "$i"; done
8.8.8.8:google-public-dns-a.google.com.
208.67.220.220:resolver2.opendns.com.

IPアドレスが少なく、POSIXlyの長いテキストファイルを必要としない場合、setを使用して値を定位置パラメーターとして定義できます。

$ set -- 8.8.8.8 208.67.220.220
$ for i ; do printf "%s:" "$i"; Dig +short -x "$i"; done
8.8.8.8:google-public-dns-a.google.com.
208.67.220.220:resolver2.opendns.com.

次のようなスクリプトでDig -x $IP_ADDRESS +shortを使用することもできます。

#!/bin/bash
export LC_ALL=C
# without specifying 'in' part, bourne-like shells default
# to iterating over positional parameters
for item
do
     domain=$(Dig -x "$item"  +short)
     # this logic can also be reversed with
     # [ "x$domain" = "x" ] && echo "empty" || echo "$domain"
     if [ -n "$domain"  ] ;
     then
         echo "$domain"
     else
         echo "$item" result is NULL
     fi
done

サンプル使用のデモ(スペースで区切られたすべてのIPアドレス):

$ ./reverse_dns_lookup.sh 8.8.8.8 74.125.193.94 151.101.193.69                 
google-public-dns-a.google.com.
ig-in-f94.1e100.net.
151.101.193.69 result is NULL

ご覧のとおり、最後の例では、DNSサーバーは指定したIPアドレスのドメインを見つけられませんでした。そのような場合、別のDNSサーバーを使用できます。たとえば、Dig @208.67.220.220 $IP_ADDRESS +shortのopen_dns

上記のデモでは、IPアドレスは./reverse_dns_lookup.sh ADDRESS1 ADDRESS2 ADDRESS2のようにコマンドラインで提供されますが、次のようにファイルを使用することもできます。

$ cat ip_addresses.txt |  xargs ./reverse_dns_lookup.sh                          <
google-public-dns-a.google.com.
resolver2.opendns.com.
192.30.253.112 result is NULL

代替スクリプトバージョン

Dig's出力からAUTHORITYセクションを出力するスクリプトの代替バージョンは次のとおりです。これは、+shortバージョンよりもはるかに優れており、信頼性が高い場合があります。注:これは8.8.8.8を使用します。これはGoogleのパブリックDNSです。必要に応じて別のサーバーを使用してください。

#!/bin/bash
export LC_ALL=C
for item
do
 domain=$(Dig @8.8.8.8  -x "$item" +noall +authority +answer)
 if [ -n "$domain"  ] ;
 then
     echo "$domain"
 else
     echo "$item" result is NULL
 fi
done

デモ:

$ cat ip_addresses.txt |  xargs ./reverse_dns_lookup.sh 

; <<>> Dig 9.10.3-P4-Ubuntu <<>> @8.8.8.8 -x 8.8.8.8 +noall +authority +answer
; (1 server found)
;; global options: +cmd
8.8.8.8.in-addr.arpa.   21390   IN  PTR google-public-dns-a.google.com.

; <<>> Dig 9.10.3-P4-Ubuntu <<>> @8.8.8.8 -x 208.67.220.220 +noall +authority +answer
; (1 server found)
;; global options: +cmd
220.220.67.208.in-addr.arpa. 6674 IN    PTR resolver2.opendns.com.

; <<>> Dig 9.10.3-P4-Ubuntu <<>> @8.8.8.8 -x 192.30.253.112 +noall +authority +answer
; (1 server found)
;; global options: +cmd
253.30.192.in-addr.arpa. 10 IN  SOA ns1.p16.dynect.net. ops.github.com. 6 3600 600 604800 60
9

これは、手早く汚れたライナーです:ip-addresses.txtの内容:

$ cat ip-addresses.txt
    1.2.3.4
    1.1.1.1
    222.222.222.222
    23.12.34.56
    8.8.8.8
    208.67.222.220

Txtを、改行で区切られたアドレスを含むファイルに置き換えます。

$ cat ip-addresses.txt | xargs -I % bash -c 'echo "%:$(Dig -x % +short)"' >> Dig-output.txt

上記のようにDig-output.txtに追加すると、そのファイルの内容は以下のようになります。逆DNSルックアップが成功した場合、IP:NAME、そうでない場合、IP:(NULL)

$ cat Dig-output.txt
1.2.3.4:
1.1.1.1:
222.222.222.222:
23.12.34.56:a23-12-34-56.deploy.static.akamaitechnologies.com.
8.8.8.8:google-public-dns-a.google.com.
208.67.222.220:resolver3.opendns.com.

IPアドレスが別のプロセスから来ている場合は、xargsに直接パイプできます。

編集:ルックアップに失敗した場合にnull(@Sergにヒントを得た)などのWordが必要な場合は、以下のコマンドを使用できます。

$ cat ip-addresses.txt | xargs -I % bash -c '{ query=$(Dig -x % +short); if [ -z $query ]; then query=null;fi; echo %:$query; }'
  • cat ip-addresses.txt#IPアドレスをSTDOUTに出力します。ファイルからcatしたくない場合は、command | xargs ...のような別のプロセスから直接パイプすることができます
  • xargs -I % bash -c#パイプの左から各行を取得し、プレースホルダーとして%を使用し、単一引用符で囲んだbashコマンドを実行します
  • Digプレースホルダーから取得したIPアドレス% by xargs、変数queryに割り当てます。結果がnull(長さゼロ)である場合、文字列 'null' Wordをquery変数に割り当て、IP:resultとして出力します

デモ:

$ cat ip-addresses.txt | xargs -I % bash -c '{ query=$(Dig -x % +short); if [ -z $query ]; then query=null;fi; echo %:$query; }'
1.2.3.4:null
1.1.1.1:null
222.222.222.222:null
23.12.34.56:a23-12-34-56.deploy.static.akamaitechnologies.com.
8.8.8.8:google-public-dns-a.google.com.
208.67.222.220:resolver3.opendns.com.
3
sdkks

別の回答に示されているシェルの例に触発されて、Perlのバージョンがより適していると判断したため、このファイル「batch_dns_by_ip.pl」を作成しました。プログラムにパイプするテキストファイルにIPアドレスのリストを配置します。

コードは次のようになり、ファイルを実行可能にする必要があります。

#!/usr/bin/Perl
use strict;
my @domains;
my $address;
while (<>)
{
        chomp;
        $address = $_;
        $address =~ s/ *//g;
        @domains = ();
        @domains=`Dig -x "$address" +short`;
        chomp(@domains);
        if ("$domains[0]" eq "")
        {
                 $domains[0] = "NULL";
        }
        printf("addr: %15s names: %s", $address, $domains[0]);
        if ("$domains[1]" eq "")
        {
                print "\n";
        }
        else
        {
                printf(", %s\n", $domains[1]);
        }
}

実行は次のようになります。

$ cat myips | ./batch_dns_by_ip.pl
addr:  216.58.219.238 names: lga25s41-in-f14.1e100.net., lga25s41-in-f238.1e100.net.
addr:  151.101.129.69 names: NULL
addr:         8.8.8.8 names: google-public-dns-a.google.com.
addr:     10.49.11.62 names: nyalbdnsvip01.miscny.nyenet., nyalbcwgbvip01-vlan401.miscny.nyenet.
addr:  69.172.201.153 names: NULL

それがお役に立てば幸いです!

1
James Ebersold

nmap

できます

 nmap -R -sL -Pn 1.2.3.0/24 | grep '('
  • -n/-R DNS解決を行わない/常に解決する[デフォルト:時々]
  • -sLリストスキャン-スキャンするターゲットをリストするだけです
  • -Pnすべてのホストをオンラインとして扱います-ホスト検出をスキップします。これを削除して、pingへの応答を取得します。

grep leaveは、逆DNSといくつかの有用な行を解決しました。

特定のDNSサーバーを使用するには、--dns-servers x.x.x.xを追加します。

1
Pablo Bianchi