- PVSM.RU - https://www.pvsm.ru -

Обнаружение сетевых устройств

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

Обнаружение сетевых устройств - 1

Disclaimer
Автор не имеет профильного образования, связанного с администрированием сетей, поэтому наверняка имеются неточности и упомянуто не всё, что можно.

Обнаружение

Для обнаружения устройства, т.е. определения есть ли на выбранном ip-адресе что-либо, можно применить следующие методы:

  • ping сканирование
    Как ни странно, это самый простой и распространенный способ.
  • Проверка открытых TCP-портов
    Если на устройстве отключен ответ на ping, то можно попробовать установить соединение по какому-либо TCP-порту. В виду того, что портов много и проверка каждого занимает значительное время, обычно проверяются только самые распространенные, напр. 80 или 443, используемые для веб-интерфейса устройства.
  • Проверка работы UDP служб
    UDP протокол не отправляет подтверждения о получении запроса и поэтому в общем виде сканирование UDP-портов невозможно. Однако можно попробовать опросить службы, прослушивающие UDP-порт и отправляющие ответ на запрос, напр. SNMP [1] (порт 161) или IPMI [2] (порт 623). В случае, если получен ответ, отличный от таймаута, то устройство обнаружено.
  • ARP сканирование
    Помимо обычных ICMP [3] запросов, которые используют утилиты ping, для устройств в том же широковещательном L2-домене можно воспользоваться более быстрым arping [4]: по диапазону ip-адресов рассылаются широковещательные ARP [5] пакеты вида «компьютер с IP-адресом XXX, сообщите свой MAC-адрес компьютеру с МАС-адресом запросившего», и если ответ получен, то устройство считается обнаруженным.
  • CDP/LLDP
    Если в сети используется протокол LLDP [6] (или аналог CDP), то устройства могут собирать сведения о своих соседях, которые можно считать обнаруженными. Эти данные доступны по SNMP.

    Отмечу, что информация о соседях совместно с результатами traceroute может служить основой для построения физической карты сети.

  • NetBIOS сканирование
    Протокол NetBIOS [7] может быть использован для поиска Windows-машин, например при помощи утилиты nbtscan.

Сбор сведений

После того, как устройство обнаружено, можно переходить к сбору сведений о нем.
Используя ARP протокол, по ip можно получить MAC-адрес, а по нему вероятного производителя (часть оборудования допускает смену адреса, так что метод не очень надежен). Далее можно воспользоваться утилитой nmap [8], которая сканируя открытые порты, сверяется со своей базой отпечатков и делает предположение [9] об используемой операционной системе, её версии и типе устройства.

Получение типа устройства и используемой ОС при помощи nmap

nmap -O -v 192.168.0.1

Starting Nmap 7.60 ( https://nmap.org ) at 2018-03-04 01:17 RTZ 2 (ceia)
Initiating ARP Ping Scan at 01:17
Scanning 192.168.0.1 [1 port]
Completed ARP Ping Scan at 01:17, 0.70s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 01:17
Completed Parallel DNS resolution of 1 host. at 01:17, 0.00s elapsed
Initiating SYN Stealth Scan at 01:17
Scanning 192.168.0.1 [1000 ports]
Discovered open port 80/tcp on 192.168.0.1
Discovered open port 49152/tcp on 192.168.0.1
Discovered open port 1900/tcp on 192.168.0.1
Completed SYN Stealth Scan at 01:17, 0.13s elapsed (1000 total ports)
Initiating OS detection (try #1) against 192.168.0.1
Retrying OS detection (try #2) against 192.168.0.1
WARNING: OS didn't match until try #2
Nmap scan report for 192.168.0.1
Host is up (0.00s latency).
Not shown: 997 closed ports
PORT      STATE SERVICE
80/tcp    open  http
1900/tcp  open  upnp
49152/tcp open  unknown
MAC Address: A0:F3:C1:35:21:58 (Tp-link Technologies)
Device type: WAP
Running: Linux 2.4.X
OS CPE: cpe:/o:linux:linux_kernel:2.4.36
OS details: DD-WRT v24-sp1 (Linux 2.4.36)
Network Distance: 1 hop

Чтобы получить более подробные сведения по устройству потребуется один из следующих способов:

  • SNMP
    Протокол SNMP [1] почти всегда поддерживаем маршрутизаторами и коммутаторами; имеется в Windows (соответствующая служба по умолчанию отключена); для Linux требуется установка демона snmpd. По всей видимости последняя третья версия достаточно сложна в реализации, поэтому предыдущая версия 2с до сих пор актуальна, хотя и не рекомендуема из-за отсутсвия шифрования при передаче данных. Протолок работает на 161 UDP-порту устройства.

    Для работы с SNMP можно использовать пакет утилит Net-SNMP [10]. Чтобы получить, к примеру, описание устройства, надо указать версию протокола, пароль на чтение (community read, по умолчанию public) и адрес, в нотации SNMP называемый OID (object identificator) и состоящий из чисел и точек. Все адреса устройства можно представить в виде дерева, где адреса отсортированы в лексикографическом порядке. Протокол позволяет запросить текущее значение по адресу, а также адреса следующие за текущим.

    Получение описания устройства при помощи snmpget

    snmpget -v 2c -c public 192.168.0.102 1.3.6.1.2.1.1.1.0
    
    SNMPv2-MIB::sysDescr.0 = STRING: Linux debian 3.16.0-4-586 #1 Debian 3.16.43-2+deb8u2 (2017-06-26) i686 

    Стандартный набор адресов весьма ограничен и содержит описание устройства, контакты, расположение и время работы (uptime). Остальные адреса зависят от производителя устройства и могут быть получены сканированием, например, утилитой snmpwalk. К счастью, Linux и Windows имеют типовые адреса для сетевых интерфейсов и загруженности процессоров/памяти, поэтому для них лишь знать (или уметь определить) используемую операционную систему.

    Получение описания дисков Linux при помощи snmpwalk

    snmpwalk -v 2c -c public 192.168.0.102 1.3.6.1.4.1.2021.9.1.2
    
    UCD-SNMP-MIB::dskPath.1 = STRING: /
    UCD-SNMP-MIB::dskPath.2 = STRING: /var
    UCD-SNMP-MIB::dskPath.3 = STRING: /
    UCD-SNMP-MIB::dskPath.4 = STRING: /run
    UCD-SNMP-MIB::dskPath.5 = STRING: /dev/shm
    UCD-SNMP-MIB::dskPath.6 = STRING: /run/lock
    UCD-SNMP-MIB::dskPath.7 = STRING: /sys/fs/cgroup
    Получение описания дисков Windows при помощи snmpwalk

    snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.25.2.3.1.3
    
    HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: C: Label:  Serial Number a65ceb77
    HOST-RESOURCES-MIB::hrStorageDescr.2 = STRING: D: Label:  Serial Number ded9f83e
    HOST-RESOURCES-MIB::hrStorageDescr.3 = STRING: E: Label:  Serial Number 8e764a1
    HOST-RESOURCES-MIB::hrStorageDescr.4 = STRING: I:
    HOST-RESOURCES-MIB::hrStorageDescr.5 = STRING: Virtual Memory
    HOST-RESOURCES-MIB::hrStorageDescr.6 = STRING: Physical Memory
  • WMI
    Технология WMI [11] — это расширенная и адаптированная под Windows реализация стандарта WBEM [12], позволяющая удаленно не только считывать параметры, но и управлять устройством. WMI работает поверх RPC [13] (TCP порт 135) и DCOM [14] (на произвольном TCP порту выше 1024), активно используется в скриптах Power Shell [15] (ранее Windows Script Host).

    Данные можно запрашивать, разумеется, только с Windows машин.

    Получение информации об оперативной памяти в PowerShell

    Get-WmiObject win32_OperatingSystem |%{"Total Physical Memory: {0}KB`nFree Physical Memory : {1}KB`nTotal Virtual Memory : {2}KB`nFree Virtual Memory  : {3}KB" -f $_.totalvisiblememorysize, $_.freephysicalmemory, $_.totalvirtualmemorysize, $_.freevirtualmemory}
    
    Total Physical Memory: 2882040KB
    Free Physical Memory : 612912KB
    Total Virtual Memory : 5762364KB
    Free Virtual Memory  : 1778140KB

    Также имеется консольная утилита wmic [16] и ее Linux-порт [17]

    Получение производителя устройства при помощи wmic

    wmic /USER:admin /PASSWORD:mypassword /NODE:"192.168.0.100" computersystem get Manufacturer
    
    Manufacturer
    Gigabyte Technology Co., Ltd.
  • Агент системы мониторинга, напр. Zabbix или Check_MK
    Если имеется возможность, то на устройстве устанавливается небольшая программа, работающая в фоне и собирающая данные. Преимущество использования агентов в том, что получение данных унифицировано вне зависимости от используемого устройством оборудования и операционной системы, а также возможно собирать данные доступные только локально (к примеру результат работы консольной программы).
  • SSH
    Исходно данные по SSH [18] можно получать с Linux и iOS устройств. Для Windows и Android потребуется установка SSH-сервера.

    Получение информации о CPU в SSH

    cat /proc/cpuinfo
    
    processor       : 0
    Processor       : AArch64 Processor rev 4 (aarch64)
    Hardware        : sun50iw1p1
    BogoMIPS        : 48.00
    Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
    CPU implementer : 0x41
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0xd03
    CPU revision    : 4
    
    processor       : 1
    ...

  • Запрос данных у управляющего сервиса, такого как гипервизор [19] виртуальных машин

Как это работает на примере Zabbix

Как известно Zabbix [20] может самостоятельно обнаруживать новые устройства в сети и автоматически опрашивать некоторые их параметры. Называется это — Low Level Discovery [21].

Обнаружение устройств задается правилами сетевого обнаружения [22], которые комбинируют перечисленные ранее методы обнаружения, определяют доступно ли устройство и какой шаблон к нему применить (обычно исследуется описание устройства). Шаблон содержит список свойств, которые можно получить с устройства, а также правила для обнаружения и создания новых, выполняемые по таймеру.

В случае с SNMP такое правило может выглядеть примерно так: перебрать все дочерние элементы узла здесь [23].

В случае агента правило будет выглядеть немного иначе: запросить у агента одно из discovery-свойств, к примеру system.cpu.discovery, получить список процессоров в виде json

[
	{"NUMBER": 0, "STATUS": "online"},
	{"NUMBER": 1, "STATUS": "online"}
] 

и для каждого элемента добавить system.cpu.load[{#CPU.NUMBER}], если такой метрики еще нет. Стоит отметить, что Zabbix-агент позволяет создавать свои элементы (UserParameter), которые могут быть запрошены, и поэтому легко можно реализовать, например, обнаружение файлов и отслеживание их размера в заданной папке. Подробнее здесь [24].

Заключение

Как видно всё достаточно просто и никакой магии нет. Если вы знаете еще какие-либо способы обнаружения устройств или получения их свойств, то просьба сообщить о них.

Автор: little-brother

Источник [25]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/zabbix/274744

Ссылки в тексте:

[1] SNMP: https://ru.wikipedia.org/wiki/SNMP

[2] IPMI: https://ru.wikipedia.org/wiki/Intelligent_Platform_Management_Interface

[3] ICMP: https://ru.wikipedia.org/wiki/ICMP

[4] arping: https://ru.wikipedia.org/wiki/Arping

[5] ARP: https://ru.wikipedia.org/wiki/ARP

[6] LLDP: https://ru.wikipedia.org/wiki/LLDP

[7] NetBIOS: https://ru.wikipedia.org/wiki/NetBIOS

[8] nmap: https://ru.wikipedia.org/wiki/Nmap

[9] делает предположение: https://nmap.org/man/ru/man-os-detection.html

[10] Net-SNMP: http://www.net-snmp.org/

[11] WMI: https://ru.wikipedia.org/wiki/WMI

[12] WBEM: https://en.wikipedia.org/wiki/Web-Based_Enterprise_Management

[13] RPC: https://ru.wikipedia.org/wiki/%D0%A3%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80

[14] DCOM: https://ru.wikipedia.org/wiki/DCOM

[15] Power Shell: https://ru.wikipedia.org/wiki/Windows_PowerShell

[16] wmic: https://blogs.technet.microsoft.com/askperf/2012/02/17/useful-wmic-queries/

[17] Linux-порт: https://www.krenger.ch/blog/wmi-commands-from-linux/

[18] SSH: https://ru.wikipedia.org/wiki/SSH

[19] гипервизор: https://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%BF%D0%B5%D1%80%D0%B2%D0%B8%D0%B7%D0%BE%D1%80

[20] Zabbix: https://ru.wikipedia.org/wiki/Zabbix

[21] Low Level Discovery: https://www.zabbix.com/documentation/4.0/ru/manual/discovery/low_level_discovery

[22] правилами сетевого обнаружения: https://www.zabbix.com/documentation/4.0/ru/manual/discovery/network_discovery/rule

[23] здесь: https://habrahabr.ru/company/zabbix/blog/193460/

[24] здесь: https://habrahabr.ru/post/194980/

[25] Источник: https://habrahabr.ru/post/350394/?utm_campaign=350394