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


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

Обнаружение


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

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

    Отмечу, что информация о соседях совместно с результатами traceroute может служить основой для построения физической карты сети.
  • NetBIOS сканирование
    Протокол NetBIOS может быть использован для поиска Windows-машин, например при помощи утилиты nbtscan.
  • Журналы DHCP (предложено alexanster)
    В журналах DHCP-серверов есть информация о выдачи ip-адресов по MAC-адресам. Для недавних записей в журнале можно считать, что эти устройства обнаружены.

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


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

Получение типа устройства и используемой ОС при помощи 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 почти всегда поддерживаем маршрутизаторами и коммутаторами; имеется в Windows (соответствующая служба по умолчанию отключена); для Linux требуется установка демона snmpd. По всей видимости последняя третья версия достаточно сложна в реализации, поэтому предыдущая версия 2с до сих пор актуальна, хотя и не рекомендуема из-за отсутсвия шифрования при передаче данных. Протолок работает на 161 UDP-порту устройства.

    Для работы с SNMP можно использовать пакет утилит Net-SNMP. Чтобы получить, к примеру, описание устройства, надо указать версию протокола, пароль на чтение (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 — это расширенная и адаптированная под Windows реализация стандарта WBEM, позволяющая удаленно не только считывать параметры, но и управлять устройством. WMI работает поверх RPC (TCP порт 135) и DCOM (на произвольном TCP порту выше 1024), активно используется в скриптах Power Shell (ранее 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 и ее Linux-порт

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

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

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


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

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

В случае с SNMP такое правило может выглядеть примерно так: перебрать все дочерние элементы узла 1.3.6.1.2.1.2.2.1.8 (правило обнаружения) и для каждого найденного элемента (число, помещаемое в {#SNMPINDEX}) добавить новые метрики, задаваемые через прототипы элементов данных, 1.3.6.1.2.1.2.2.1.10.{#SNMPINDEX} и 1.3.6.1.2.1.2.2.1.16.{#SNMPINDEX}, если их еще нет. Подробнее здесь.

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

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

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

Заключение


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

Комментарии (9)


  1. corax
    08.03.2018 14:12

    ...TCP-порту

    ААААА!!! И тут порты!

    gramota.ru/slovari/dic/?word=порт&all=x


  1. valerylinkov
    08.03.2018 16:10

    Обложка статьи — зачёт!
    Порадовало, что есть разбор технологий Windows и Linux в одном месте. Позволило сравнить сложность настройки.


  1. mrlsd25
    08.03.2018 16:10

    А сбор сведений через IPMI и XML?


    1. little-brother Автор
      08.03.2018 16:12

      Что значит сбор по XML? IMPI упомянут.


  1. alexanster
    08.03.2018 16:10

    Если есть доступ, можно заглянуть в логи DHCP сервера на предмет выданных лиз.
    Или просто снифить сетку, что-нибудь типа ARPWatch.


    1. little-brother Автор
      08.03.2018 16:19

      Спасибо, надо будет добавить способ. Насколько я понимаю, то устройства со статичным ip в лог не попадут. Правильно?


      1. TaHKucT
        10.03.2018 01:33

        Нет, не правильно. Arpwatch отслеживает связи "соответствие IP адреса мак-адресу" и в логи пишется "все новые пары, все пропавшие пары и изменившиеся пары". Кто, как и кому назначает ip адреса arpwatch не знает, его интересует только пара "ip-mac" в пакете, дошедшем до него.


        Кстати раз пошла такая пьянка: arpwatch нужно или в условном центре сети ставить, или сливать на него копию трафика, если его поставить где то "в углу сети на сервере который ничего не делает" то его показатели будут мягко говоря "не самыми актуальными"


        ЗЫ: а статья эта, она о чем вообще? Прочитать — прочитал, а что и кому хотел сказать автор так и не понял


  1. rst16
    08.03.2018 16:10

    это контора написала или человек? сколько это лет все работает я даже боюсь представить.


    1. little-brother Автор
      08.03.2018 16:14

      Да какая там контора…