Вопрос или проблема
В моей работе много компьютеров, и я хочу пошутить. Я могу выключить компьютер через сеть, но нахождение IP-адресов для меня сложно.
Как я могу легко найти все онлайн IP-адреса от 192.168.1.aa до 192.168.1.zz?
Вообще, nmap
весьма полезен для быстрой проверки сетей.
Чтобы установить nmap, введите следующую команду в терминале:
sudo apt-get install nmap
После установки приложения введите следующую команду:
nmap -sn 192.168.1.0/24
Это покажет вам, какие узлы ответили на запросы ping в сети между 192.168.1.0 и 192.168.1.255.
Для старых версий Nmap используйте -sP
:
nmap -sP 192.168.1.0/24
Для дополнительной информации смотрите следующие страницы:
Это очень полезный инструмент для изучения.
Если все компьютеры в вашей сети используют Ubuntu или какое-либо другое дистрибутив, использующий avahi-daemon
(DNS-SD), вы можете получить детальный список их (с именем хоста и IP-адресом), используя:
avahi-browse -rt _workstation._tcp
Если вы хотите узнать все IP-адреса, используемые в вашей сети, вы можете использовать arp-scan
:
sudo arp-scan 192.168.1.0/24
Так как он не установлен по умолчанию, вам нужно будет установить его с помощью sudo apt-get install arp-scan
. arp-scan
отправляет ARP-пакеты в локальную сеть и отображает полученные ответы, поэтому он показывает даже защищённые узлы (которые блокируют трафик на основе IP-пакетов).
Примечание для читателя: Оригинальный ответ был дан давно, на момент, когда я только учился писать скрипты оболочки. Смотрите пересмотренную версию ниже для нового и улучшенного скрипта, который работает гораздо быстрее.
Оригинальный ответ
nmap
был бы моим выбором №1, но что, если его нет? Простейший способ — это скрипт ping, который поочерёдно проверяет каждый возможный IP-адрес в сети. У нас здесь просто цикл while, где мы задаём последний номер в адресе, делаем молчаливый одиночный ping на адрес, проверяем, удалось ли выполнение команды или нет (если удалось, то хост явно доступен), и используем команду printf
. Быстрый и грязный способ, занял у меня примерно 10 минут на написание, но время выполнения может быть несколько медленным.
#!/bin/sh
# set -x
NUM=1
while [ $NUM -lt 256 ];do
ping -q -c 1 192.168.0.$NUM > /dev/null
RESULT=$(echo $?)
if [ $RESULT -eq 0 ]; then
printf 192.168.0.$NUM"\n"
fi
NUM=$(expr $NUM + 1)
done
Пересмотренный ответ
Изначально я разместил этот ответ в августе 2015 года. С тех пор я узнал немного больше о написании скриптов, и как только я увидел этот скрипт, я подумал, что будет неплохо пересмотреть его, добавив несколько улучшений. Вот несколько идей:
-
Скрипт, очевидно, медленный, а
ping
ожидает ответа от хоста. По умолчанию,ping
ожидает два RTT, которые могут варьироваться в зависимости от загруженности вашей сети, и, насколько я понимаю, протокол TCP удваивает время ожидания каждый раз (по крайней мере, согласно этому). Поэтому мы могли бы заставитьping
завершаться через-w 1
. Так как у нас 256 адресов и, предположим, по 1 секунде на каждый адрес, скрипт займёт около 256/60 = 4.27 минут. -
Выполнение команды, а затем захват её статуса завершения с помощью
$?
было не совсем необходимо.if ... then;...fi
может использовать команды напрямую. Другими словами, достаточно сделать вот так:if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ; then <some other code here> fi
-
Команду
printf
можно переписать следующим образом:printf "IP %s is up\n" 192.168.0."$NUM"
Это больше стилистическое изменение, но оно соответствует тому, как
printf
работает и выглядит во многих других языках, с кавычками вокруг переменной"$NUM"
. Кавычки здесь не обязательны, так как мы имеем дело только с числами, нам не надо ожидать разбиения на слова из-за наличия пробелов в переменной. -
Гораздо более существенное улучшение производительности может быть достигнуто, если мы создадим несколько фоновых процессов. Редактированный ниже скрипт делает именно это. Я разместил
ping
иprintf
в функцииpingf
(да, банальное название, я знаю). Теперь есть одна функцияmain
, которая выполняет цикл и вызываетpingf
.
#!/bin/sh
# Uncomment for debugging
#set -x
pingf(){
if ping -w 2 -q -c 1 192.168.0."$1" > /dev/null ;
then
printf "IP %s is up\n" 192.168.0."$1"
fi
}
main(){
NUM=1
while [ $NUM -lt 255 ];do
pingf "$NUM" &
NUM=$(expr "$NUM" + 1)
done
wait
}
main
Насколько лучше это работает? Не плохо, на самом деле занимает считанные секунды.
$ time ./ping_script.sh
IP 192.168.0.1 is up
IP 192.168.0.101 is up
IP 192.168.0.27 is up
IP 192.168.0.29 is up
0m02.50s real 0m00.01s user 0m00.12s system
Вещи, которые следует учитывать
- Windows (начиная с Windows 7, я думаю) начали блокировать ответ на запросы ICMP. На Ask Ubuntu и других подобных сайтах есть множество вопросов типа “Эй, мой Linux-компьютер отвечает на ping, а Windows-нет, что происходит?”. Просто имейте в виду, что для новых версий Windows вам нужно включить ответ на запросы ICMP.
Netdiscover может быть вашим решением.
Чтобы установить через терминал:
sudo apt-get install netdiscover
Пример использования:
sudo netdiscover -r 192.168.1.0/24 -i wlan0
На вашем терминале отобразятся IP с MAC-адресами. Смотрите скриншот
надеюсь, это поможет вам
fping
отличная утилита для сканирования нескольких хостов в сети через ICMP. Если не установлена, вы можете установить её следующим образом:
sudo apt-get install fping
fping
отправляет ICMP ECHO_REQUEST пакеты и помечает хост как доступный, если получает ECHO_RESPONSE от хоста.
Например, чтобы просканировать хосты подсети 192.168.1.0/24
, вы можете сделать следующее:
fping -g 192.168.1.0/24
Для конкретного числа хостов, например, от 192.168.1.15
до 192.168.1.140
:
fping -g 192.168.1.15 192.168.1.140
fping
весьма настраиваемый, например, можно настроить, сколько пакетов будет отправлено, время ожидания ответа, формат вывода и т.д.
Изучите man fping
для получения большей информации.
Это работает для моих целей. Запустите на сервере/точке доступа:
#!/bin/bash
# создаёт два файла и сопоставляет их для получения
# текущих действительных IP-адресов в сети
echo
echo "Текущие подключенные IP-адреса:"
echo
# это выводит IP и MAC-адреса соседей
ip -r neigh > neighborhood.tmp
# замените wlan0 на любой интерфейс, который хотите изучить.
iw dev wlan0 station dump | grep Station > stations.tmp
# цикл для сопоставления двух файлов
while read station; do
mac=$(echo $station | awk '{print $2}')
while read neighbor; do
testmac=$(echo $neighbor | awk '{print $5}')
if [ $testmac == $mac ]; then
echo -e "\t$(echo $neighbor | awk '{print $1}')"
fi
done < neighborhood.tmp
done < stations.tmp
rm neighborhood.tmp; rm stations.tmp
echo
Ваши результаты могут отличаться.
Это работает для моих целей.
#!/bin/bash
#ip -r neigh
echo " ping -c1 ${1}.{1..254}"
scannet() { for IP in "${1}."{1..254}; do ping -c1 $IP | grep "64 bytes" & done; wait ;}
# ждём получения ответа или время - sleep 6; : ; sleep 1 "
#
scan () { Devices=$(scannet "${1}" 2>/dev/null); echo "$Devices"; echo "# Done" ;}
scan ${1}
Например: сохраните как ~/bin/scannet.sh # scannet.sh 192.168.1
.
Ответ или решение
Для того чтобы определить все используемые IP-адреса в вашей сети, существует несколько методов и инструментов, которые могут упростить эту задачу. Важно понимать, что сетевая диагностика и управление IP-адресами — это ключевые навыки в работе IT-профессионала. Рассмотрим несколько подходов, которые могут быть полезны.
Теоретическая часть
Каждое устройство в вашей локальной сети имеет уникальный IP-адрес. Эти адреса задаются либо статически, либо назначаются динамически через DHCP-сервер. Для системного администратора или IT-специалиста важно иметь список активных IP-адресов для мониторинга использования сети и, если необходимо, для проведения какой-либо сетевой диагностики или инвентаризации.
Для поиска IP-адресов можно использовать несколько утилит и методов:
- Nmap — популярный инструмент для сканирования сети, который поддерживает определение активных хостов через ICMP-пинг или TCP/UDP-пробы.
- Arp-scan — инструмент, работающий на основе ARP-пакетов, который может выявить большинство устройств в локальной сети, включая те, которые не отвечают на стандартные ICMP-запросы.
- Avahi — протокол для обнаружения служб в локальной сети на основе DNS-SD, полезный в средах, где используются устройства на базе Linux.
- Netdiscover и Fping — дополнительные инструменты, которые могут быть полезны в специфических сценариях для получения быстрого результата.
Пример использования
Использование Nmap:
Первый шаг — установить nmap
и использовать его для простого пинг-сканирования:
sudo apt-get install nmap
nmap -sn 192.168.1.0/24
Данный метод позволяет обнаружить все устройства, которые ответят на ICMP ECHO, пожалуй, наиболее универсальный и быстрый способ из всех перечисленных.
Использование Arp-scan:
Этот инструмент полезен для выявления даже тех устройств, которые не отвечают на ICMP-запросы:
sudo apt-get install arp-scan
sudo arp-scan 192.168.1.0/24
ARP-сканирование работает на уровне канального протокола, максимально приближаясь к "железу", что делает его крайне эффективным.
Использование Fping:
Для пакетной отправки ICMP-запросов:
sudo apt-get install fping
fping -g 192.168.1.0/24
Fping позволяет быстро сканировать большую сеть, определяя живые узлы.
Применение на практике
С практической точки зрения, сканирование сети необходимо не только для шуток или детских забав, как вы упоминали. Управление IP-адресами важно для обеспечения безопасности, оптимизации работы сети и предотвращения конфликтов адресов. Хорошее понимание используемых инструментов и методов позволяет IT-специалисту проводить диагностику сети быстро и эффективно, получая детальную информацию о каждом активном устройстве.
В каждом из рассмотренных методов есть свои преимущества и недостатки, и выбор решения зависит от конкретных условий и задач. Например, Nmap и Arp-scan будет полезен для общего инвентаря сети, в то время как Avahi и другие мультимедиа-протоколы полезны для специфических сред Ubuntu.
Важно учитывать, что сканирование сети может быть расценено как потенциальная угроза ИТ-безопасности. Поэтому рекомендуется использовать эти инструменты с осмотрительностью и только в рамках своей сетевой инфраструктуры или с разрешения владельцев сети.
В заключение, знание того, как использовать вышеперечисленные инструменты и методы, поможет вам не только в управлении активным оборудованием в вашей сети, но и в обеспечении её стабильной и безопасной работы. Это фундаментальные знания для каждого IT-профессионала, стремящегося обеспечивать высокий уровень обслуживания и производительности своих сетей.