Как найти неиспользуемый IP-адрес в сети?

Я просто хочу узнать неиспользуемый IP-адрес в сети. Я думаю, что это возможно с Nmap. Может ли кто-нибудь сказать мне, как, пожалуйста?

Примечание:

Мне нужен только один бесплатный список IP.

25
задан 17 October 2013 в 02:08

6 ответов

Быстрый сканер - это arp-scan , который использует ARP для «просмотра» других машин в сети. Он также возвращает MAC-адрес и пытается определить производителя сетевого адаптера.

Пример использования (при необходимости замените wlan0 на eth0):

$ 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-сервер (для динамических адресов).

0
ответ дан 17 October 2013 в 02:08

Я полагаю, что это не лучшее решение, но это делает то, что Вы хотите. Этот сценарий выполнения ping 192.168.0.0/24 сеть и список возвратов неактивного дюйм/с, если нет в кэше ARP.

Преимущества перед предыдущими решениями:

  • использование оба метода: ping и проверка ARP
  • никакая потребность работать как root пользователь
  • выполнения приблизительно 1,5 минуты на моем Core i3 2100

Для сканирования сети выполняет его с <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

Обновление после downvote

Я записал это потому что 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.

3
ответ дан 17 October 2013 в 02:08

Я считаю, что fping полезен; среди прочего, он пингует диапазон адресов и список, которые «живы» и «недоступны». 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
0
ответ дан 17 October 2013 в 02:08

sudo nmap -sP -PR 192.168.0.* (или какова бы ни была ваша сеть) сделают свое дело.

Для его установки используйте sudo apt-get install nmap.

Источник: serverfault.com .

Только что проверил, работает как шарм, включая скрытые хосты, вам нужно добавить sudo, чтобы использовать опцию -PR.

0
ответ дан 17 October 2013 в 02:08

Это должно быть сделано правильно в 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
ответ дан 17 October 2013 в 02:08

я думаю, что это проще

# 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
0
ответ дан 17 October 2013 в 02:08

Другие вопросы по тегам:

Похожие вопросы: