Как найти неиспользуемый IP-адрес в сети?

Я просто хочу найти неиспользуемый IP-адрес в сети. Я думаю, что это возможно с nmap. Может ли кто-нибудь сказать мне способ PLS?

Примечание:

Мне просто нужен только бесплатный список IP.

1
задан 17 October 2013 в 03:08

5 ответов

sudo nmap -sP -PR 192.168.0.* (или независимо от вашей сети) выполнит трюк.

Чтобы установить его, используйте sudo apt-get install nmap.

Источник: serverfault.com.

Просто проверил это, работает как шарм, включая скрытые хосты, вам нужно добавить sudo, чтобы использовать параметр -PR.

13
ответ дан 25 May 2018 в 18:26
  • 1
    Я только что протестировал его, и вам нужно запустить его как root (т. Е. С помощью sudo). Кроме того, он, вероятно, заблокирован брандмауэром, поскольку он также сканирует порты хоста, который также замедляет поиск вниз. – Lekensteyn 6 October 2011 в 21:00
  • 2
    Прочтите исходное сообщение plz, в третьем комментарии объясняется, как не использовать (ненужное) сканирование портов;) – Bruno Pereira 6 October 2011 в 22:32
  • 3
    Вы должны включить это в свой ответ, тогда не все хотят следить за источниками. Также было бы полезно описать, что делает команда. – Lekensteyn 6 October 2011 в 22:35
  • 4
    done;) работает очень хорошо. – Bruno Pereira 6 October 2011 в 23:41
  • 5
    Не тестировали (или когда-либо использовали) arp-scan, THX для предложения! – Bruno Pereira 6 October 2011 в 23:47

Я нахожу fping полезным; среди прочего, он будет пинговать целый ряд адресов и списков, которые являются «живыми» и которые «недоступны». fpi не установлен по умолчанию.

sudo apt-get install fping

Простым подходом является просто запустить его по диапазону адресов.

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

Немного более тщательно, чтобы создать список неиспользуемых 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
4
ответ дан 25 May 2018 в 18:26
  • 1
    Не забывайте, что это предполагает, что хосты отвечают на запрос ICMP Echo (a.k.a. pings). Не каждый хост делает это, особенно некоторые машины MS Windows этого не делают. Также брандмауэры обычно отключают это, даже если они находятся в сети и имеют MAC-адрес в вашей сети. Это быстрое решение, но в каждой ситуации не следует полагаться. – nukacolacolic 22 July 2017 в 12:08
  • 2
    Ты прав; решение, включающее nmap, или альтернативу ping, которые могут использовать протоколы, отличные от ICMP, будет более надежным. – bgvaughan 24 July 2017 в 20:02

Я считаю, что это не лучшее решение, но оно делает то, что вы хотите. Этот скрипт запускает ping по сети 192.168.0.0/24 и возвращает список неактивных IP-адресов, если в ARP-кеше нет.

Преимущества предыдущих решений:

использует оба метода: ping и ARP не нужно запускать, поскольку пользователь root запускает около 1.5 минут на моем Core i3-2100

. Для сканирования вашей сети запустите его с параметрами <first IP> <last IP>.

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

Обновление после downvote

Я написал это, потому что nmap -PR 192.168.0.* не работал для меня:

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

Обновление после downvote

Исправлены все проблемы с ARP-кешем.

3
ответ дан 25 May 2018 в 18:26
  • 1
    Что делать, если машина не отвечает на ping? Означает ли это, что IP не используется? – Bruno Pereira 6 October 2011 в 17:30
  • 2
    @ brunopereira81 Я не знаю, как отличить бесплатный IP от отключенного хоста. – Sergey 6 October 2011 в 17:34
  • 3
    Брандмауэр компьютера не может быть отключен, он может быть настроен так, чтобы не отвечать на обычные пинги. Таким образом, вы не получаете ответа, но это не значит, что компьютер выключен или у него нет запущенных сервисов, а просто игнорируются обычные пинги. (Я не знаю сценарий по отношению к вопросу, но) Представьте, что он пингует брандмауэр / шлюз, который игнорирует свой пинг, поскольку он настроен не отвечать, он предполагает, что IP-адрес свободен, поэтому он использует его, за тем, что брандмауэр / шлюз может быть X количество компьютеров, которые просто снизились из-за конфликта IP! – Bruno Pereira 6 October 2011 в 17:40
  • 4
    @ brunopereira81 Я знаю, что это не идеально. Вот почему я называю это «быстрым и грязным». :) – Sergey 6 October 2011 в 17:45
  • 5
    Хороший ответ, я не понимаю, как помогает такой ответ. – nikhil 6 October 2011 в 20:16

Это должно сделать это правильно в 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
1
ответ дан 25 May 2018 в 18:26

Я думаю, что это проще

# 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
0
ответ дан 25 May 2018 в 18:26
  • 1
    Возможно, вам захочется взглянуть на ваш код. В моей подсети он показывает мне все IP-адреса, даже те, которые приняты. – Videonauth 24 May 2016 в 15:40
  • 2
    нет, я тестирую его и отлично работаю для меня, на самом деле вы не можете установить, что эти ip-адреса живы, потому что я добавляю grep "is unreachable" , или если вы живете, измените его на grep -v time, возможно, отлично сработаете для вас – user3607303 24 May 2016 в 16:49

Другие вопросы по тегам:

Похожие вопросы: