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


25

我只想找出网络上未使用的IP地址。我认为nmap是可能的。有人可以这样说吗?

注意:

我只需要免费的IP列表。


还有其他要求吗?
谢尔盖(Sergey)

没有更多的其他要求。截至目前,我发现许多IP地址冲突,我只想找出网络上的免费IP地址并进行分配。
karthick87

Answers:


26

快速扫描程序是arp-scan,它使用ARP来“查看”网络上的其他计算机。它还返回MAC地址,并尝试确定网络适配器的制造商。

用法示例(如有需要,请替换wlan0eth0):

$ sudo arp-scan -I wlan0 192.168.1.0/24
Interface: wlan0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.6 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.1.10    00:90:f5:33:e2:f2       CLEVO CO.
192.168.1.254   00:14:7f:72:cd:05       Thomson Telecom Belgium

2 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.6: 256 hosts scanned in 1.406 seconds (182.08 hosts/sec).  2 responded

请注意,该实用程序仅报告已打开电源的计算机。ping可以被阻止,但arp-scan不能被阻止,因为一台计算机必须与网络上的其他计算机进行交互。为确保未使用IP,最好查看路由器(用于静态/动态地址)和DHCP服务器(用于动态地址)。


我想喜欢这个,但是在测试时错过了几个主机?!?:(
傻瓜愚人节

@bumblingfool:您确定其他主机在同一子网中吗?例如192.168.1.x而不是192.168.2.x?
Lekensteyn 2011年

是的,所有主机都在同一子网中。我又跑了十几遍,所有主机出现的时间都达到了三分之二。有趣的是(?),总是出现相同的主机(如果有的话)...这是在wifi网络上,但信号稳定。此外,上述nmap方法始终不会丢失任何主机。
笨拙的傻瓜

我们在谈论几个主持人?尝试使用-i参数增加发送数据包之间的延迟,例如-i 55 ms。
Lekensteyn 2011年

2/5。增加延迟可以解决问题。谢谢!
笨拙的傻瓜

15

sudo nmap -sP -PR 192.168.0.* (或您的网络是什么)将解决问题。

要安装它,请使用sudo apt-get install nmap

资料来源:serverfault.com

刚刚进行了测试,它就像一个包含被遮挡的主机的护身符一样,您需要添加sudo才能使用该-PR选项。


1
我刚刚测试了它,您需要以root身份运行(即使用sudo)。此外,它可能会被防火墙阻止,因为它还会扫描主机的端口,这也会减慢搜索速度。
Lekensteyn 2011年

阅读原始文章plz,第三条评论说明如何不使用(不必要的)端口扫描;)
Bruno Pereira

然后,您应该在回答中包括这一点,并非所有人都希望遵循这些信息。此外,描述命令的实际作用也将有所帮助。
Lekensteyn 2011年

完成;)的确很好。
布鲁诺·佩雷拉

Havent已测试(或曾经使用过)arp扫描,敬请谅解!
布鲁诺·佩雷拉

4

我发现fping很有用;除其他外,它将对一系列“有效”和“不可达”的地址和列表执行ping操作。默认情况下未安装fping。

sudo apt-get install fping

简单的方法是仅在一系列地址上运行它。

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

详细说明一下,以产生未使用的IP列表。

fping -g 192.168.0.2 192.168.0.254 2>/dev/null | grep 'is unreachable' | cut -d ' ' -f 1 | sort -t '.' -k 4 -n

1
不要忘记,这假设主机响应了ICMP Echo请求(也称为ping)。并非每台主机都这样做,尤其是某些MS Windows计算机没有。防火墙通常也禁用此功能,即使它们处于联机状态并且在您的网络中具有MAC地址也是如此。这是一个快速的解决方案,但不应在每种情况下都依赖它。
eaydin

你是对的; 涉及nmap的解决方案,或者可以使用ICMP以外的协议的ping替代方案,将更加可靠。
bgvaughan

3

我相信这不是最好的解决方案,但可以满足您的要求。该脚本ping192.168.0.0/24网络上运行,如果ARP缓存中没有IP地址,则返回无效IP的列表。

与先前解决方案相比的优势:

  • 使用两种方法:ping和ARP检查
  • 无需以root用户身份运行
  • 在我的Core i3-2100上运行约1.5分钟

要扫描您的网络,请使用<first IP> <last IP>参数运行它。

#!/usr/bin/env python
from threading import Thread
import subprocess
from Queue import Queue

verbose = False

num_threads = 8
queue = Queue()
inactive_ips = [0 for i in range(256)]

lines = open("/proc/net/arp", "r").readlines()
arp_cache = [l.split()[0] for l in lines[1:] if l.split()[2] == "0x2"]

def ip_str_to_int(ip):
    ip = ip.rstrip().split('.')
    ipn = 0
    while ip:
        ipn = (ipn << 8) + int(ip.pop(0))
    return ipn

def ip_int_to_str(ip):
    ips = ''
    for i in range(4):
        ip, n = divmod(ip, 256)
        ips = str(n) + '.' + ips
    return ips[:-1] ## take out extra point


#wraps system ping command
def pinger(i, q):
    while True:
        ip_num = q.get()
        ip = ip_int_to_str(ip_num)
        if ip not in arp_cache:
            ret = subprocess.call("ping -c 1 %s" % ip,
                  shell=True,
                  stdout=open('/dev/null', 'w'),
                  stderr=subprocess.STDOUT)
            if ret != 0:
                  inactive_ips[ip_num % 256] = ip
        q.task_done()


if __name__ == '__main__':
    from optparse import OptionParser
    usage = "usage: %prog [options] [first IP] [last IP]"
    parser = OptionParser(usage=usage)
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="make lots of noise")
    parser.add_option("-q", action="store_false", dest="verbose", help="print only IP adresses")
    (options, args) = parser.parse_args()
    verbose = options.verbose

    first = ip_str_to_int(args[0] if len(args) > 0 else "192.168.0.1")
    last = ip_str_to_int(args[1] if len(args) > 1 else "192.168.0.254")

    if verbose:
        print "Scanning inactive network addresses from %s to %s" % (
            ip_int_to_str(first),
            ip_int_to_str(last))

    for i in range(num_threads):
        worker = Thread(target=pinger, args=(i, queue))
        worker.setDaemon(True)
        worker.start()

    for ip in range(first, last + 1):
        queue.put(ip)

    queue.join()
    for ip in inactive_ips:
        if ip:
            print ip

下票后更新

我写它是因为nmap -PR 192.168.0.*对我不起作用:

Starting Nmap 5.21 ( http://nmap.org ) at 2011-10-06 15:34 EEST
Nmap done: 256 IP addresses (0 hosts up) scanned in 0.03 seconds

更新2

修复了ARP缓存的所有问题。


2
如果机器不响应ping怎么办?这是否意味着IP未使用?
布鲁诺·佩雷拉

@ brunopereira81我不知道有什么方法可以将免费IP与关闭电源的主机区分开。
谢尔盖(Sergey)

如果未关闭电源,则可以将计算机的防火墙配置为不响应正常的ping。这样,您不会得到任何答复,但这并不意味着计算机已关闭或没有运行的服务,而只是忽略了正常的ping操作。(我不知道与该问题相关的情况,但是)想象一下,他对防火墙/网关执行ping操作,而该防火墙/网关忽略了其ping操作,因为其配置为不响应,他假设IP是免费的,因此他可以使用它,在该防火墙/网关之后可以由于IP冲突而刚刚宕机的X台计算机!
布鲁诺·佩雷拉

@ brunopereira81我知道这并不理想。这就是为什么我称其为“快速又脏” :)
谢尔盖(Sergey)

好答案,我不明白降低答案的帮助。
nikhil 2011年

1

这应该在bash中正确执行:

#!/bin/bash

#setting language variables for subshell making sure we grep for the right word
LC_ALL=C
LANG=C

# retrieve IP from user input
read -p "Input your network (example: 192.168.0): " my_net

for i in $(seq 1 254);
do 
  ip="$my_net.$i"
  check="$(ping -c1 "$ip")"
  if [ "$(grep "Unreachable" <<<"$check")" != "" ]
  then
    echo "$ip is unreachable"
  fi
done

0

我认为这更简单

# my_net define my Net_ID
my_net=192.168.1.
for i in `seq 1 254`;
do 
  ip="$my_net$i"
  ping -c2  $ip | grep "is unreachable" | cut -d" " -f1 &
done

您可能想看看您的代码。在我的子网中,它向我显示了所有IP,甚至包括已使用的IP。
Videonauth

不,我对其进行了测试,并且对我而言工作正常,实际上,您无法设置那些ip地址为活动状态,因为我添加了grep,"is unreachable" 或者如果您对它进行更改,它grep -v time可能对您也可以工作
user3607303 16/05/24
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.