如何使用Linux在网络上查找未使用的IP地址?


28

我可以访问网络上的两台计算机(A和B)。两者都有一个子网掩码为255.255.255.128的静态IP地址(我检查是否未使用DHCP服务器)。我想在同一台机器上配置多个IP地址,因此我想知道子网中已经使用了所有IP地址。

从一个较早的问题开始,我尝试使用nmap -sP -PR 172.16.128.*命令,但是我对它的结果表示怀疑,因为同一条命令在两台计算机(A和B)上给出的结果不同。在A上,结果显示(假设)已经使用的8个IP地址的列表,包括A和B的 IP地址。

Nmap done: 256 IP addresses (8 hosts up) scanned in 1.23 seconds

但是在B上,结果不同,即

Nmap done: 256 IP addresses (0 hosts up) scanned in 0.00 seconds

B上的结果甚至没有显示其自己的IP地址以及A的IP地址!

我到底在做什么错?在Red Hat Linux(RHEL)中,有什么万无一失的方法来发现我的计算机所属的子网中正在使用的所有IP地址?

RHEL: 6.5
Nmap version: 5.51

9
谁管理网络?您是否有权为其主机分配任意IP地址?
罗杰·利普斯科姆

4
是的,我同意。这是个好问题。
维沙尔·沙尔玛(Vishal Sharma)

11
获得正确答案的唯一方法是询问您的网络管理员。你做任何事情有可能被不准确的,因为设备可能被关闭,重启,反应迟钝等
乔恩·本特利

7
要完成罗杰和乔恩的评论,如果网络中的IP是手动分配的,并且没有DHCP,则应该在某个位置(无论是数据库,Excel工作表还是旧文件目录)都有一个寄存器,其中记录了每个IP分配和人员管理网络必须拥有并使用此信息。没有任何技术解决方案可以确保您不会不情愿窃取另一台计算机的IP(让它成为停机服务器或远程用户笔记本电脑)。如果该寄存器丢失或不存在,则需要完整的清单。
zakinster '18

您应该引用通配符的IP地址,以确保您的外壳程序不会尝试将其扩展为可能的文件名。例如,nmap -sP -PR '172.16.128.*'
roaima

Answers:


39

以太网LAN上任何运行良好的设备都可以随意忽略几乎所有流量,因此PING,端口扫描等都不可靠。但是,设备不能随意忽略ARP请求 afaik。假定您指定要扫描本地网络,那么我发现执行操作所需的最不易碎的方法是尝试连接到远程地址,然后查看我的ARP缓存。

这是一个简单的非过滤设备(即未配置为忽略某些IP流量类的设备):

[me@risby tmp]$ ping -c 1 -W 1 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=0.351 ms
[...]
[me@risby tmp]$ arp -a -n|grep -w 192.168.3.1
? (192.168.3.1) at b8:27:eb:05:f5:71 [ether] on p1p1

这是一个过滤设备(一个配置有一行iptables以忽略所有流量的设备):

[me@risby tmp]$ ping -c 1 -W 1 192.168.3.31
[...]
1 packets transmitted, 0 received, 100% packet loss, time 0ms
[me@risby tmp]$ arp -a -n|grep -w 192.168.3.31
? (192.168.3.31) at b8:27:eb:02:e4:46 [ether] on p1p1

这是一台跌倒的设备;请注意缺少MAC地址:

[me@risby tmp]$ ping -c 1 -W 1 192.168.3.241
[...]
1 packets transmitted, 0 received, 100% packet loss, time 0ms
[me@risby tmp]$ arp -a -n|grep -w 192.168.3.241
? (192.168.3.241) at <incomplete> on p1p1

这种方法并非万无一失-一方面它会丢失已关闭的设备,但这是我尝试过的最不可怕的方法。

编辑:埃里克·杜米尼尔(Eric Duminil),是的,它仅适用于本地网络;参见第一段。

可见,这些方法在功能上是相同的。请注意Leo的答案中引用的文本nmap

当特权用户尝试扫描本地以太网上的目标时,除非--send-ip指定,否则将使用ARP请求。

他的方法涉及较少的打字。我的工作可以毫无特权地完成,并且可以使您更好地了解实际情况。但是,在两种情况下,电线上都会做同样的事情。


2
这仅适用于同一局域网中的设备吗?我在我的服务器上进行了尝试,ping请求被丢弃在两者之间的某个位置,而我找不到任何相关的行arp
埃里克·杜米尼尔

感谢您的回复。我只是想知道您的方法与@Leo的方法相比如何?它在某种程度上是否比这更好(因为否则只使用一个命令会更容易)。
维沙尔·沙尔玛(Vishal Sharma)

2
@VishalSharma和EricDuminil:请参见上面的编辑。
MadHatter支持Monica

只是要清楚一点,这是否意味着@Leo的方法仅在特权用户使用时才与您类似,因此当特权用户使用时,其结果将不完整/不正确?另外,特权用户是指具有sudo访问权限的用户?
沙尔玛(Vishal Sharma)

1
@VishalSharma您评论的第一部分是正确的。特权用户包括在sudo -u root(通常简称为sudo)下做某事,而且还简单地以root用户身份登录或已经完成/bin/su(因此是总称)。
MadHatter支持莫妮卡

20

由于设备无法忽略ARP请求,因此我喜欢使用名为的工具arp-scan。它在大多数存储库中都可用。

使用--localnet交换机运行命令时,它将为您提供整个内部网络的概述。

sudo arp-scan --localnet

给我列出我网络上所有IP和MAC地址的列表。还可以指定要扫描的网络范围。

sudo arp-scan 172.16.128.0/25

如果您配置了多个网络接口,则可以指定要用于交换机的接口-I

sudo arp-scan -I eth0 172.16.128.0/25

有关可能的开关的更多信息,参见https://linux.die.net/man/1/arp-scan或通过运行man arp-scan


看起来像是很有前途的工具,但是RHEL 6.5并没有提供它(在我的情况下,它至少不存在)。
维沙尔·沙尔玛(Vishal Sharma)

@VishalSharma不幸的是。它可用于CentOS,因此我想它也应该在RHEL上可用。
胸脯

4
它在EPEL中,这是Fedora的企业Linux附加软件包。
mattdm

如果LaBrea正在运行,则无法使用。
joshudson

@joshudson我很确定在LaBrea运行时,任何工具/软件都不可能扫描网络中未使用的IP地址。
胸脯

11

我不知道您的Red Hat 6.5中正在运行哪个版本的nmap,但是对于最新发行版,我认为正确(且更快)的方式是:

nmap -sn -n 172.16.128.0/25

这将列出网络中的每个主机(因此,您可以使用该子网中的任何其他IP,因为它应该可用)。

编辑并注意:您提到的子网是255.255.255.128,但是随后您将输出显示为扫描254台主机。除非我缺少任何东西,否则应该是/ 25掩码和126个可用主机。如果要扫描/ 24,请更改上面的命令以查询所有254台主机。

在nmap书中,-sP已停产并被替换为-sn

-sn(无端口扫描)

此选项告诉Nmap在主机发现之后不要执行端口扫描,并且仅打印出响应主机发现探针的可用主机。这通常称为“ ping扫描”,但您也可以请求运行traceroute和NSE主机脚本。默认情况下,此步骤比列表扫描更具干扰性,通常可以用于相同目的。它允许对目标网络进行轻侦察,而不会引起太多关注。与每个IP和主机名的列表扫描所提供的列表相比,知道启动了多少台主机对攻击者而言更有价值。

系统管理员经常发现此选项也很有价值。它可以轻松地用于计算网络上的可用计算机或监视服务器可用性。这通常称为ping扫描,并且比ping广播地址更可靠,因为许多主机不回复广播查询。

使用-sn完成的默认主机发现默认包括一个ICMP回显请求,到端口443的TCP SYN,到端口80的TCP ACK和一个ICMP时间戳请求。当由非特权用户执行时,仅SYN数据包(使用连接调用)发送到目标上的端口80和443。当特权用户尝试扫描本地以太网上的目标时,除非指定了--send-ip,否则将使用ARP请求。可以将-sn选项与任何发现探针类型(-P *选项,-Pn除外)组合使用,以提高灵活性。如果使用这些探针类型和端口号选项中的任何一个,则默认探针将被覆盖。如果在运行Nmap的源主机和目标网络之间设置了严格的防火墙,则建议使用这些高级技术。

在Nmap的早期版本中,-sn被称为-sP。

-n是为了避免客户端的DNS解析(使扫描更快):

-n(无DNS解析)

告诉Nmap永远不要对找到的活动IP地址进行DNS解析。由于即使使用Nmap的内置并行存根解析器,DNS也会变慢,因此此选项可以减少扫描时间。

您可以使用其他组合来加深扫描或服务,但除非主机掩盖了自己或丢弃了所有内容,否则这足以满足您的需求。

资料来源:https : //nmap.org/book/man-host-discovery.html


我提到的输出是命令nmap -sP -PR 172.16.128。*的输出,这就是为什么它扫描254台主机的原因。
维沙尔·沙尔玛(Vishal Sharma)'18年

在我的情况下,网络ID为172.16.128.128,因此,我不得不修改您建议的命令。我使用了nmap -sn -n 172.16.128.128/25。
维沙尔·沙尔玛(Vishal Sharma)'18年

我不确定网络ID是什么意思,但是如果您的设备具有该地址,并且您希望在子网中扫描所有254台主机,则应nmap -sn -n 172.16.128.1/24改为运行 (如我在上面的回答中所述,它将扫描255.255。 255.0面具)
狮子座

通过网络ID,我的意思是通过执行IP_Address和子网掩码的“逻辑与”获得的字符串。
维沙尔·沙尔玛(Vishal Sharma)

我懂了。那么,我发布的nmap命令是否可以回答您的问题?两个设备都列出使用相同的地址吗?
狮子座

8

第1部分-Fping

此工具可ping通指定网络范围内的所有内容,并显示通过ICMP回答的内容。

root@thionite:~# fping -a -g 10.28.1.0/24
10.28.1.1
10.28.1.2
10.28.1.3
10.28.1.4
10.28.1.5
10.28.1.12.....

第2部分-ARP

由于fping与LAN上的所有内容进行通信,因此将导致条目添加到系统的ARP表中。几分钟后就可以读出来,因为arp表会刷新旧条目。

root@thionite:~# arp -a | grep -v incomplete
? (10.28.1.1) at 00:0d:b9:35:29:c4 [ether] on eth0
? (10.28.1.2) at 68:05:ca:10:53:5f [ether] on eth0
? (10.28.1.3) at d2:f1:6e:54:05:22 [ether] on eth0
? (10.28.1.4) at 00:1a:4d:26:85:ee [ether] on eth0
? (10.28.1.5) at 6e:a6:e5:78:da:ca [ether] on eth0
? (10.28.1.12) at 3c:4a:92:76:85:d8 [ether] on eth0

还要注意,ARP表具有最大大小,内核将逐出旧的和低使用率的条目。

放在一起

 fping -a -g 10.28.1.0/24 && arp -a | grep -v incomplete > arp.txt

然后在闲暇时浏览arp.txt。


5

IPv6

不要以为IPv4是您唯一的选择。即使您的ISP不提供V6连接,许多现代操作系统也可以很好地处理IPv6。

甚至可能存在只能通过IPv6甚至其他协议访问的设备。

https://en.wikipedia.org/wiki/Multicast_address#IPv6中记录了很多方便的多播地址, 但有趣的是ff02 :: 1

root@thionite:~# ping6 -I eth0 ff02::1
PING ff02::1(ff02::1) from fe80::4261:86ff:fec4:cbaa%eth0 eth0: 56 data bytes
64 bytes from fe80::4261:86ff:fec4:cbaa%eth0: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from fe80::21a:4dff:fe26:85ee%eth0: icmp_seq=1 ttl=64 time=0.215 ms (DUP!)
64 bytes from fe80::6a05:caff:fe10:535f%eth0: icmp_seq=1 ttl=64 time=0.233 ms (DUP!)
64 bytes from fe80::226:55ff:feda:299c%eth0: icmp_seq=1 ttl=64 time=0.334 ms (DUP!)
64 bytes from fe80::20d:b9ff:fe35:29c4%eth0: icmp_seq=1 ttl=64 time=0.501 ms (DUP!)
64 bytes from fe80::21e:c2ff:fe13:36bf%eth0: icmp_seq=1 ttl=64 time=0.512 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:85d8%eth0: icmp_seq=1 ttl=1 time=0.518 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:8506%eth0: icmp_seq=1 ttl=1 time=0.757 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:e550%eth0: icmp_seq=1 ttl=1 time=0.772 ms (DUP!)
64 bytes from fe80::60cc:69ff:fe4f:7db0%eth0: icmp_seq=1 ttl=64 time=0.992 ms (DUP!)
64 bytes from fe80::90e4:77ff:fe32:3232%eth0: icmp_seq=1 ttl=64 time=1.00 ms (DUP!)
64 bytes from fe80::90e4:77ff:fe30:3030%eth0: icmp_seq=1 ttl=64 time=1.24 ms (DUP!)
64 bytes from fe80::90e4:77ff:fe31:3131%eth0: icmp_seq=1 ttl=64 time=1.34 ms (DUP!)
64 bytes from fe80::6ca6:e5ff:fe78:daca%eth0: icmp_seq=1 ttl=64 time=2.35 ms (DUP!)
64 bytes from fe80::b639:d6ff:feab:1000%eth0: icmp_seq=1 ttl=64 time=7.04 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:85d8%eth0: icmp_seq=1 ttl=1 time=8.02 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:8506%eth0: icmp_seq=1 ttl=1 time=8.03 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:e550%eth0: icmp_seq=1 ttl=1 time=8.06 ms (DUP!)
64 bytes from fe80::212:12ff:fef7:8044%eth0: icmp_seq=1 ttl=64 time=8.24 ms (DUP!)
64 bytes from fe80::8edc:d4ff:fef2:67e0%eth0: icmp_seq=1 ttl=64 time=18.3 ms (DUP!)
64 bytes from fe80::21e:c2ff:fea9:6d71%eth0: icmp_seq=1 ttl=64 time=295 ms (DUP!)
...repeats

3

一个糟糕的答案是使用ping Ping广播地址

root@thionite:~# ping -b 10.28.255.255
WARNING: pinging broadcast address
PING 10.28.255.255 (10.28.255.255) 56(84) bytes of data.
64 bytes from 10.28.2.7: icmp_seq=1 ttl=64 time=0.220 ms
64 bytes from 10.28.3.12: icmp_seq=1 ttl=255 time=0.594 ms (DUP!)
64 bytes from 10.28.9.4: icmp_seq=1 ttl=64 time=1.03 ms (DUP!)
64 bytes from 10.28.1.151: icmp_seq=1 ttl=255 time=1.04 ms (DUP!)
64 bytes from 10.28.3.13: icmp_seq=1 ttl=255 time=2.22 ms (DUP!)
64 bytes from 10.28.3.11: icmp_seq=1 ttl=255 time=2.43 ms (DUP!)

该网络上有约50个IP地址,带有/ 16子网掩码,只有七个响应。因此,这不是一个好的解决方案。


1
为什么答案不同?您可以编辑帖子
雏菊

3
@daisy,因为它们是不同的答案。一个整体的答案可能是好的,但被压低了一部分。单独的答案使上下表决机制可以正常工作。这个答案实际上只是为了完整性,在实践中并不是很有用。
克里吉

1
ping测试的唯一一件事就是是否将设备配置为响应ping。
罗伯·摩尔

@RobMoir true-这样做的主要目的是广播地址存在并且已将其设计到IPv4中。
克里基


1

当恐龙在地球上漫游时,原始人使用arpwatch

arpwatch是一种计算机软件工具,用于监视计算机网络上的地址解析协议流量。[1] 当配对出现在网络上时,它将生成一个观察到的IP地址与MAC地址配对以及一个时间戳的日志。还可以选择在配对更改或添加配对时向管理员发送电子邮件。

arpwatch手册页


0

登录到您的交换机并发出 show mac-address 或类似的命令(取决于品牌和型号)。这将为您提供活动设备的所有MAC地址(交换机本身除外)。如果在其他答案中以任何ping或其他方法找到的MAC中没有出现这些MAC中的任何一个,则您可能需要进一步调查是什么设备。也许没关系,因为它甚至不讲IP或属于不同的VLAN,但是至少您可以大致了解其他探针是否准确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.