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

25

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

Заметка:

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

karthick87
источник
Есть ли дополнительные требования?
Сергей
Больше никаких дополнительных требований. На данный момент я обнаружил много конфликтов IP-адресов, я просто хочу узнать свободный IP-адрес в сети и назначить его.
karthick87

Ответы:

26

Быстрый сканер - это arp-scan, который использует ARP, чтобы «видеть» другие машины в сети. Он также возвращает MAC-адрес и пытается определить производителя сетевого адаптера.

Пример использования (заменить wlan0на , 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

Обратите внимание, что эта утилита сообщает только о машинах, которые включены. pingможет быть заблокирован, но arp-scanне может быть заблокирован, так как это необходимо для машины взаимодействовать с другими машинами в сети. Чтобы убедиться, что IP-адрес не используется, вам лучше взглянуть на свой маршрутизатор (для статических / динамических адресов) и DHCP-сервер (для динамических адресов).

Lekensteyn
источник
Я хотел это, но я пропустил пару хостов, когда я его тестировал?!? :(
неуклюжий дурак
@bumblingfool: вы уверены, что другие хосты находятся в той же подсети? Например, 192.168.1.x, а не 192.168.2.x?
Лекенштейн
Да, все хосты находятся в одной подсети. Я запускал его еще дюжину раз, и в 2/3 раза все хосты появлялись. Интересно (?), Это всегда одни и те же хосты, которые не отображаются (если есть) ... Это в сети Wi-Fi, но сигнал надежный. Кроме того, вышеупомянутый метод nmap постоянно не пропускает ни одного хоста.
неуклюжий дурак
Сколько хостов мы говорим? Попробуйте увеличить задержку между отправкой пакетов, используя -iпараметр, например, -i 5на 5 мс.
Лекенштейн
2/5. Увеличение задержки сделало свое дело. Благодарность!
неуклюжий дурак
15

sudo nmap -sP -PR 192.168.0.* (или независимо от того, что ваша сеть) сделает свое дело.

Для его установки используйте sudo apt-get install nmap.

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

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

Бруно Перейра
источник
1
Я только что проверил это, вам нужно запустить от имени пользователя root (то есть, используя sudo). Кроме того, он, вероятно, заблокирован брандмауэром, поскольку он также сканирует порты хоста, что также замедляет поиск.
Лекенштейн
Прочтите оригинальный пост, плз, 3-й комментарий объясняет, как не использовать (ненужное) сканирование портов;)
Бруно Перейра,
Вы должны включить это в свой ответ, тогда не все хотят следить за источниками. Также было бы полезно описать, что на самом деле делает команда.
Лекенштейн
сделано;) работает действительно хорошо.
Бруно Перейра
Не проверял (или никогда не использовал) arp-scan, спасибо за предложение!
Бруно Перейра
4

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

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
bgvaughan
источник
1
Не забывайте, что это предполагает, что хосты отвечают на эхо-запрос ICMP (он же ping). Не каждый хост делает это, особенно некоторые машины с MS Windows. Также брандмауэры обычно отключают это, даже если они подключены к сети и имеют MAC-адрес в вашей сети. Это быстрое решение, но на него нельзя полагаться в любой ситуации.
eaydin
Вы правы; решение, включающее nmap, или некоторую альтернативу ping, которая может использовать протоколы, отличные от ICMP, будет более надежным.
bgvaughan
3

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

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

  • использует оба метода: пинг и проверку 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

Обновление 2

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

Сергей
источник
2
Что делать, если машина не отвечает на пинг? Означает ли это, что IP не используется?
Бруно Перейра
@ brunopereira81 Я не знаю, как отличить бесплатный IP от выключенного хоста.
Сергей
Не отключенный, брандмауэр компьютера можно настроить так, чтобы он не реагировал на обычные эхо-запросы. Таким образом, вы не получите ответа, но это не значит, что компьютер выключен или на нем нет запущенных служб, он просто игнорирует обычные пинги. (Я не знаю сценарий относительно вопроса, но) Представьте, что он пингует брандмауэр / шлюз, который игнорирует его пинг, потому что он настроен не отвечать, он предполагает, что IP-адрес свободен, поэтому он использует его, за этим брандмауэр / шлюз может быть X количество компьютеров, которые только что вышли из строя из-за конфликта IP!
Бруно Перейра
@ brunopereira81 Я знаю, что это не идеально. Вот почему я называю это «быстрым и грязным» :)
Сергей
Хороший ответ, я не понимаю, как помогает такой ответ.
Нихил
1

Это должно сделать это правильно в 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
источник
0

я думаю это проще

# 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
источник
Возможно, вы захотите взглянуть на свой код. В моей подсети он показывает мне все IP, даже те, которые заняты.
Видеонавт
нет, я проверяю это и работает нормально для меня, на самом деле вы не можете установить, что эти IP-адреса живы, потому что я добавляю grep "is unreachable" или, если вы живете, измените его, чтобы он grep -v timeработал нормально для вас
user3607303