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

28

У меня есть доступ к двум компьютерам (A и B) в сети. Оба получили статический IP-адрес с маской подсети 255.255.255.128 (я проверил, что DHCP-сервер не используется). Я хочу настроить несколько IP-адресов для одной машины и, следовательно, я хочу знать, какие все IP-адреса уже используются в подсети.

Из предыдущего вопроса я попробовал nmap -sP -PR 172.16.128.*команду, но я скептически отношусь к ее результату, поскольку одна и та же команда дает разные результаты на двух моих компьютерах (A и B). На А, результат показывает, список 8 адресов , которые (предположительно) уже используется, в том числе из А и В .

Nmap done: 256 IP addresses (8 hosts up) scanned in 1.23 seconds

Но на B результат другой, т. Е.

Nmap done: 256 IP addresses (0 hosts up) scanned in 0.00 seconds

Результат на B даже не показывает его собственный IP-адрес, а также IP-адрес A!

Что именно я здесь делаю не так? Есть ли в Red Hat Linux (RHEL) надежный способ обнаружения всех IP-адресов, используемых в подсети, частью которой является мой компьютер?

RHEL: 6.5
Nmap version: 5.51
Вишал Шарма
источник
9
Кто управляет сетью? У вас есть разрешение назначать произвольные IP-адреса вашим хостам?
Роджер Липскомб
4
Да, у меня есть разрешение. Это хороший вопрос.
Вишал Шарма
11
Единственный способ получить правильный ответ - обратиться к администратору сети. Все, что вы делаете, рискует быть неточным, потому что устройства могут быть выключены, перезагружены, не отвечает и т. Д.
Джон Бентли,
7
Чтобы завершить комментарии Роджера и Джона, если IP-адреса в вашей сети назначаются вручную и без DHCP, где-то должен быть регистр (пусть это будет база данных, лист Excel или старый бумажный каталог), где записывается каждое распределение IP и люди Управление сетью должно иметь и использовать эту информацию. Ни одно техническое решение не гарантирует, что вы не захотите украсть IP-адрес другого компьютера (пусть это будет неработающий сервер или ноутбук с удаленным пользователем). Если этот регистр утерян или отсутствует, необходим полный перечень.
Закинстер
Вам следует указывать IP-адреса с подстановочными символами, чтобы ваша оболочка не пыталась расширить его как возможное имя файла. Например,nmap -sP -PR '172.16.128.*'
Ройма

Ответы:

39

Любое устройство с хорошим поведением в локальной сети Ethernet может игнорировать почти любой трафик, поэтому PING, сканирование портов и тому подобное ненадежны. Устройства, однако, не могут игнорировать запросы ARP . Учитывая, что вы указываете, что сканируете локальную сеть, я нахожу наименее хрупкий способ сделать то, что вы хотите, это попытаться подключиться к удаленному адресу, а затем заглянуть в мой кэш ARP.

Вот простое устройство без фильтрации (т. Е. Такое, которое не настроено на игнорирование некоторых классов IP-трафика):

[me@risby tmp]$ ping -c 1 -W 1 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=0.351 ms
[...]
[me@risby tmp]$ arp -a -n|grep -w 192.168.3.1
? (192.168.3.1) at b8:27:eb:05:f5:71 [ether] on p1p1

Вот фильтрующее устройство (одно из которых настроено на одну строку iptablesдля игнорирования всего трафика):

[me@risby tmp]$ ping -c 1 -W 1 192.168.3.31
[...]
1 packets transmitted, 0 received, 100% packet loss, time 0ms
[me@risby tmp]$ arp -a -n|grep -w 192.168.3.31
? (192.168.3.31) at b8:27:eb:02:e4:46 [ether] on p1p1

Вот устройство, которое только что вышло; обратите внимание на отсутствие MAC-адреса:

[me@risby tmp]$ ping -c 1 -W 1 192.168.3.241
[...]
1 packets transmitted, 0 received, 100% packet loss, time 0ms
[me@risby tmp]$ arp -a -n|grep -w 192.168.3.241
? (192.168.3.241) at <incomplete> on p1p1

Этот метод не является непогрешимым - он пропускает отключенные устройства, во-первых, - но это наименее ужасный метод, который я когда-либо пробовал.

Редактировать : Эрик Думинил, да, он работает только в локальной сети; см. абзац первый

Вишал, методы функционально идентичны. Обратите внимание на текст, приведенный в ответе Лео о nmap:

Когда привилегированный пользователь пытается сканировать цели в локальной сети Ethernet, используются запросы ARP, если --send-ipне указано иное.

Его метод предполагает меньше печатания. Мой может быть сделан без привилегий, и может дать вам лучшее понимание того, что на самом деле происходит. Но то же самое делается на проводе в обоих случаях.

MadHatter поддерживает Монику
источник
2
Это работает только с устройствами в той же локальной сети, верно? Я попробовал это на моем сервере, запросы ping сбрасываются где-то между ними, и я не могу найти какую-либо соответствующую строку arp.
Эрик Думинил
Спасибо за ответ. Я просто хотел узнать, как ваш метод сравнивается с методом @Leo? Это лучше чем-то (потому что иначе проще использовать только одну команду).
Вишал Шарма
2
@ VishalSharma, EricDuminil: см. Выше.
MadHatter поддерживает Монику
Просто чтобы прояснить, означает ли это, что метод @ Leo будет похож на ваш, только если он используется привилегированным пользователем, и, следовательно, когда он используется неимущим пользователем, его результат не будет полным / неверным? Кроме того, под привилегированным пользователем вы подразумеваете пользователя с доступом sudo?
Вишал Шарма
1
@VishalSharma первая часть вашего комментария верна. Привилегированный пользователь включает в себя выполнение чего-либо под sudo -u root(часто сокращается до sudo), а также просто вход в систему как root или выполнение /bin/su, отсюда и общий термин.
MadHatter поддерживает Монику
20

Поскольку устройство не может игнорировать запросы ARP, мне нравится использовать инструмент с именем arp-scan. Он доступен в большинстве репозиториев.

Когда вы запустите команду с --localnetкоммутатором, она даст вам обзор всей вашей внутренней сети.

sudo arp-scan --localnet

Дает мне список всех IP-адресов и MAC-адресов в моей сети. Также можно указать диапазон сети для сканирования.

sudo arp-scan 172.16.128.0/25

Если у вас настроено несколько сетевых интерфейсов, вы можете указать тот, который вы хотите использовать с коммутатором -I.

sudo arp-scan -I eth0 172.16.128.0/25

Более подробную информацию о возможных переключателях можно найти по адресу https://linux.die.net/man/1/arp-scan или запустив man arp-scan.

Thorchy
источник
Выглядит как многообещающий инструмент, но он не поставляется с RHEL 6.5 (в моем случае, по крайней мере, он отсутствует).
Вишал Шарма
@VishalSharma Это неудачно. Он доступен для CentOS, поэтому я бы подумал, что он также должен быть доступен на RHEL.
Торчи
4
Он находится в EPEL, дополнительных пакетах Fedora для корпоративного Linux.
mattdm
Не работает, если работает LaBrea.
Джошудсон
@joshudson Я почти уверен, что ни один инструмент / программа не может сканировать сеть на наличие неиспользуемых IP-адресов, когда работает LaBrea.
Торчи
11

Я не знаю, какую версию nmap вы используете в Red Hat 6.5, но для последних выпусков правильный (и более быстрый) способ, которым я думаю, будет:

nmap -sn -n 172.16.128.0/25

Это перечислит все хосты в вашей сети (так что вы можете использовать любой другой IP из этой подсети, так как он должен быть доступен).

Отредактируйте и отметьте: упомянутая вами подсеть - 255.255.255.128, но затем вы выводите результаты сканирования как 254 хоста. Если я не пропустил что-то, это должна быть маска / 25 и 126 доступных хостов. Если вы хотите просканировать / 24, измените указанную выше команду для запроса всех 254 хостов.

Из книги nmap -sPпрекращено и заменено -sn:

-sn (без сканирования портов)

Эта опция указывает Nmap не выполнять сканирование портов после обнаружения хоста и распечатывать только доступные хосты, которые ответили на зонды обнаружения хоста. Это часто называют «сканированием ping», но вы также можете запросить запуск сценариев traceroute и хоста NSE. По умолчанию это на один шаг более навязчиво, чем сканирование списка, и часто может использоваться для тех же целей. Это позволяет легкую разведку целевой сети без привлечения большого внимания. Знание того, сколько хостов задействовано, более ценно для злоумышленников, чем список, предоставленный сканированием списка каждого IP-адреса и имени хоста.

Системные администраторы также часто находят эту опцию полезной. Его можно легко использовать для подсчета доступных компьютеров в сети или мониторинга доступности сервера. Это часто называется проверкой ping и более надежно, чем ping широковещательного адреса, поскольку многие хосты не отвечают на широковещательные запросы.

Обнаружение хоста по умолчанию, выполняемое с -sn, состоит из эхо-запроса ICMP, TCP SYN к порту 443, ACK TCP к порту 80 и запроса метки времени ICMP по умолчанию. При выполнении непривилегированным пользователем только пакеты SYN отправляются (с помощью вызова подключения) на порты 80 и 443 на целевом устройстве. Когда привилегированный пользователь пытается сканировать цели в локальной сети Ethernet, запросы ARP используются, если не указан параметр --send-ip. Опцию -sn можно комбинировать с любыми типами зондов обнаружения (опции -P *, исключая -Pn) для большей гибкости. Если используются какие-либо из этих типов зондов и параметров номера порта, зонды по умолчанию переопределяются. Когда между исходным хостом, на котором выполняется Nmap, и целевой сетью установлены строгие брандмауэры, рекомендуется использовать эти передовые методы.

В предыдущих выпусках Nmap -sn был известен как -sP.

-nЧтобы избежать разрешения DNS - клиентов (делает сканирование быстрее):

-n (без разрешения DNS)

Сообщает Nmap никогда не выполнять обратное разрешение DNS для активных IP-адресов, которые он находит. Поскольку DNS может работать медленно даже со встроенным параллельным преобразователем заглушек Nmap, этот параметр может сократить время сканирования.

Вы можете использовать другие комбинации для углубления сканирования или служб, но этого должно быть достаточно для того, что вы ищете, если только хосты не маскируют себя или не отбрасывают все.

Источник: https://nmap.org/book/man-host-discovery.html

Лео
источник
Я упомянул вывод команды nmap -sP -PR 172.16.128. *, Поэтому он сканирует 254 хоста.
Вишал Шарма
В моем случае, сетевой идентификатор 172.16.128.128, поэтому мне пришлось изменить предложенную вами команду. Я использовал nmap -sn -n 172.16.128.128/25.
Вишал Шарма
Я не уверен, что вы имели в виду под идентификатором сети, но если ваше устройство имеет этот адрес, и вы хотите, чтобы все 254 хоста были просканированы в вашей подсети, вы должны запустить nmap -sn -n 172.16.128.1/24вместо этого (как я уже говорил в ответе выше, это будет сканировать 255.255. 255.0 маска)
Лев
Под сетевым идентификатором я имел в виду строку, полученную путем выполнения «логического И» IP-адреса и маски подсети.
Вишал Шарма
Понимаю. Итак, отвечает ли отправленная мною команда nmap на ваш вопрос? Используются ли на обоих устройствах одинаковые адреса?
Лев
8

Часть 1 - fping

Этот инструмент проверяет все в указанном диапазоне сети и показывает те, которые отвечают через ICMP.

root@thionite:~# fping -a -g 10.28.1.0/24
10.28.1.1
10.28.1.2
10.28.1.3
10.28.1.4
10.28.1.5
10.28.1.12.....

Часть 2 - арп

Поскольку fping говорил со всем в локальной сети, это привело к добавлению записи в таблицу ARP системы. Прочтите его в течение пары минут, потому что таблица arp сбрасывает старые записи.

root@thionite:~# arp -a | grep -v incomplete
? (10.28.1.1) at 00:0d:b9:35:29:c4 [ether] on eth0
? (10.28.1.2) at 68:05:ca:10:53:5f [ether] on eth0
? (10.28.1.3) at d2:f1:6e:54:05:22 [ether] on eth0
? (10.28.1.4) at 00:1a:4d:26:85:ee [ether] on eth0
? (10.28.1.5) at 6e:a6:e5:78:da:ca [ether] on eth0
? (10.28.1.12) at 3c:4a:92:76:85:d8 [ether] on eth0

Также обратите внимание, что таблица ARP имеет максимальный размер, и ядро ​​будет удалять старые записи и записи с низким уровнем использования.

Положите все это вместе с

 fping -a -g 10.28.1.0/24 && arp -a | grep -v incomplete > arp.txt

затем просмотрите arp.txt на досуге.

Criggie
источник
5

IPv6

Не думайте, что IPv4 - ваш единственный вариант. Многие современные операционные системы прекрасно справляются с IPv6, даже если ваш провайдер не обеспечивает подключение V6.

Могут даже быть устройства, которые доступны только по IPv6 или даже по другим протоколам.

Есть несколько удобных многоадресных адресов, задокументированных в https://en.wikipedia.org/wiki/Multicast_address#IPv6 Но интересным для вас является ff02 :: 1

root@thionite:~# ping6 -I eth0 ff02::1
PING ff02::1(ff02::1) from fe80::4261:86ff:fec4:cbaa%eth0 eth0: 56 data bytes
64 bytes from fe80::4261:86ff:fec4:cbaa%eth0: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from fe80::21a:4dff:fe26:85ee%eth0: icmp_seq=1 ttl=64 time=0.215 ms (DUP!)
64 bytes from fe80::6a05:caff:fe10:535f%eth0: icmp_seq=1 ttl=64 time=0.233 ms (DUP!)
64 bytes from fe80::226:55ff:feda:299c%eth0: icmp_seq=1 ttl=64 time=0.334 ms (DUP!)
64 bytes from fe80::20d:b9ff:fe35:29c4%eth0: icmp_seq=1 ttl=64 time=0.501 ms (DUP!)
64 bytes from fe80::21e:c2ff:fe13:36bf%eth0: icmp_seq=1 ttl=64 time=0.512 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:85d8%eth0: icmp_seq=1 ttl=1 time=0.518 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:8506%eth0: icmp_seq=1 ttl=1 time=0.757 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:e550%eth0: icmp_seq=1 ttl=1 time=0.772 ms (DUP!)
64 bytes from fe80::60cc:69ff:fe4f:7db0%eth0: icmp_seq=1 ttl=64 time=0.992 ms (DUP!)
64 bytes from fe80::90e4:77ff:fe32:3232%eth0: icmp_seq=1 ttl=64 time=1.00 ms (DUP!)
64 bytes from fe80::90e4:77ff:fe30:3030%eth0: icmp_seq=1 ttl=64 time=1.24 ms (DUP!)
64 bytes from fe80::90e4:77ff:fe31:3131%eth0: icmp_seq=1 ttl=64 time=1.34 ms (DUP!)
64 bytes from fe80::6ca6:e5ff:fe78:daca%eth0: icmp_seq=1 ttl=64 time=2.35 ms (DUP!)
64 bytes from fe80::b639:d6ff:feab:1000%eth0: icmp_seq=1 ttl=64 time=7.04 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:85d8%eth0: icmp_seq=1 ttl=1 time=8.02 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:8506%eth0: icmp_seq=1 ttl=1 time=8.03 ms (DUP!)
64 bytes from fe80::3e4a:92ff:fe76:e550%eth0: icmp_seq=1 ttl=1 time=8.06 ms (DUP!)
64 bytes from fe80::212:12ff:fef7:8044%eth0: icmp_seq=1 ttl=64 time=8.24 ms (DUP!)
64 bytes from fe80::8edc:d4ff:fef2:67e0%eth0: icmp_seq=1 ttl=64 time=18.3 ms (DUP!)
64 bytes from fe80::21e:c2ff:fea9:6d71%eth0: icmp_seq=1 ttl=64 time=295 ms (DUP!)
...repeats
Criggie
источник
3

Плохой ответ - пинговать широковещательный адрес

root@thionite:~# ping -b 10.28.255.255
WARNING: pinging broadcast address
PING 10.28.255.255 (10.28.255.255) 56(84) bytes of data.
64 bytes from 10.28.2.7: icmp_seq=1 ttl=64 time=0.220 ms
64 bytes from 10.28.3.12: icmp_seq=1 ttl=255 time=0.594 ms (DUP!)
64 bytes from 10.28.9.4: icmp_seq=1 ttl=64 time=1.03 ms (DUP!)
64 bytes from 10.28.1.151: icmp_seq=1 ttl=255 time=1.04 ms (DUP!)
64 bytes from 10.28.3.13: icmp_seq=1 ttl=255 time=2.22 ms (DUP!)
64 bytes from 10.28.3.11: icmp_seq=1 ttl=255 time=2.43 ms (DUP!)

В этой сети ~ 50 IP-адресов с / 16 сетевой маской и только семь ответили. Так что это не очень хорошее решение.

Criggie
источник
1
Почему другой ответ? Вы можете редактировать пост
маргаритка
3
@daisy, потому что они разные ответы. Один монолитный ответ может быть хорошим, но удерживается одной частью. Отдельные ответы позволяют правильному функционированию механизма голосования вверх / вниз. Этот ответ был действительно только для полноты, он не очень полезен на практике.
Кригги
1
Единственное, что проверяет пинг, - это настроено ли устройство на пинг.
Роб Мойр
@RobMoir true - суть в том, что широковещательный адрес существует и что он был разработан для IPv4.
Кригги
3

В дополнение к ответу MadHatter, есть инструмент, который выполняет поиск arp без попытки сначала отправить сетевой пакет: arping .

Кажется, есть две реализации:

Для вашей цели я бы просто взял пакет из вашего дистрибутива Linux, поскольку различия, вероятно, только в деталях.

алло
источник
1

Еще когда динозавры бродили по земле, прото- ботаники использовали arpwatch

arpwatch - это компьютерный программный инструмент для мониторинга трафика протокола разрешения адресов в компьютерной сети. [1] Он генерирует журнал наблюдаемого спаривания IP-адресов с MAC-адресами вместе с отметкой времени, когда спаривание появилось в сети. Также имеется возможность отправки электронного письма администратору при изменении или добавлении сопряжения.

man-страница arpwatch

RedGrittyBrick
источник
0

Войдите в свой коммутатор (-ы) и выполните show mac-address или аналогичные команды (в зависимости от марки и модели). Это даст вам все MAC-адреса активных устройств (кроме самого коммутатора). Если какой-либо из этих MAC-адресов не встречается среди MAC-адресов, найденных с помощью любого из ping или других методов в других ответах, вы можете дополнительно исследовать, что это за устройство. Возможно, это не имеет значения, потому что он даже не говорит по IP или принадлежит к другой VLAN, но, по крайней мере, вы можете получить представление о точности ваших других датчиков.

Хаген фон Айцен
источник