Як знайти невикористану 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.