Wie finde ich unbenutzte IP-Adressen in einem Netzwerk?

25

Ich möchte nur die nicht verwendete IP-Adresse in einem Netzwerk herausfinden. Ich denke, dass es mit nmap möglich ist. Kann mir jemand den Weg pls sagen?

Hinweis:

Ich brauche nur die kostenlose IP-Liste.

karthick87
quelle
Gibt es zusätzliche Anforderungen?
Sergey
Keine zusätzlichen Anforderungen mehr. Da ich mittlerweile viele IP-Adressenkonflikte gefunden habe, möchte ich nur die freie IP-Adresse in einem Netzwerk herausfinden und zuweisen.
karthick87

Antworten:

26

Ein schneller Scanner ist arp-scan, der ARP verwendet , um andere Computer in einem Netzwerk zu "sehen". Es gibt auch die MAC-Adresse zurück und versucht, den Hersteller des Netzwerkadapters zu ermitteln.

Anwendungsbeispiel ( bei Bedarf wlan0durch ersetzen 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

Beachten Sie, dass dieses Dienstprogramm nur eingeschaltete Computer meldet. pingkann blockiert werden, arp-scankann aber nicht blockiert werden, da ein Computer mit anderen Computern in einem Netzwerk interagieren muss. Um sicherzustellen, dass eine IP nicht verwendet wird, sollten Sie Ihren Router (für statische / dynamische Adressen) und den DHCP-Server (für dynamische Adressen) überprüfen.

Lekensteyn
quelle
Ich wollte das mögen, aber es hat ein paar Hosts gefehlt, als ich es getestet habe?!? :(
bumbling fool
@bumblingfool: Sind Sie sicher, dass sich die anderen Hosts im selben Subnetz befinden? ZB 192.168.1.x und nicht 192.168.2.x?
Lekensteyn
Ja, alle Hosts befinden sich im selben Subnetz. Ich habe es noch ein Dutzend Mal ausgeführt und in 2/3 der Fälle sind alle Hosts aufgetaucht. Interessanterweise (?) Sind es immer die gleichen Hosts, die nicht angezeigt werden (falls vorhanden) ... Dies ist in einem WLAN-Netzwerk, aber das Signal ist solide. Auch die oben erwähnte nmap-Methode übersieht konsequent keine Hosts.
Bumbling Fool
Von wie vielen Gastgebern sprechen wir? Versuchen Sie, die Verzögerung zwischen dem Senden der Pakete mit dem -iParameter zu erhöhen , z -i 5. B. für 5 ms.
Lekensteyn
2/5. Die Verzögerung zu erhöhen hat den Trick getan. Vielen Dank!
Bumbling Fool
15

sudo nmap -sP -PR 192.168.0.* (oder was auch immer Ihr Netzwerk ist) wird den Trick tun.

Zum Installieren verwenden Sie sudo apt-get install nmap.

Quelle: serverfault.com .

Gerade getestet, funktioniert wie ein Zauber, einschließlich verdeckter Hosts. Sie müssen sudo hinzufügen, um die -PROption nutzen zu können .

Bruno Pereira
quelle
1
Ich habe es gerade getestet und Sie müssen es als root ausführen (dh verwenden sudo). Darüber hinaus wird es wahrscheinlich von der Firewall blockiert, da auch die Ports des Hosts durchsucht werden, wodurch auch die Suche verlangsamt wird.
Lekensteyn
Lesen Sie den ursprünglichen Beitrag PLZ, der 3. Kommentar erklärt, wie man den (unnötigen) Port-Scan nicht verwendet;)
Bruno Pereira
Sie sollten das in Ihre Antwort dann einschließen, nicht jeder möchte den Quellen folgen. Es wäre auch hilfreich zu beschreiben, was der Befehl tatsächlich tut.
Lekensteyn
erledigt;) funktioniert wirklich gut.
Bruno Pereira
Havent getestet (oder jemals verwendet) Arp-Scan, danke für die sugestion!
Bruno Pereira
4

Ich finde fping nützlich; Unter anderem wird ein Bereich von Adressen und Listen gepingt, die "lebendig" und "nicht erreichbar" sind. fping ist nicht standardmäßig installiert.

sudo apt-get install fping

Der einfache Ansatz besteht darin, es nur über einen Adressbereich auszuführen.

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

Etwas aufwändiger, um eine Liste nicht verwendeter IPs zu erstellen.

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
quelle
1
Vergessen Sie nicht, dass dies voraussetzt, dass die Hosts auf eine ICMP-Echo-Anfrage (auch bekannt als Pings) antworten. Das tut nicht jeder Host, besonders manche MS Windows-Rechner nicht. Auch Firewalls deaktivieren dies normalerweise, obwohl sie online sind und eine MAC-Adresse in Ihrem Netzwerk haben. Dies ist eine schnelle Lösung, auf die Sie sich jedoch nicht in jeder Situation verlassen sollten.
eaydin
Du hast recht; Eine Lösung mit nmap oder einer Alternative zu Ping, die andere Protokolle als ICMP verwenden kann, wäre zuverlässiger.
BGVAUGHAN
3

Ich glaube, es ist nicht die beste Lösung, aber es macht, was Sie wollen. Dieses Skript wird pingüber das 192.168.0.0/24Netzwerk ausgeführt und gibt eine Liste inaktiver IP-Adressen zurück, wenn sich keine im ARP-Cache befinden.

Vorteile gegenüber bisherigen Lösungen:

  • verwendet beide Methoden: Ping und ARP-Prüfung
  • Sie müssen nicht als rootBenutzer ausgeführt werden
  • läuft ca. 1,5min auf meinem Core i3-2100

Um Ihr Netzwerk zu scannen, führen Sie es mit <first IP> <last IP>Parametern aus.

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

Update nach Downvote

Ich habe es geschrieben, weil nmap -PR 192.168.0.*es bei mir nicht funktioniert hat:

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

Update 2

Alle Probleme mit dem ARP-Cache wurden behoben.

Sergey
quelle
2
Was ist, wenn eine Maschine nicht auf Ping reagiert? Bedeutet dies, dass die IP nicht verwendet wird?
Bruno Pereira
@ brunopereira81 Ich kenne keine Möglichkeit, freie IP-Adresse von ausgeschaltetem Host zu unterscheiden.
Sergey
Wird die Firewall eines Computers nicht ausgeschaltet, kann sie so konfiguriert werden, dass sie nicht auf normale Pings reagiert. Auf diese Weise erhalten Sie keine Antwort. Dies bedeutet jedoch nicht, dass der Computer ausgeschaltet ist oder keine Dienste ausgeführt werden. Es werden lediglich normale Pings ignoriert. (Ich kenne das Szenario in Bezug auf die Frage nicht, aber) Stellen Sie sich vor, er pingt eine Firewall / ein Gateway, die / das seinen Ping ignoriert, weil sie so konfiguriert ist, dass sie nicht antwortet. Er geht davon aus, dass die IP frei ist und er sie verwendet X Anzahl der Computer, die gerade aufgrund eines IP-Konflikts ausgefallen sind!
Bruno Pereira
@ brunopereira81 Ich weiß, es ist nicht ideal. Deshalb nenne ich es "schnell und schmutzig" :)
Sergey
Gute Antwort, ich verstehe nicht, wie es hilft, solche Antworten runter zu stimmen.
Nikhil
1

Dies sollte es richtig machen in 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
quelle
0

Ich denke, es ist einfacher

# 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
user3607303
quelle
Vielleicht möchten Sie sich Ihren Code ansehen. In meinem Subnetz zeigt es mir alle IPs, auch die, die genommen werden.
Videonauth
nein, ich teste es und es funktioniert gut für mich, in der Tat können Sie nicht einstellen, dass diese IP-Adressen lebendig sind, weil ich grep hinzufüge "is unreachable" oder wenn Sie leben, ändern Sie es, um grep -v timevielleicht gut für Sie zu arbeiten
user3607303