网络地图

网络地图

有没有办法检查大量 IP 的反向 DNS 检查,我有一个想要检查的 IP 列表?

我知道您可以单独完成这些操作:

host <ip-address>

dig -x <ip-address>

另外,有没有办法导出它们?

答案1

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 及更高版本,我们可以使用mapfilereadarray将文本文件的行放入数组中,然后循环处理项目:

$ 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 服务器,例如 open_dnsdig @208.67.220.220 $IP_ADDRESS +short

在上面的演示中,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

替代脚本版本

这是打印输出中 AUTHORITY 部分的脚本的替代版本dig's。这可能比+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

答案2

以下是一个快速而粗略的一行: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 启发),则可以使用以下命令:

$ 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 地址xargs,分配给变量query。如果结果恰好是null(零长度),则将字符串“null”字分配给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

网络地图

你可以

nmap -R -sL -Pn 1.2.3.0/24 | grep '('
  • -n/-R从不进行 DNS 解析/始终解析 [默认值:有时]
  • -sL列出扫描 - 简单列出要扫描的目标
  • -Pn将所有主机视为在线 - 跳过主机发现。删除此项以获取对 ping 的响应。

留下grep的只是解析的反向DNS和一些有用的行。

添加--dns-servers x.x.x.x使用特定 DNS 服务器例如 1.1.1.1

答案4

受到另一个答案中所示的 shell 示例的启发,我决定使用 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

我希望这能有所帮助!

相关内容