Como encontrar um endereço IP não utilizado em uma rede?

25

Eu só quero descobrir o endereço IP não utilizado em uma rede. Eu acho que é possível com o nmap. Alguém pode me dizer o caminho pls?

Nota:

Eu só preciso da lista de IPs grátis sozinha.

karthick87
fonte
Existem requisitos adicionais?
Sergey
Não há mais requisitos adicionais. A partir de agora eu encontrei muitos conflitos de endereço IP, só quero descobrir o endereço IP gratuito em uma rede e atribuí-lo.
karthick87

Respostas:

26

Um scanner rápido é o arp-scan, que usa o ARP para "ver" outras máquinas em uma rede. Ele também retorna o endereço MAC e tenta determinar o fabricante do adaptador de rede.

Exemplo de uso (substitua wlan0por eth0se necessário):

$ 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

Observe que este utilitário relata apenas máquinas que estão ligadas. pingpode ser bloqueado, mas arp-scannão pode ser bloqueado, pois é necessário que uma máquina interaja com outras máquinas em uma rede. Para garantir que um IP não seja usado, é melhor procurar no seu roteador (para endereços estáticos / dinâmicos) e no servidor DHCP (para endereços dinâmicos).

Lekensteyn
fonte
Eu queria gostar disso, mas ele perdeu alguns hosts quando o testei?!? :(
bumbling fool
@bumblingfool: você tem certeza de que os outros hosts estão na mesma sub-rede? Por exemplo, 192.168.1.xe não 192.168.2.x?
Lekensteyn
Sim, todos os hosts estão na mesma sub-rede. Eu o executei mais uma dúzia de vezes e 2/3 do tempo em que todos os hosts apareceram. Curiosamente (?), São sempre os mesmos hosts que não aparecem (se houver) ... Esta é uma rede wifi, mas o sinal é sólido. Além disso, o método nmap acima mencionado consistentemente não perde nenhum host.
bumbleing fool
De quantos hosts estamos falando? Tente aumentar o atraso entre o envio dos pacotes usando o -iparâmetro, por exemplo, por -i 55 ms.
Lekensteyn
2/5. Aumentar o atraso fez o truque. Obrigado!
bumbling fool
15

sudo nmap -sP -PR 192.168.0.* (ou qualquer que seja sua rede) fará o truque.

Para instalá-lo, use sudo apt-get install nmap.

Fonte: serverfault.com .

Apenas testei isso, funciona como um encanto, incluindo hosts ocultos, você precisa adicionar o sudo para poder usar a -PRopção

Bruno Pereira
fonte
1
Acabei de testar e você precisa executar é como root (ou seja, usando sudo). Além disso, provavelmente está bloqueado pelo firewall, pois também verifica as portas do host, o que também atrasa a pesquisa.
Lekensteyn
Leia o post original plz, o 3º comentário explica como não usar a varredura de portas (desnecessário);)
de Bruno Pereira
Você deve incluir isso em sua resposta, pois nem todo mundo deseja seguir as fontes. Também seria útil descrever o que o comando realmente faz.
Lekensteyn
done;) funciona muito bem.
Bruno Pereira
Ainda não testou (ou já usou) o arp-scan, thx pela sugestão!
Bruno Pereira
4

Acho o fping útil; entre outras coisas, ele fará ping em um intervalo de endereços e lista que estão "vivos" e "inacessíveis". O fping não está instalado por padrão.

sudo apt-get install fping

A abordagem simples é executá-la em vários endereços.

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

Um pouco mais elaboradamente, para produzir uma lista de IPs não utilizados.

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
fonte
1
Não esqueça que isso pressupõe que os hosts respondem a uma solicitação de eco ICMP (também conhecida como pings). Nem todo host faz isso, especialmente algumas máquinas MS Windows. Também os firewalls geralmente desabilitam isso, mesmo estando online e possuindo um endereço MAC na sua rede. Esta é uma solução rápida, mas não deve ser invocada em todas as situações.
ai pessoal
Você está certo; uma solução envolvendo o nmap, ou alguma alternativa ao ping que possa usar protocolos diferentes do ICMP, seria mais confiável.
bgvaughan
3

Acredito que não é a melhor solução, mas faz o que você deseja. Esse script é executado pingna 192.168.0.0/24rede e retorna a lista de IPs inativos se não houver no cache do ARP.

Vantagens em relação às soluções anteriores:

  • usa os dois métodos: ping e verificação de ARP
  • não há necessidade de executar como rootusuário
  • roda cerca de 1,5 min no meu Core i3-2100

Para verificar sua rede, execute-a com <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

Atualizar após o voto negativo

Eu escrevi porque nmap -PR 192.168.0.*não funcionou para mim:

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

Atualização 2

Corrigidos todos os problemas com o cache ARP.

Sergey
fonte
2
E se uma máquina não responder ao ping? Isso significa que o IP não está em uso?
Bruno Pereira
@ brunopereira81 Não sei como distinguir IP livre de host desligado.
Sergey
Sem desligar, o firewall de um computador pode ser configurado para não responder aos pings normais. Dessa forma, você não recebe resposta, mas isso não significa que o computador esteja desligado ou que não tenha serviços em execução, apenas ignorando os pings normais. (Eu não conheço o cenário relativo à pergunta, mas) Imagine que ele pinga um firewall / gateway que ignora seu ping porque está configurado para não responder, ele assume que o IP está livre, portanto ele o usa, por trás desse firewall / gateway pode ser X número de computadores que foram desativados devido a um conflito de IP!
Bruno Pereira
@ brunopereira81 Eu sei que não é o ideal. É por isso que eu chamo de "rápida e suja" :)
Sergey
Boa resposta, não entendo como a redução de votos dessa resposta ajuda.
Nikhil
1

Isso deve fazer certo no 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
fonte
0

eu acho que é mais simples

# 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
fonte
Você pode dar uma olhada no seu código. Na minha sub-rede, ele mostra todos os IPs, mesmo os que foram capturados.
Videonauth 24/16
Não, eu testá-lo e funciona bem para mim, na verdade, você não pode definir os endereços IP estão vivos becuase i adicionar grep "is unreachable" ou se você vive alterá-lo para grep -v timetalvez funcionam bem para você
user3607303