¿Cómo encontrar la dirección IP no utilizada en una red?

25

Solo quiero averiguar la dirección IP no utilizada en una red. Creo que es posible con nmap. ¿Alguien puede decirme la forma por favor?

Nota:

Solo necesito la lista de IP gratis solo.

karthick87
fuente
¿Hay algún requisito adicional?
Sergey
No más requisitos adicionales. A partir de ahora he encontrado muchos conflictos de direcciones IP, solo quiero encontrar la dirección IP libre en una red y asignarla.
karthick87

Respuestas:

26

Un escáner rápido es arp-scan que usa ARP para "ver" otras máquinas en una red. También devuelve la dirección MAC e intenta determinar el fabricante del adaptador de red.

Ejemplo de uso (reemplazar wlan0por eth0si es necesario):

$ 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

Tenga en cuenta que esta utilidad solo informa sobre máquinas que están encendidas. pingse puede bloquear, pero arp-scanno se puede bloquear, ya que es necesario que una máquina interactúe con otras máquinas en una red. Para asegurarse de que una IP no se use, es mejor que mire su enrutador (para direcciones estáticas / dinámicas) y el servidor DHCP (para direcciones dinámicas).

Lekensteyn
fuente
Quería que me gustara, pero me perdí un par de anfitriones cuando lo probé. :(
torpe tonto
@bumblingfool: ¿estás seguro de que los otros hosts están en la misma subred? Por ejemplo, 192.168.1.xy no 192.168.2.x?
Lekensteyn
Sí, todos los hosts están en la misma subred. Lo ejecuté una docena más de veces y 2/3 de las veces que aparecieron todos los hosts. Curiosamente (?), Siempre son los mismos hosts que no aparecen (si los hay) ... Esto está en una red wifi pero la señal es sólida. Además, el método nmap mencionado anteriormente no pierde ningún host.
tonto
¿De cuántos hosts estamos hablando? Intente aumentar el retraso entre el envío de paquetes utilizando el -iparámetro, por ejemplo, -i 5durante 5 ms.
Lekensteyn
2/5. Aumentar el retraso hizo el truco. ¡Gracias!
tonto
15

sudo nmap -sP -PR 192.168.0.* (o cualquiera que sea su red) hará el truco.

Para instalarlo use sudo apt-get install nmap.

Fuente: serverfault.com .

Acabo de probar esto, funciona de maravilla, incluidos los hosts oscurecidos, debe agregar sudo para poder usar la -PRopción.

Bruno Pereira
fuente
1
Acabo de probarlo y debes ejecutarlo como root (es decir, usar sudo). Además, probablemente esté bloqueado por el firewall, ya que también escanea los puertos del host, lo que también ralentiza la búsqueda.
Lekensteyn el
Lea la publicación original por favor, el tercer comentario explica cómo no usar el escaneo de puertos (innecesario);)
Bruno Pereira
Debe incluir eso en su respuesta, no todos quieren seguir las fuentes. También sería útil describir lo que realmente hace el comando.
Lekensteyn
hecho;) funciona muy bien.
Bruno Pereira
Ha probado (o alguna vez ha usado) arp-scan, gracias por la sugestión.
Bruno Pereira
4

Encuentro útil fping; entre otras cosas, hará ping a un rango de direcciones y enumerará cuáles están "vivas" y cuáles son "inalcanzables". fping no está instalado por defecto.

sudo apt-get install fping

El enfoque simple es simplemente ejecutarlo en un rango de direcciones.

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

Un poco más elaborado, para producir una lista de IP no utilizadas.

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
fuente
1
No olvide que esto supone que los hosts responden a una solicitud de eco ICMP (también conocida como pings). No todos los hosts hacen eso, especialmente algunas máquinas con MS Windows no. Además, los cortafuegos generalmente desactivan esto, aunque estén en línea y tengan una dirección MAC en su red. Esta es una solución rápida, pero no se debe confiar en cada situación.
eaydin
Tienes razón; Una solución que involucre nmap, o alguna alternativa al ping que pueda usar protocolos diferentes a ICMP, sería más confiable.
bgvaughan
3

Creo que no es la mejor solución, pero hace lo que quieres. Este script se ejecuta pingen la 192.168.0.0/24red y devuelve una lista de IP inactivas si no hay en la caché ARP.

Ventajas sobre soluciones anteriores:

  • utiliza ambos métodos: ping y verificación ARP
  • no hay necesidad de correr como root usuario
  • corre alrededor de 1.5 minutos en mi Core i3-2100

Para escanear su red, ejecútela con <first IP> <last IP>parámetros.

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

Actualización después del voto negativo

Lo escribí porque nmap -PR 192.168.0.*no funcionó para mí:

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

Actualización 2

Se corrigieron todos los problemas con ARP-cache.

Sergey
fuente
2
¿Qué pasa si una máquina no responde al ping? ¿Significa que la IP no está en uso?
Bruno Pereira
@ brunopereira81 No conozco ninguna forma de distinguir la IP libre del host apagado.
Sergey
No apagado, el firewall de una computadora se puede configurar para que no responda a los pings normales. De esa forma no obtendrá respuesta, pero eso no significa que la computadora esté apagada o que no tenga servicios en ejecución, solo ignora los pings normales. (No conozco el escenario relativo a la pregunta, pero) Imagine que hace ping a un firewall / gateway que ignora su ping porque está configurado para no responder, supone que la IP está libre, por lo que la usa, detrás de ese firewall / gateway puede estar ¡X número de computadoras que simplemente cayeron debido a un conflicto de IP!
Bruno Pereira
@ brunopereira81 Sé que no es lo ideal. Es por eso que lo llamo "rápido y sucio" :)
Sergey
Buena respuesta, no entiendo cómo el voto negativo de tal respuesta ayuda.
nikhil
1

Esto debería hacerlo bien en 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
fuente
0

creo que es más simple

# 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
fuente
Es posible que desee echar un vistazo a su código. En mi subred me muestra todas las direcciones IP, incluso las que se toman.
Videonauth
no, lo pruebo y funciona bien para mí, de hecho, no puede establecer que esas direcciones IP estén vivas porque agrego grep "is unreachable" o si vive, cámbielo para grep -v timeque funcione bien para usted
user3607303