Jump to content
iT4iT.CLUB
Kitsum

Switch Port Mapping, строим карту расположения хостов на портах свичей

Recommended Posts

Update 03.12.2015

  1. Добавлена возможность отображать DNS имена для определенных хостов, это позволит явно и человеко-понятно идентифицировать соответствующие узлы в сети. Отсутствие записи на DNS сервере должно привлечь соответствующее внимание к хосту.
    Скрытый текст

    sw6.thumb.jpg.be5279ee3b621aa294a6db47a4

     

  2. В конфигурацию добавлен параметр $domain позволяющий удалять из DNS имени хоста имя домена. Чтобы из name.domain.com сделать name, необходимо указать $domain = ".domain.com"
  3. Обновлена база производителей сетевого оборудования - oui.txt
  4. Мелки доработки интерфейса.

 

Update 26.11.2015

  1. Добавлена возможность отображать реальные имена портов (Fa1, Ethernet1/0/1, Port1 ...). Внимание: не все устройства способны передавать данную информацию, в связи с этим оставлены числовые идентификаторы, чтобы в таких случаях иметь систему идентификации.
    Скрытый текст

    sw5.thumb.jpg.dcddec4de97e754ccd995e572e

     

  2. Добавлена возможность описывать в конфигурации настройки для каждого устройства отдельно. Если не использовать эту возможность, то для оборудования будет применена общая конфигурация.
  3. Добавлена возможность описывать в конфигурации уникальные OID-ы для конкретного оборудования аналогично п.2.
  4. Мелкие доработки интерфейса и кода.

 

sw4.thumb.png.6a856c6e3d9af36c7fe8e2ee6b

В данной теме мы будем рассуждать о мониторинге сетевого оборудования и подключенных к нему хостах. Следовало бы разместить её в другом разделе, но 90% всех манипуляций и дальнейшая эксплуатация будет производиться на UNIX-подобной платформе. В моем случае используется:

  1. Linux Ubuntu 14.04
  2. Apache/2.4.7
  3. PHP 5.5.9
  4. Библиотека php5-snmp

Также само сетевое оборудование (маршрутизаторы и свичи) должно поддерживать работу по протоколу SNMP и соответствовать стандартам ISO.

Проект разработан отталкиваясь от топологии сети - звезда. Имеются множество отдельных подсетей 192.168.0.0 все они ходят во внешний мир через маршрутизаторы (в моем случае фирмы Cisco). В самих подсетях используются различные свичи, по большей части поддерживающие SNMP v1 и выше.

Ранее я уже поднимал данную тему на другом, дружественном, форуме, но потом работа над проектом бала остановлена. На данный момент вопрос опять стал актуален и решено переделать как основную программу, так и внешний вид. Старая версия была написана на скорую руку и выглядела невзрачно и с большими изъянами в коде.

Скрытый текст

sw1.png.223c16bb9db3c4b0b87ce510be74d07c

На данный момент проект преобразился и выглядит следующим образом. Ваш браузер должен поддерживать HTML5.

Скрытый текст

sw2.thumb.png.b5a20123c13502de0bab8994cc

Скрытый текст

sw3.thumb.png.88282e0fea5c631f3d66fece65

Скрытый текст

sw4.thumb.png.6a856c6e3d9af36c7fe8e2ee6b

Чтобы избежать вопроса "зачем это нужно?" предлагаю Вам задачку. Попробуйте назвать номер порта на свиче к которому подключен компьютер дяди Васи зная лишь его IP. Или еще интереснее - зная лишь производителя его сетевого оборудования. Или вопрос от начальника "Скажи мне, кто подключен к этому свичу, а я пока узнаю, кого нужно искать".

Раньше это делалось следующим образом. Подключаемся к маршрутизатору и спрашиваем, какой MAC принадлежит интересующему нас IP, пусть это будет 192.168.0.3

cisco-router#sh arp | include Vlan1
Internet  192.168.0.1       210   0800.0694.d027  ARPA   Vlan1
Internet  192.168.0.2       210   0800.bdf0.0010  ARPA   Vlan1
Internet  192.168.0.3       210   000e.be08.001c  ARPA   Vlan1
Internet  192.168.0.4       210   000e.42ee.20cf  ARPA   Vlan1
Internet  192.168.0.5       210   0800.218e.be09  ARPA   Vlan1
Internet  192.168.0.6         5   20cf.0800.000e  ARPA   Vlan1
Internet  192.168.0.7         -   001c.0010.000e  ARPA   Vlan1
Internet  192.168.0.8         6   0010.1fc4.0800  ARPA   Vlan1
Internet  192.168.0.9         2   d027.0694.0800  ARPA   Vlan1
...

Теперь мы знаем MAC, это 000e.be08.001c. Подключаемся к свичу и просим его показать нам таблицу MAC адресов с сортировкой по конкретному MAC-у.

cisco-switch#sh mac-address-table | include 000e.be08.001c
000e.be08.001c          Dynamic       1     FastEthernet21

Теперь мы знаем, что интересующий нас (или не нас) хост использует порт FastEthernet21

Все прошло относительно быстро и гладко. Но что делать, если порт имеет порядковый номер превышающий общее число физических портов на свиче, оборудование разных производителей и оно не поддерживает одинаковый формат MAC адресов, отсутствуют различные фильтры, как например "include" в оборудовании Cisco. При этом может быть несколько свичей с десятками хостов. Все это повлияет на время поиска и на конечный результат.

Реализация

Мы знаем, что и у какого оборудования спрашивать. Так и давайте спрашивать это используя SNMP протокол. Первым делом необходимо настроить Ваше сетевое оборудование, выставить необходимые разрешения и community. Описывать этот пункт нету смысла т.к у Вас своё оборудования, а у дяди Васи совсем другое.

На сервере, где установлен Apache необходимо доставить библиотеку реализующий работу snmpwalk в PHP

apt-get install php5-snmp
service apache2 restart

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

Редактируем .htaccess

RewriteEngine On
Options +FollowSymlinks
Options -MultiViews

RewriteBase /switch/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?$1 [L]

Убедитесь, что у Вас подключен модуль mod_rewrite и измените относительный путь указанный в RewriteBase на удобный Вам. Если закинуть каталог switch в корневую веб директории Apach, то вносить изменений в файл не нужно.

Редактируем index.php

$url = 'http://'.$_SERVER["HTTP_HOST"].'/switch/';

$domain = '.domain.com';

$community = 'public';
$unit = array(
    'network_id' => array(
        'name'   => 'Желаемое для отображения имя подсети или объекта где сеть эксплуатируется',
        'router' => '192.168.1.1',
        'switch' => array('192.168.1.2'),
    ),
    'object_name' => array(
        'name'   => 'Желаемое для отображения имя подсети или объекта где сеть эксплуатируется',
        'router' => '192.168.2.1',
        'switch' => array('192.168.2.2', '192.168.2.3', '192.168.2.4'),
    ),

    // UPDATE 26.11.2015
    'new_object' => array(
        'name'     => 'new object name',
        'router' => '192.168.3.1',
        'switch' => array('192.168.3.2', '192.168.3.3'),

        // Уникальные настройки для маршрутизатора 192.168.3.2
        '192.168.3.1' => array(
            'community' => 'public2',
        ),

        // Уникальные настрокий для свича 192.168.3.3
        '192.168.3.3' => array(
            'community' => 'public3',
            'ifName'    => '.1.3.6.1.2.1.31.1.1.1.1',
            'dot1dBasePortIfIndex' => '.1.3.6.1.2.1.17.1.4.1.2',
        ),
    ),
);

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

  1. $url - содержит http адрес до каталога со скриптом. Измените /switch/ на используемый Вами
  2. network_id, object_name - любой понравившийся идентификатор для подсети. Используйте латиницу и\или цифры и не используйте пробелы.
  3. name - описание для подсети. Оно будет отображаться в списке на главной странице скрипта и в навигационном баре
  4. router - IP адрес маршрутизатора, через который подсеть ходит во внешний мир
  5. switch - список IP адресов свичей используемых в подсети

Можно производить уникальную конфигурацию для любого сетевого устройства. Для этого в конфигурации нужного объекта необходимо указать адрес устройства и описать массив настроек для него. Можно изменять абсолютно любые существующие значения в скрипте. ВНИМАНИЕ: если Вы не понимаете, за что отвечает та или иная переменная и как устроена эта кухня, лучше обратитесь к нам, и мы Вам обязательно поможем!

Список рекомендуемых для изменения значений (описание значений имеется в самом скрипте):

  1. community
  2. atPhysAddress
  3. sysDescr
  4. dot1dTpFdbAddress
  5. dot1dTpFdbPort
  6. dot1dBasePortIfIndex
  7. ifName

Определение производителя по MAC адресу

Каждому производителю выделяется определенный список MAC адресов для использования в его сетевом оборудовании. Ознакомиться с этим списком можно по адресу http://standards-oui.ieee.org/oui.txt Мы включили этот файл в состав архива, но советуем Вам периодически обновлять его.

В скрипте используется shell_exec

$vendor = explode('(hex)', shell_exec("cat ./oui.txt | grep ".str_replace(' ', '-', substr($mac, 0, 8))));

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

Есть очень интересная статья на сайте CISCO. Она поможет Вам разобраться в принципах работы данного скрипта. К сожалению я узнал об этой статье уже после написания большей части кода программы. Но уже имеются идеи для следующей версии!

PS: Если все сделано правильно, то Вы сможете насладится нашим велосипедом. Проект будет дорабатываться и обрастать всяческими "свистульками". Приятного использования 😃

 

  • Like 1

Share this post


Link to post
Share on other sites

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

Пример 1

  1. Сеть является домашней
  2. Один маршрутизатор с IP адресом 192.168.0.1
  3. Один свич с IP адресом 192.168.0.2
  4. SNMP Community на обоих устройствах настроен одинаково - public
Скрытый текст

$domain = '';
$community = 'public';

$unit = array(
    'home_network' => array(
        'name'   => 'Домашняя сеть Васи Пупкина',
        'router' => '192.168.0.1',
        'switch' => array('192.168.0.2'),
    ),
);

 

Пример 2

  1. Сеть эксплуатируется в маленьком офисе
  2. Один маршрутизатор с IP адресом 192.168.0.1
  3. Два свича с IP адресами 192.168.0.2 и 192.168.0.3
  4. SNMP Community на обоих устройствах настроен одинаково - public
Скрытый текст

$domain = '';
$community = 'public';

$unit = array(
    'office' => array(
        'name'   => 'Сеть фирмы "Рога и Копыта"',
        'router' => '192.168.0.1',
        'switch' => array('192.168.0.2', '192.168.0.3'),
    ),
);

 

Пример 3

  1. Сеть эксплуатируется в небольшом магазине
  2. Один маршрутизатор с IP адресом 192.168.0.1
  3. Два свича с IP адресом 192.168.0.2 и 192.168.0.3
  4. SNMP Community на маршрутизаторе - private
  5. SNMP Community на свичах - public
Скрытый текст

$domain = '';
$community = 'public';

$unit = array(
    'small_shop' => array(
        'name'   => 'Магазин артефактов Бабы Нины',
        'router' => '192.168.0.1',
        'switch' => array('192.168.0.2', '192.168.0.3'),
    ),

    '192.168.0.1' => array(
        'community' => 'private'
    ),
);

 

Пример 4

  1. Сеть эксплуатируется в большом магазине
  2. Два маршрутизатора с IP адресами 192.168.1.1 и 192.168.2.1
  3. Один свич с IP адресом 192.168.1.2
  4. Два свича с IP адресами 192.168.2.2 и 192.168.2.3
  5. SNMP Community везде одинаков - public
  6. Поднят домен с именем youbigstore.com
Скрытый текст

$domain = '.youbigstore.com';
$community = 'public';

$unit = array(
    'router1' => array(
        'name'   => 'Помещение персонала к.101',
        'router' => '192.168.1.1',
        'switch' => array('192.168.1.2'),
    ),

    'router2' => array(
        'name'   => 'Торговый зал',
        'router' => '192.168.2.1',
        'switch' => array('192.168.2.2', '192.168.2.3'),
    ),
);

 

Пример 5

  1. Сеть эксплуатируется в офисном здании (3 этажа), каждый этаж находится в своей подсети. Сервер с установленным Switch Рort Mapping находится за пределами этих сетей, например в соседнем здании.
  2. 1 этаж. Маршрутизатор Cisco 800 с WAN IP адресом 10.10.1.1 и VLAN 192.168.10.0
  3. 1 этаж. Два свича 3Com с IP адресами 192.168.10.2 и 192.168.10.3
  4. 1 этаж. SNMP Community - public1
  5. 2 этаж. Маршрутизатор Cisco 800 c WAN IP адресом 10.10.2.1 и VLAN 192.168.20.0
  6. 2 этаж. Два свича 3Com с IP адресами 192.168.20.2 и 192.168.20.3
  7. 2 этаж. SNMP Community - public2
  8. 3 этаж. Маршрутизатор Cisco 800 c WAN IP адресом 10.10.3.1 и VLAN 192.168.30.0
  9. 3 этаж. Один свич Allied Telesis с IP адресом 192.168.30.2
  10. 3 этаж. SNMP Community - public3
  11. Поднят домен с именем domain.com
Скрытый текст

$domain = '.domain.com';
$community = '';

$unit = array(
    # Описываем оборудования 1 этажа
    'floor1' => array(
        'name'   => 'Первый этаж',
        'router' => '10.10.1.1',
        'switch' => array('192.168.10.2', '192.168.10.3'),
    ),
    # Уникальные настройки для оборудования 1 этажа
    '10.10.1.1'    => array('community' => 'public1'),
    '192.168.10.2' => array('community' => 'public1'),
    '192.168.10.3' => array('community' => 'public1'),
    
    # Описываем оборудования 2 этажа
    'floor2' => array(
        'name'   => 'Второй этаж',
        'router' => '10.10.2.1',
        'switch' => array('192.168.20.2', '192.168.20.3'),
    ),
    # Уникальные настройки для оборудования 2 этажа
    '10.10.2.1'    => array('community' => 'public2'),
    '192.168.20.2' => array('community' => 'public2'),
    '192.168.20.3' => array('community' => 'public2'),
    
    # Описываем оборудования 3 этажа
    'floor3' => array(
        'name'   => 'Третий этаж',
        'router' => '10.10.3.1',
        'switch' => array('192.168.30.2', '192.168.30.3'),
    ),
    # Уникальные настройки для оборудования 3 этажа
    '10.10.3.1'    => array('community' => 'public3'),
    '192.168.30.2' => array('community' => 'public3'),
    '192.168.30.3' => array('community' => 'public3'),
);

 

Пример 6

  1. Частная сеть с нестандартным оборудованием
  2. Один маршрутизатор Noname с IP адресом 192.168.0.1
  3. SNMP OID atPhysAddress маршрутизатора отвечающий за соответствие MAC - IP имеет вид ".1.3.6.1.2.1.3.1.1.2" (предположим, что это не стандартный OID)
  4. SNMP Community маршрутизатора - private
  5. Один свич Cisco с IP адресом 192.168.0.2
  6. SNMP Community свича - public
Скрытый текст

$domain = '';
$community = '';

$unit = array(
    'home1' => array(
        'name'   => 'Частная сеть',
        'router' => '192.168.0.1',
        'switch' => array('192.168.0.2'),
    ),
    # Настройки для маршрутизатора
    '192.168.0.1' => array(
        'community'     => 'private',
        'atPhysAddress' => '.1.3.6.1.2.1.3.1.1.2',
    ),
    # Настройки для свича
    '192.168.0.2' => array(
        'community'     => 'public',
    ),
);

 

PS: Если имеются вопросы, не стесняйтесь обращаться, постараемся помочь!

  • Like 1

Share this post


Link to post
Share on other sites

Во, было бы не плохо включить  использования функции DHCP snooping, если таковая используется на коммутаторах. Тогда информация будет быстрее выдаваться, однозначно. В следующую версию впихни ;)

  • Like 1

Share this post


Link to post
Share on other sites

Спасибо.
Реализация для CentOS чем нибудь отмечается? что нужно подправить?
В чем разница между network_id, object_name ,

Edited by Den MoRDa

Share this post


Link to post
Share on other sites
07.02.2019 в 13:24, Den MoRDa сказал:

Спасибо.
Реализация для CentOS чем нибудь отмечается? что нужно подправить?
В чем разница между network_id, object_name ,

Ды чем она может отличаться. ЭтАж php... Не?

Share this post


Link to post
Share on other sites
07.02.2019 в 13:24, Den MoRDa сказал:

Реализация для CentOS чем нибудь отмечается? что нужно подправить?

Ничем не отличается.

07.02.2019 в 13:24, Den MoRDa сказал:

В чем разница между network_id, object_name

Разницы нет, это просто уникальные идентификаторы для подсетей.

  • Like 1

Share this post


Link to post
Share on other sites

Нид хелп.
Ситуация такая: циски и компы были раньше в одной сети, например  192,168,1,0/24 и в одном влан. - все работало очень хорошо.
Сейчас  компьютеры и управляющие интерфейсы цисок в разных подсетях и влан: например: циски 192.168.0.0/24 влан 100 компьютеры 192.168.1.0/24 влан 101
Свичпорт сейчас показывает только таблицу соседних цисок (вложенная картинка) Можно ли , что бы показывал все устройства ну или хотя бы только компы.? 

image.thumb.png.c62c9080fe00f8fb89f51b54e61a9027.png

Share this post


Link to post
Share on other sites
5 часов назад, Den MoRDa сказал:

Нид хелп.
Ситуация такая: циски и компы были раньше в одной сети, например  192,168,1,0/24 и в одном влан. - все работало очень хорошо.
Сейчас  компьютеры и управляющие интерфейсы цисок в разных подсетях и влан: например: циски 192.168.0.0/24 влан 100 компьютеры 192.168.1.0/24 влан 101
Свичпорт сейчас показывает только таблицу соседних цисок (вложенная картинка) Можно ли , что бы показывал все устройства ну или хотя бы только компы.? 

image.thumb.png.c62c9080fe00f8fb89f51b54e61a9027.png

Просмотрел snmpwalk 1.3.6.1.2.1.17.4.3.1.1
Оказывается он выводит mac Таблицу только Vlan1.... и как заставить выводить другие влан не понятно :(.
Оборудование обычные циско каталист 3560....

Нагуглил.. На цисках Vlan указывается community@Vlan#
Т.е. строка выглядит так
snmpwalk -v 2c -c public@101 192.168.x.x 1.3.6.1.2.1.17.4.3.1.1

Только не знаю, как сюда это приладить.. если изменить название community - не работает.. 
ХЕЛП... Спасибо заранее.
 

Edited by Den MoRDa

Share this post


Link to post
Share on other sites
08.12.2020 в 16:09, Den MoRDa сказал:

Просмотрел snmpwalk 1.3.6.1.2.1.17.4.3.1.1
Оказывается он выводит mac Таблицу только Vlan1.... и как заставить выводить другие влан не понятно :(.
Оборудование обычные циско каталист 3560....

Нагуглил.. На цисках Vlan указывается community@Vlan#
Т.е. строка выглядит так
snmpwalk -v 2c -c public@101 192.168.x.x 1.3.6.1.2.1.17.4.3.1.1

Только не знаю, как сюда это приладить.. если изменить название community - не работает.. 
ХЕЛП... Спасибо заранее.
 

 

Самое близкое, что нашел
https://github.com/jantman/SwitchSNMP/blob/master/com_jasonantman_SwitchSNMP_IOS.php
public function getPortMACs($vlans) - то что нужно 

но соединить не могу  :(

Share this post


Link to post
Share on other sites

А как будут работать третий и шестые конфигурации

small_shop и 192.168.0.1 на одном уровне вложенности.
И на страничке у нас получиться как будто два свича small_shop и 192.168.0.1. А параметр для 0.1 так и не передастся.

 

Тоже самое и в шестом примере:
На домашней странице у нас будут три меню:

Home1

192.168.0.1

192.168.0.2

Вместо передачи особых параметров для 0,1 и 0,2

Edited by Den MoRDa

Share this post


Link to post
Share on other sites

Столкнулся с проблемой. Вывод некоторых роутеров таблицы соответствия ip/mac происходит как на картинке

 

Screenshot_3.jpg.7ba29dc9e8d3e0791c4e4150327e5503.jpg

А скрипт заточен под:

Screenshot_1.jpg.213f73bce42e97a1ae9f63c288c27fcd.jpg

Share this post


Link to post
Share on other sites

Хм... интересное наблюдение: snmpwalk на разных ОС выдает разные выводы (см. выше)
Т.е. на сентОС для некоторых рутеров снмп вывод может быть с ":" для других рутеров без ":"  (На убунте же та же железка по тому же oid выдает HEX-string без ":")
Не понятно какой вывод смнп будет выводить модуль питона. Зависиот от ОС или нет. О.о.

 

Как выяснилось, используют разные MIB.

 

 

Что нашел: если из под centos Делать snmpwalk достаточно добавить -m SNMPv2-SMI (указать какой mib использовать при опросе) то вывод получается, который нам нужен , через Hex-STRING. Как добавить в скрипт пока не знаю :(

 

Edited by Den MoRDa

Share this post


Link to post
Share on other sites

Еще одно наблюдение:
Глобальные параметр,  комьюнити, удалось переопределить локально для свича, 
а такой параметр как atPhysAddress не удалось  локально переопределить. (Если глобально изменить OID, то все хорошо, если пытаться локально переопределить, то выдает ошибку 'Нет данных о ARP таблице маршрутизатора' )

 

 

Также добавлю, что с помощью snmp_read_mib (/.../SNMPv2-SMI.txt) не удалось заставить использовать данный миб :(

 

Вообще не понимаю, если закомментировать глобальную $atPhysAddress все равно скрипт работает. А вот если переопределить локально этот же параметр (при чем даже если поставить, такой же как глобальный) то не работает :(

Edited by Den MoRDa

Share this post


Link to post
Share on other sites

Удалил из системы IP-MIB, чтобы обращался всегда к SNMPv2-SMI.
Полученный вывод - то что нам нужно в HEX-string. Но заходя на наш "сайт"  все IP - unknown.
Я сделал скрипт что бы смотреть вывод прям в centos (причем проверял вывод на каждой этапе):
 

<?php

$atPhysAddress        = '.1.3.6.1.2.1.4.35.1.4';  
//$atPhysAddress        = '.1.3.6.1.2.1.3.1.1.2';      
snmp_read_mib('/usr/share/snmp/mibs/SNMPv2-SMI.txt');
$session = new SNMP(SNMP::VERSION_2C, 'ВАШ IP', 'public' ); 
$session->valueretrieval = SNMP_VALUE_LIBRARY;
$session->oid_output_format = SNMP_OID_OUTPUT_NUMERIC;
$session->oid_increasing_check = false; 
if(($atPhysAddress = $session->walk($atPhysAddress)) != false) {
                        foreach($atPhysAddress as $id => $val) $arp[trim(str_replace('Hex-STRING: ', '', $val))] = implode('.', array_slice(explode('.', $id), -4));
                        $session->close();
                        unset($session);


print_r( $arp );
$mac = '9C 93 4E 14 10 5B'; //mac для проверки вывода
$ip  = $arp[$mac];
print_r( $ip );
//$session->close();
}



$sysDescr             = '.1.3.6.1.2.1.1.1';            # описание                           [system]
$dot1dTpFdbAddress    = '.1.3.6.1.2.1.17.4.3.1.1';     # список MAC адресов                 [FDB]
$dot1dTpFdbPort       = '.1.3.6.1.2.1.17.4.3.1.2';     # список расположения MAC по портам  [FDB]
$dot1dBasePortIfIndex = '.1.3.6.1.2.1.17.1.4.1.2';     # идентификатор порта                [Base]
$ifName               = '.1.3.6.1.2.1.31.1.1.1.1';     # имя порта                          [system]





$session = new SNMP(SNMP::VERSION_2C, 'Ваш айпи', 'public@101' );
                        $session->valueretrieval = SNMP_VALUE_LIBRARY;
                        $session->oid_output_format = SNMP_OID_OUTPUT_NUMERIC;
                        $session->oid_increasing_check = false;
                        if(isset($backupVar)) foreach($backupVar as $var => $val) $$var = $val; unset($backupVar);
                        if(($dot1dTpFdbAddress = $session->walk($dot1dTpFdbAddress, true)) != false) {
                            foreach($dot1dTpFdbAddress as $id => $val) $macTable[$id] = trim(str_replace('Hex-STRING: ', '', $val));
                            // Запрашиваем таблицу расположения MAC адресов по портам свича
                            if(($dot1dTpFdbPort = $session->walk($dot1dTpFdbPort, true)) != false) {
                                foreach($dot1dTpFdbPort as $id => $val) $portTable[trim(str_replace('INTEGER: ', '', $val))][] = $macTable[$id];
                                ksort($portTable);


// Индексируем порты и узнаем их реальные имена


if(($dot1dBasePortIfIndex = $session->walk($dot1dBasePortIfIndex, true)) != false) {
                                    foreach($dot1dBasePortIfIndex as $id => $val) $portIndex[trim(str_replace('INTEGER: ', '', $val))] = $id;
                                    if(($ifName = $session->walk($ifName, true)) != false) {
                                        foreach($ifName as $id => $val) if(isset($portIndex[$id])) $portName[trim(str_replace('STRING: ', '', $val))] = $portIndex[$id];
                                        $portName = array_flip($portName);

}}}}

print_r( $portTable ); //проверяем вывод
print_r( $portName );  // проверяем вывод








foreach($portTable as $num => $info) {
        $i=0;
        foreach($info as $id => $mac) {
            //$css = ((($i++)%2!=0)?'1':'2');
            $ip  = isset($arp[$mac])?$arp[$mac]:'unknown';
            //$vendor = explode('(hex)', shell_exec("cat ./oui.txt | grep ".str_replace(' ', '-', substr($mac, 0, 8))));
            //$vendor = isset($vendor[1])? trim($vendor[1]) : 'unknown';
            //$dns = ($ip != 'unknown')?((($dns = gethostbyaddr($ip)) != $ip)? (($domain != '')?str_replace($domain, '', $dns):''): ''):'';
        }
print_r( $ip );   //проверяем вывод
print_r( "\n" );  // переход на новую строку
    }




?>

В итоге мы получаем то что мы хотим. 


Но я не понимаю почему тогда в HTML все IP Unknown? (если проверку  isset($arp[$mac]) не делать, то колонки просто пустые )
image.thumb.png.c5607037f9970ac1b8cd21a352a1b209.png

Edited by Den MoRDa

Share this post


Link to post
Share on other sites

Я сделал это :)).. 
Выяснил что в $arp до сих пор хранилось string:mac
Надо было лишь перезапустить апач.
service httpd restart 

Share this post


Link to post
Share on other sites
13.04.2022 в 17:11, Den MoRDa сказал:

Я сделал это :)).. 
Выяснил что в $arp до сих пор хранилось string:mac
Надо было лишь перезапустить апач.
service httpd restart 

Так давайте готовый вариант.

Share this post


Link to post
Share on other sites

Поменялось оборудование. Теперь оборудование Eltex.
По снмп на ней оид который бы отдавал мак таблицу . ($dot1dTpFdbAddress    = '.1.3.6.1.2.1.17.4.3.1.1';      такого оида нет).

Есть вот что:

"

Для того, чтобы получить c коммутатора MAC, номер порта и VLAN хоста нужно смотреть именно таблицу MAC. Для этого используйте следующий OID:
 
24хх:
snmpwalk  -v1 -c public 192.168.50.9 1.3.6.1.2.1.17.7.1.2.2.1.2
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.1.96.99.76.177.230.113 = INTEGER: 24
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.102.0.38.185.149.246.211 = INTEGER: 1

"

т.е. в самом оиде есть мак (в десятичной форме ) и номер влан.

Но, у меня не хватает знаний, что бы это внедрить в скрипт.. 

Получилась только фукнция, которая из десятичной формы преобразует в нужный нам формат аля ("АА АА АА АА АА АА")
 

function dec2mac($mac) {
    $mac=preg_split("([.])", $mac, 6);
    $hexmac="";
    foreach ( $mac as $part )
    {
    $part=dechex($part);
    strlen($part)<2 ? $hexmac.="0$part " : $hexmac.="$part ";
    }
    return $hexmac;    

}

Но, честно говоря, я даже не знаю как инфу взять из части ОИДА (не из полученного значения)
т.е. по сути нам нужна из оида взять мак засунуть в эту функцию - получим вид мака который нам давала Циска и скормить все это в данный скрипт.

Кто - нибудь может это реализовать :)?
 

 

Share this post


Link to post
Share on other sites

Циско видимо поддерживает BRIDGE-MIB::dot1dTpFdbPort, а элтекс Q-BRIDGE-MIB::dot1qVlanFdbId.

Очень хотелось помощи Kitsum
 

Share this post


Link to post
Share on other sites

Опять же по OID 1.3.6.1.2.1.17.7.1.4.3.1.1 можем получить vlan
И по сути у нас нечто такое 
 

1.3.6.1.2.1.17.7.1.2.2.1.2.$vlan.$mac = $portnumber

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

  • Similar Content

    • By Maerhekil
      Вдруг захотелось с "ядра" просматривать трафик например программой Wireshark. Реализуется достаточно просто.
      Создаём сессию мониторинга для vlan
      monitor session 1 source vlan 1 И указываем на какой интерфейс зеркалировать
      monitor session 1 destination interface Gi1/0/1 Соединяем этот интерфейс с устройством на котором установлен Wireshark и получаем профит.
      Удачи!
    • By Kitsum
      Описанный ниже велосипед является продолжением одной из моих статей на другом, интересном мне, ресурсе. Продолжение и все последующие обновления будут происходить только на it4it.club
      Для начала, хочу процитировать самого себя и тем самым дать пояснения: почему, зачем и для кого это нужно.
      Данная тема получила большую популярность у коллег и не раз выручила Вашего покорного слугу, не дав разгореться стулу на котором он сидит.
      Но имеющегося функционала стало не хватать, требовалось не только слышать и иногда видеть, а еще получать удаленный доступ к оборудованию и лицезреть всю картину в целом.
      Задача поставлена, идем исполнять, но с начало забегу немного вперед и продемонстрирую текущий функционал.
      Общее окно программы переработано и теперь отображает список всех групп из Zabbix с их хостами. Список активных триггеров переехал в нижнюю часть окна и отображает дополнительную информацию об узлах с которыми не все гладко. Сам список можно увеличивать, если все совсем плохо, или уменьшать если выражение "Хьюстон у нас проблемы" Вы слышите только в фильмах. Также появились цветные маркеры важности триггера. По двойному клику по активному триггеру мы перемещаемся в соответствующую группу где находится проблемный узел.
      Не забыли и про то, ради чего вся начальная песня и писалась - трей с всплывающими оповещениями и звуковым сигналом. Основное окно сворачивается именно туда, чтобы не залеживаться на панели где ценится каждый свободный пиксель.
      Хосты в группах стали кликабельны, правда пока только ПКМ, и имеют всплывающее меню позволяющее выполнять банальные действия:
      Подключение к узлу:
      Telnet SSH RDP VNC Проверка соединения:
      Ping Traceroute Естественно его можно расширить, добавив всяких вкусностей по мере возрастания аппетита IT отдела.
      Программа по прежнему имеет серверную и клиентскую часть, что позволило организовать кэширование запросов и осуществлять оповещения в момент определения проблемы сервером, а не по таймеру обновления, как это организовано в dashboard zabbix. Раньше узнали о проблеме, раньше приступили к устранению. Естественно и устаревшие триггеры убираются также оперативно.
      Также это позволило избавить программу от информации о доступе к серверу, что мне кажется не приемлемым для оповещалки. Чем меньше дырок, тем крепче сон.
      Приступим к реализации.
      Ну и естественно, Ваш покорный слуга еще не научился писать на C++ ничего более сложного чем "Hello World", поэтому клиент и сервер будет написан на PHP. За исключением того момента, что клиентская часть (при помощи магии Гарри Поттера) станет бинарным файлом. Бог с ним, серверная часть не доступна обывателю, а это самое важное!!!
      Для начала, нужно придумать безопасный и понятный алгоритм не нагружающий сервер т.к клиентов может быть 100и или 1000и, всякое бывает. Все не безопасные команды обязаны выполняться на сервере без участия клиента. Дальнейшая работа клиента: обработка данных, выполнение действий с триггерами и т.п должно выполняться только у клиента, не затрагивая сервер.
      При обращении клиента к серверу по http происходит проверка его ip на наличие в списках разрешенных. В противном случае показываем фигу. Проверяем, наличие актуального кеша, и отдаём его. Если кеша нет, генерируем новый. Если запрос прилетел от zabbix: принудительно считаем кеш устаревшим, генерируем новый и после этого рассылаем всем клиентам оповещения по UDP протоколу. Это позволит свести расход ресурсов базы данных к нулю т.к все клиенты ринутся забирать новые данные, а все уже в кеше. Супер, все дешево и сердито.
      Серверная часть представляет из себя файл index.php где-то на Вашем web сервере. Актуально для Zabbix 2.4 (скорее всего будет актуальна и для последующих версий, будем проверять по мере возрастания аппетита).
      Для дополнительной безопасности рекомендую создать отдельную учетную запись в базе данных с правами только на чтение и только к базе zabbix. Это актуально в наши дни.
      Переходи в zabbix
      Первым делом переходим в Настройка -> Действия -> Источники события: Триггеры и создать новое действие. Назовем случайным образом, например Report problems to ZabbixTrigger.
      В условиях выставляем
      Значение триггера = ПРОБЛЕМА Значение триггера = OK Это все необходимо, чтобы проблемы в GUI появлялись и исчезали точно именно тогда, когда это происходит в Zabbix (не путать с dashboard).
      Вкладка "Операции" должна выглядеть следующим образом. Естественно что путь до php скрипта должен быть вашим.
      Вуаля! Если Вы все сделали правильно (без кардинальных изменений), то я рад приветствовать нового ездока моего велосипеда. Поедем тандемом!
      Сам клиент прикреплен в конце поста.
      Для тех, кто читает титры в кинотеатре
      При запуске будет создан файл config.ini в корне программы. При необходимости, измените его настройки, благо их не много.
      [server] url="http://zabbix/zabbix-gui" update="60" [client] showalarm="20" Параметр url отвечает за http путь до скрипта на сервере, update за интервал (в секундах) обновления данных с сервера, а showalarm вроде как должен влиять на время отображения всплывающей подсказки в трее.
      Теперь немного структуры.
      В каталоге sounds находится звук оповещения о новом триггере, формат ogg Каталог icons содержит маркеры триггеров. trigger00 - для нормального состояния, а все последующие соответствуют начальным настройкам zabbix во вкладке Администрирование -> Общие раздел Важность триггеров. Можете изменить на свои цвета, программа все подхватит при перезагрузки. Ну и на закуску каталог ext, это как говорится для меломанов, содержит фри программы для обработки внешних действий клиента. Вы можете заменить их на свои при условии, что стандартные имена параметров запуска и их последовательность совпадают. PS: На этом все, спасибо тем кого это заинтересовало. Предлагайте свои идеи или способы доработки велосипеда. А если найдется программист на C++ так милости просим. В любом случае, функционал будет в дальнейшем расширяться.
      zabbixTrigger.zip
    • By Kitsum
      Набросок небольшой программы на PHP для облегчения жизни IT отделу. Позволяет просматривать какие хосты располагаются на портах сетевого оборудования (за основу взято оборудование фирмы Cisco). Для связи используется SNMP протокол. Из информации об узле выводятся:
      MAC IP DNS имя Производитель оборудования Подробное описание можно посмотреть в следующей теме.
       
    • By Kitsum
      Делюсь шаблоном для мониторинга состояния маршрутизаторов CISCO, zabbix 2.4
      Работа с устройством реализована по протоколу SNMP и тут есть ряд подводных камней, но самый основной это изменения стандарта от одной версии прошивки к другой.
      Если понадобится изменить OID значения, то поискать их можно тут http://tools.cisco.com/Support/SNMP/do/BrowseOID.do но часть старый параметров в базе отсутствует. Тут уж или через поисковик или "Селяви, что в перевод с древнегреческого - не повезло!".
      Простая конфигурация устройства:
      cisco-test#configure terminal Enter configuration commands, one per line. End with CNTL/Z. cisco-test(config)#snmp-server community public RO cisco-test(config)# Но при этом любой может подключиться к устройству и читать с него данные, если вы хотите чтобы плохие люди могли еще и отдавать команды то RO необходимо заменить на RW
      Если Вы желаете ограничить доступ к SNMP серверу устройства по IP, то необходимо использовать access-list:
      cisco-test#configure terminal Enter configuration commands, one per line. End with CNTL/Z. cisco-test(config)#ip access-list standard SNMP_ACCESS_RO cisco-test(config-std-nacl)#permit 192.168.1.2 cisco-test(config)#snmp-server community public RO SNMP_ACCESS_RO cisco-test(config)#^Z cisco-test# Сommunity можно обозвать как угодно, хоть BLABLABLA место public. IP естественно заменить на адрес Вашего сервера. RO - только чтение, RW - полный доступ
      Мы будем только читать, поэтому RO. В теории конечно можно отлавливать определенные события на устройстве и предпринимать ответные действия автоматически, только в таких случаях RW. Но об этом мы поговорим в другой раз.
      Теперь необходимо добавить макрос в zabbix Администрирование -> Общие -> Макросы
      {$SNMP_COMMUNITY} = имя community указанное в конфигурации CISCO, например "public" Сам шаблон можно забрать в конце поста.
      Немного о шаблоне.

      На данным момент собираются данные:
      Аптайм Модель маршрутизатора Загрузка центрального процессора за: 5 секунд, 1 минуту, 5 минут Статус (online\offline) Память: ОЗУ, ПЗУ Список доступных интерфейсов Статусы сетевых интерфейсов Количество byte RX\TX на каждом интерфейсе Количество error byte RX\TX на каждом интерфейсе По этим данным строятся соответствующие графики (ОЗУ, ПЗУ и т.п не выведены, можете добавить самостоятельно)
      Пока маловато триггеров, но по мере обновления шаблона, их количество увеличится:
      Маршрутизатор выключен или с ним нет связи по Ethernet Маршрутизатор был пере запущен менее 5 минут назад Нагрузка на ЦП выше 80%  PS: следите за обновлениями!
      zbx_templates_router_cisco.xml
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...