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.


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.


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 .


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

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.


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.