Jak znaleźć nieużywany adres IP w sieci?

25

Chcę tylko znaleźć nieużywany adres IP w sieci. Myślę, że jest to możliwe dzięki nmap. Czy ktoś może mi powiedzieć tak, proszę?

Uwaga:

Potrzebuję tylko darmowej listy adresów IP.

karthick87
źródło
Czy są jakieś dodatkowe wymagania?
Sergey
Żadnych dodatkowych wymagań. Na razie znalazłem wiele konfliktów adresów IP, chcę tylko znaleźć bezpłatny adres IP w sieci i przypisać go.
karthick87

Odpowiedzi:

26

Szybki skaner to skan arp, który wykorzystuje ARP do „zobaczenia” innych maszyn w sieci. Zwraca również adres MAC i próbuje ustalić producenta karty sieciowej.

Przykładowe użycie ( wlan0w eth0razie potrzeby zamień na ):

$ 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

Pamiętaj, że to narzędzie zgłasza tylko maszyny, które są włączone. pingmożna zablokować, ale arp-scannie można go zablokować, ponieważ komputer musi współdziałać z innymi komputerami w sieci. Aby upewnić się, że adres IP nie jest używany, lepiej spojrzeć na router (adresy statyczne / dynamiczne) i serwer DHCP (adresy dynamiczne).

Lekensteyn
źródło
Chciałem to polubić, ale podczas testowania przegapiłem kilku gospodarzy?!? :(
gderliwy głupiec
@bumblingfool: czy jesteś pewien, że inne hosty są w tej samej podsieci? Np. 192.168.1.x, a nie 192.168.2.x?
Lekensteyn,
Tak, wszystkie hosty znajdują się w tej samej podsieci. Uruchomiłem go jeszcze kilkanaście razy i 2/3 czasu, kiedy pojawili się wszyscy gospodarze. Co ciekawe (?), Zawsze pojawiają się te same hosty, które się nie wyświetlają (jeśli występują) ... To jest w sieci Wi-Fi, ale sygnał jest stały. Ponadto wyżej wspomniana metoda nmap konsekwentnie nie brakuje żadnych hostów.
gderliwy głupiec
O ilu gospodarzach mówimy? Spróbuj zwiększyć opóźnienie między wysyłaniem pakietów za pomocą -iparametru, np. O -i 55 ms.
Lekensteyn,
2/5 Zwiększenie opóźnienia załatwiło sprawę. Dzięki!
gderliwy głupiec
15

sudo nmap -sP -PR 192.168.0.* (lub cokolwiek w twojej sieci) załatwi sprawę.

Aby go zainstalować, użyj sudo apt-get install nmap.

Źródło: serverfault.com .

Właśnie przetestowałem to, działa jak urok, w tym ukryte hosty, musisz dodać sudo, aby móc skorzystać z tej -PRopcji.

Bruno Pereira
źródło
1
Właśnie go przetestowałem i musisz go uruchomić jako root (tj. Używając sudo). Co więcej, prawdopodobnie jest blokowany przez zaporę ogniową, ponieważ skanuje również porty hosta, co również spowalnia wyszukiwanie.
Lekensteyn,
Przeczytaj oryginalny post plz, trzeci komentarz wyjaśnia, jak nie używać (niepotrzebnego) skanowania portów;)
Bruno Pereira
Powinieneś uwzględnić to w swojej odpowiedzi, nie wszyscy chcą śledzić źródła. Przydałoby się również opisanie, co faktycznie robi polecenie.
Lekensteyn
zrobione;) działa naprawdę dobrze.
Bruno Pereira
Nie testowałem (ani nigdy nie używałem) skanowania arp, dziękuję za sugestię!
Bruno Pereira
4

Uważam, że fping jest użyteczny; między innymi wysyła ping do zakresu adresów i list, które są „żywe” i które są „nieosiągalne”. fping nie jest domyślnie instalowany.

sudo apt-get install fping

Prostym podejściem jest po prostu uruchomienie go na szeregu adresów.

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

Trochę bardziej szczegółowo, aby stworzyć listę nieużywanych adresów 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
bgvaughan
źródło
1
Nie zapominaj, że zakłada to, że gospodarze odpowiadają na żądanie ICMP Echo (inaczej pingi). Nie każdy host tak robi, szczególnie niektóre komputery MS Windows nie. Również zapory zwykle to wyłączają, nawet jeśli są w trybie online i mają adres MAC w sieci. Jest to szybkie rozwiązanie, ale nie należy na nim polegać w każdej sytuacji.
eaydin
Masz rację; rozwiązanie obejmujące nmap lub jakąś alternatywę dla ping, która może wykorzystywać protokoły inne niż ICMP, byłoby bardziej niezawodne.
bgvaughan
3

Uważam, że nie jest to najlepsze rozwiązanie, ale robi to, co chcesz. Ten skrypt działa pingw 192.168.0.0/24sieci i zwraca listę nieaktywnych adresów IP, jeśli nie ma ich w pamięci podręcznej ARP.

Zalety w stosunku do poprzednich rozwiązań:

  • wykorzystuje obie metody: ping i sprawdzenie ARP
  • nie trzeba uruchamiać jako rootużytkownik
  • działa na moim Core i3-2100 około 1,5 minuty

Aby przeskanować sieć, uruchom ją z <first IP> <last IP>parametrami.

#!/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

Zaktualizuj po przegłosowaniu

Napisałem to, ponieważ nmap -PR 192.168.0.*nie działało dla mnie:

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

Aktualizacja 2

Naprawiono wszystkie problemy z pamięcią podręczną ARP.

Siergiej
źródło
2
Co jeśli maszyna nie reaguje na ping? Czy to znaczy, że adres IP nie jest używany?
Bruno Pereira,
@ brunopereira81 Nie wiem, jak odróżnić wolne IP od wyłączonego hosta.
Siergiej
Bez zasilania zaporę komputera można skonfigurować tak, aby nie reagowała na normalne pingi. W ten sposób nie otrzymujesz odpowiedzi, ale to nie znaczy, że komputer jest wyłączony lub nie ma uruchomionych usług, po prostu ignoruje normalne pingi. (Nie znam scenariusza związanego z pytaniem, ale) Wyobraź sobie, że pinguje zaporę ogniową / bramę, która ignoruje jego ping, ponieważ jest skonfigurowana tak, aby nie odpowiadać, zakłada, że ​​adres IP jest wolny, więc używa go, za tą zaporą ogniową / bramą może być X liczba komputerów, które właśnie spadły z powodu konfliktu IP!
Bruno Pereira
@ brunopereira81 Wiem, że to nie jest idealne. Dlatego nazywam to „szybkim i brudnym” :)
Sergey
Dobra odpowiedź, nie rozumiem, w jaki sposób głosowanie takie odpowiedzi jest pomocne.
nikhil
1

To powinno zrobić to dobrze w 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
Videonauth
źródło
0

myślę, że to jest prostsze

# 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
użytkownik3607303
źródło
Możesz rzucić okiem na swój kod. W mojej podsieci pokazuje mi wszystkie adresy IP, nawet te, które są zajęte.
Videonauth
nie, testuję to i działa dobrze dla mnie, w rzeczywistości nie możesz ustawić tych adresów IP, które są żywe, ponieważ dodam grep "is unreachable" lub jeśli mieszkasz, zmień go na grep -v timebyć może dla ciebie dobrze
user3607303