Як знайти невикористану IP-адресу в мережі?


25

Я просто хочу знайти невикористану IP-адресу в мережі. Я думаю, що це можливо за допомогою nmap. Чи може хтось сказати мені, як pls?

Примітка:

Мені просто потрібен безкоштовний список IP-адрес.


Чи є додаткові вимоги?
Сергій

Більше додаткових вимог немає. На сьогоднішній день я знайшов багато конфліктів IP-адрес, я просто хочу знайти безкоштовну IP-адресу в мережі та призначити її.
karthick87

Відповіді:


26

Швидкий сканер - це арп-сканування, яке використовує 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-сервер (для динамічних адрес).


Мені хотілося сподобатися, але це пропустило пару господарів, коли я його тестував?!? :(
дурний дурень

@bumblingfool: ви впевнені, що інші хости знаходяться в тій самій підмережі? Наприклад, 192.168.1.x, а не 192.168.2.x?
Лекенштейн

Так, всі хости знаходяться в одній підмережі. Я пробігав це ще десяток разів і 2/3 третього часу всі господарі з’являлися. Цікаво (?), Що це завжди ті самі хости, які не відображаються (якщо такі є) ... Це у мережі Wi-Fi, але сигнал надійний. Крім того, вищезгаданий метод nmap послідовно не пропускає жодного хоста.
бідкаючий дурень

Про скільки господарів ми говоримо? Спробуйте збільшити затримку між відправленням пакетів за допомогою -iпараметра, наприклад, -i 5на 5 мс.
Лекенштейн

2/5. Збільшення затримки зробило свою справу. Спасибі!
бідканий дурень

15

sudo nmap -sP -PR 192.168.0.* (або будь-яка ваша мережа) зробить свою справу.

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

Джерело: serverfault.com .

Щойно перевірене це, працює як шарм із затьмареними хостами, вам потрібно додати sudo, щоб мати можливість використовувати цю -PRопцію.


1
Я щойно тестував це, що вам потрібно запустити, це як root (тобто використання sudo). Крім того, він, ймовірно, блокується брандмауером, оскільки він також сканує порти хосту, що також сповільнює пошук.
Лекенштейн

Прочитайте оригінальний пост plz, у 3-му коментарі пояснюється, як не використовувати (непотрібне) сканування портів;)
Бруно Перейра

Тоді ви повинні включити це у свою відповідь, не всі хочуть слідкувати за джерелами. Також було б корисно описати, що насправді робить команда.
Лекенштейн

зроблено;) працює дуже добре.
Бруно Перейра

Перевірено (або коли-небудь використовуване) арп-сканування, THX для сугезії!
Бруно Перейра

4

Я вважаю фпінг корисним; серед іншого, він буде набирати діапазон адрес та списків, які є "живими" та "недоступними". 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 (він же pings). Не кожен хост робить це, особливо деякі машини MS Windows цього не роблять. Також брандмауери зазвичай відключають це, навіть якщо вони в мережі та мають MAC-адресу у вашій мережі. Це швидке рішення, але на нього не слід покладатися в будь-якій ситуації.
eaydin

Ти правий; рішення, що включає nmap, або якусь альтернативу ping, яка може використовувати протоколи, крім ICMP, було б більш надійним.
bgvaughan

3

Я вважаю, що це не найкраще рішення, але воно робить те, що ви хочете. Цей сценарій працює pingчерез 192.168.0.0/24мережу і повертає список неактивних IP-адрес, якщо їх немає в кеш-пам'яті ARP.

Переваги перед попередніми рішеннями:

  • використовує обидва методи: 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 від ​​вимкненого хоста.
Сергій

Не вимкнений, брандмауер комп'ютера може бути налаштований так, щоб він не відповідав нормальним пінг-файлам. Таким чином ви не отримаєте відповіді, але це не означає, що комп'ютер вимкнений або у нього немає запущених служб, його просто ігнорувати звичайні пінг-файли. (Я не знаю сценарію відносно питання, але) Уявіть, що він пінг брандмауер / шлюз, який ігнорує його ping, оскільки його налаштований не відповідає, він припускає, що IP-адреса вільна, тому він використовує його, за цим брандмауером / шлюзом може бути X кількість комп'ютерів, які щойно знизилися через конфлікт із IP!
Бруно Перейра

@ brunopereira81 Я знаю, що це не ідеально. Тому я називаю це "швидким і брудним" :)
Сергій

Хороша відповідь, я не розумію, як допомагає спростування такої відповіді.
nikhil

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-адреси, навіть ті, які прийняті.
Videonauth

ні, я перевіряю це і працює добре для мене, адже ви не можете встановити ці IP-адреси, як живі, тому що я додаю grep, "is unreachable" або якщо ви живете, змініть це, grep -v timeможливо, спрацює нормально для вас
user3607303
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.