LINUX.ORG.RU
решено ФорумAdmin

программа для получения инфы по SNMP

 ,


1

1

Есть ли какая-то программа чтобы тупо подключиться к роутеру и смотреть что там SNMP говорит (v1/v2/v3, какой именно не знаю, потому что нуб, на всякий случай включил все три версии на устройстве)?

Желательно графическая. Всё что я пока нагуглил - дохлые ссылки. Поэтому интересует актуальная информация, кто какой программой предпочитает пользоваться.

Второй вопрос - как из кода на Си/Си++ получить доступ к информации SNMP от устройства? Может есть библиотека готовая для этого?

Debian stable, вот что стоит:

root@deb:~# dpkg -l |grep snmp
ii  erlang-snmp            1:15.b.1-dfsg-4+deb7u1             amd64        Erlang/OTP SNMP applications
ii  libsnmp-base           5.4.3~dfsg-2.7                     all          SNMP (Simple Network Management Protocol) MIBs and documentation
ii  libsnmp-dev            5.4.3~dfsg-2.7                     amd64        SNMP (Simple Network Management Protocol) development files
ii  libsnmp-perl           5.4.3~dfsg-2.7                     amd64        SNMP (Simple Network Management Protocol) Perl5 support
ii  libsnmp15              5.4.3~dfsg-2.7                     amd64        SNMP (Simple Network Management Protocol) library
ii  snmp                   5.4.3~dfsg-2.7                     amd64        SNMP (Simple Network Management Protocol) applications
ii  snmp-mibs-downloader   1.1                                all          Install and manage Management Information Base (MIB) files
root@deb:~#
Так пользовать:
root@deb:~# snmpwalk -v 2c -c public 10.0.20.20

black_13
()
Ответ на: комментарий от vel

спасибо за ответы! :) изучу всё предложенное :)

mbrowse - надо б заюзать, snmpwalk тоже посмотрю

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от black_13

Нашел такую проприеторастическую софтину (кроссплатформенная ибо жабская) - http://www.ireasoning.com/mibbrowser.shtml - есть бесплатная версия. Всё что надо - показывает.

Только один вопрос остается (как у нуба) - вот эти OID, точнее цифры, например iso.3.6.1.2.1.2.2.1.10.129 или .1.3.6.1.2.1.2.2.1.10.129 - они по какому алгоритму задаются? Я уже успел прочитать что эти цифры сохраняются если устройство не перепрошивается и не обновляется, в общем от включения к включению питания - всегда одни и те же, что это просто видимо цифровое удобное обозначения узла в древовидной структуре.

Я могу завязаться на эти цифры в своих программах и скриптах? Допустим, заменяю одно устройство на другое такое же - иерархия этих цифр и их порядок следования сохранится?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

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

Ничего подобного. Например, на cisco, без

# snmp-server ifindex persist

индексы будут съезжать после перезагрузок.

Я могу завязаться на эти цифры в своих программах и скриптах? Допустим, заменяю одно устройство на другое такое же - иерархия этих цифр и их порядок следования сохранится?

Если дело касается постоянных вещей, таких как uptime, sysname и т.д., то да. А вот разные там сетевые интерфейсы - индесы для них генерятся по мере добавления.

Turbid ★★★★★
()
Последнее исправление: Turbid (всего исправлений: 1)
Ответ на: комментарий от Turbid

индексы будут съезжать после перезагрузок

На что же тогда можно опереться в этой иерархии? Например, для начала, меня интересует ifInOctets и ifOutOctets. Что нужно сделать чтобы я всегда их читал без проблем? В программе iReasoning MIB Browser я вижу что строится некая не-цифровая иерархия, т.е. iso.org.dod.internet.mgmt.mib-2/interfaces/ifTable/IfEntry/ifInOctets...

Пока только погружаюсь в тему прежде чем начать писать модуль для работы с SNMP.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

В zabbix, например, есть динамические индексы: https://www.zabbix.com/documentation/ru/2.0/manual/config/items/itemtypes/snm...

ifInOctets["index","ifDescr","GigabitEthernet0/1"]

Т.е. такой шаблон снимает данные (ifInOctets) для определенного интерфейса.

Никто не мешает реализовать подобное на C++. Ищешь по определенному признаку (название интерфейса, например) нужный индекс, а потом уже подставляешь этот индекс в свои запросы.

Turbid ★★★★★
()
Последнее исправление: Turbid (всего исправлений: 1)
Ответ на: комментарий от Turbid
snmpget -v 2c -c public 192.168.1.2 RFC1213-MIB::ifOutOctets.9
RFC1213-MIB::ifOutOctets.9 = Counter32: 51653

Вот так работает. Текстовое представление не меняется.

Буду теперь через libnetsnmp городить... :)

snmpbulkget -v 2c -c public 192.168.1.2 RFC1213-MIB::ifInOctets
snmpbulkget -v 2c -c public 192.168.1.2 RFC1213-MIB::ifOutOctets

А так еще лучше - сразу для всех интерфейсов тянет.

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от dexpl

libnetsnmp, не?

Поставил из репозиториев Ubuntu - упорно ругается что не объявлено SNMP_VERSION* и прочие дефайны, хотя все include 100% есть, эти символы по файлам успешно ищутся.

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

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

snmpbulkget и прочие утилиты из net-snmp — cli-обертки вокруг libnetsnmp. Соответственно, в исходниках утилит можно посмотреть способы применения библиотеки.

// Я, если что, не програмист и расуждаю из общих соображений.

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

Я уже из исходного кода собрал - та же проблема. Или буду парсить готовые утилиты, либо вообще откажусь от этой каки.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Turbid

Тут http://network.xsp.ru/6_1.php пишут вот что:

Каждому элементу соответствует численный и символьный идентификатор. В имя переменной включается полный путь до нее от корневого элемента root. Например, время работы устройства с момента перезагрузки хранится в переменной, находящейся в разделе system под номером 3 и называется sysUpTime. Соответственно, имя переменной будет включать весь путь: iso(1).org(3).dod(6).internet(1).mgmt(2).mib-2(1).system(1).sysUpTime(3); или на языке чисел: 1.3.6.1.2.1.1.3. Следует заметить, что при этом узлы дерева разделяются точками. Существует стандартная ветвь MIB, относящаяся к разделу управления mgmt, которую обычно поддерживают все сетевые устройства.

Наряду с этим каждый производитель или организация может разработать свой собственный набор переменных и «подвесить» их к дереву MIB. Однако, это делается только в строго определенном ее месте. Если организация разрабатывает свою базу MIB, то на стадии экспериментов переменные могут помещаться в раздел experimental. Однако для официальной регистрации структуры данных некоторой организации ей необходимо получить собственный номер в разделе private-enterprises. Все переменные, адресуемые вниз по ветви данной организации, относятся к продуктам только данного производителя.

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

Пока что на Moxa EDS-G509 я вижу эти цифры стоят как вкопанные.

Я это к чему интересуюсь: у меня проект с libnet-snmp что-то не хочет нормально компилироваться, а сама библиотека имеет кучу невнятных параметров для компиляции. Я выбрал SNMP++ 3.3.4 и там вроде как всё попроще (тоже работает), но поддерживаются только цифровые OID, а символьные нет. Раз они посчитали допустимым ограничиться лишь тупо цифрами OID, значит они (разработчики) считают что эти цифры фиксированные...

А если не фиксированные, то к чему же привязываться? Пока не понимаю, как же это соответствие устанавливается. Вот есть операция walk - проходит всё дерево, а это длительная операция по времени...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

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

Еще раз - на Cisco едут, например индексы интерфейсов. Сам oid интерфейса тот же, а индекс может измениться - интерфейсы же можно добавлять/удалять. Я про это.

Turbid ★★★★★
()
Ответ на: комментарий от Turbid

Еще раз - на Cisco едут, например индексы интерфейсов. Сам oid интерфейса тот же, а индекс может измениться - интерфейсы же можно добавлять/удалять. Я про это.

Ааа... ясно, теперь понял. Ну, это ясно. Но вот на Moxa 100% например и на Korenix (предположительно, не успел долго потестировать) - не едут индексы интерфейсов, там всегда первый это первый и т.д., а новообразованные порты (например с LACP) - тоже как были со своими номерами - так и остаются.

ЗЫ Просто делаю проект со сложной сетью, и там требуется многосторонняя диагностика сети - вот и изучаю всякие там SNMP, LLDP, RSTP и прочее...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Вот, решил выложить маленький тестовый кодик... Работает :)

#include "snmp.h"
#include <QDebug>

using namespace Snmp_pp;

snmp::snmp(QObject *parent) :
	QObject(parent)
{
}

bool snmp::test()
{
	qDebug() << "SNMP test:";

	Snmp::socket_startup();
	UdpAddress address("192.168.1.2");
	if(!address.valid())
	{
		qDebug() << "ERROR: snmp::test, address not valid";
		return false;
	}

	snmp_version version = version2c;
//	snmp_version version = version3;
	int retries = 1;
	int timeout = 1000;
	u_short port = 161;
	OctetStr community("public");

	int status;
	Snmp snmp(status, 0, (address.get_ip_version() == Address::version_ipv6));
	if(status != SNMP_CLASS_SUCCESS)
	{
		qDebug() << "ERROR: snmp::test, session fail";
		return false;
	}

	Vb vb;
	Pdu pdu;
	Oid oid("1.3.6.1.2.1.1.1.0");
//	Oid oid("1.3.6.1.2.1.2.2.1.16.129");
	vb.set_oid(oid);
	pdu += vb;

	address.set_port(port);
	CTarget ctarget(address);
	ctarget.set_version(version);
	ctarget.set_retry(retries);
	ctarget.set_timeout(timeout);
	ctarget.set_readcommunity(community);

	SnmpTarget *target;
	target = &ctarget;
	status = snmp.get(pdu, *target);
	if(status == SNMP_CLASS_SUCCESS)
	{
		qDebug() << "pdu.get_vb_count=" << pdu.get_vb_count();
		for(int i = 0; i < pdu.get_vb_count(); i++)
		{
			pdu.get_vb(vb, i);
			qDebug() << "**************************" << endl;
			qDebug() << "VB nr: " << i << endl;
			qDebug() << "Oid = " << vb.get_printable_oid() << endl << "Value = " << vb.get_printable_value() << endl;
			qDebug() << "Syntax = " << vb.get_syntax() << endl;

			if((vb.get_syntax() == sNMP_SYNTAX_ENDOFMIBVIEW) ||
			(vb.get_syntax() == sNMP_SYNTAX_NOSUCHINSTANCE) ||
			(vb.get_syntax() == sNMP_SYNTAX_NOSUCHOBJECT))
			{
				qDebug() << "Exception: " << vb.get_syntax() << " occured." << endl;
			}
		}
	}
	else
	{
		qDebug() << "ERROR: snmp::test, snmp.get fail" << snmp.error_msg(status);
		return false;
	}

	qDebug() << "SNMP: OK";
	return true;
}
#ifndef SNMP_H
#define SNMP_H

#include <QObject>
#include <libsnmp.h>
#include <sys/socket.h>
#include <snmp_pp/snmp_pp.h>

class snmp : public QObject
{
	Q_OBJECT
public:
	explicit snmp(QObject *parent = 0);
	bool test();

signals:

public slots:

private:
};

#endif // SNMP_H
I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Turbid

tailgunner

В общем, делаю циклический опрос с периодом 100 мс:

time= "2:41:23.11" 
time= "2:41:23.22" 
time= "2:41:23.31" 
time= "2:41:23.41" 
time= "2:41:23.51"
Значения sysUpTime (OID 1.3.6.1.2.1.1.3.0) - обновляются каждое чтение.

А вот значения ifInOctets/ifOutOctets - лишь раз в ~5 секунд (видимо так настроено).

speed srx= "       0.0" stx= "       0.0" Mbit/s ems= 5.3 rx= 11194404 tx= 2614775 
. Судя по этой странице - такое поведение и задумано для всех SNMP устройств, для всех полей кроме некоторых?

Второе что меня интересует (в процессе изучения) - SNMP Traps. Я правильно понимаю что это некие триггеры, и можно настроить уведомление на то, что какой-то параметр примет значение в некоем интервале?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

facepalm.tar.jar.jpg.arj

Ахтунг, захардкоденные OID в коде.

Пойди про MIB'ы почитай.

Не вижу глубинного смысла писать на C/C++ программы :)

Давно есть средства мониторинга сети и прочего по SNMP.

robot12 ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Я правильно понимаю что это некие триггеры, и можно настроить уведомление на то, что какой-то параметр примет значение в некоем интервале?

Нет не правильно. Ошибку сетевое оборудование может отсылать несколькими способами и snmptrap всего один из них. И да трапы будут отсылаться только если их отсылка настроена.

robot12 ★★★★★
()
Ответ на: комментарий от robot12

Давно есть средства мониторинга сети и прочего по SNMP.

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

Не вижу смысла работать, писать программы, особенно на С++ и тем более для SNMP - но надо, ибо кушать хочется :)

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от robot12

Ошибку сетевое оборудование может отсылать несколькими способами и snmptrap всего один из них. И да трапы будут отсылаться только если их отсылка настроена.

Я могу произвольные параметры «ставить на контроль»? Например, число принятых пакетов составит более 23570 пакетов - тут же уведомление - да? Я пока тока изучаю, но все равно рад узнать из ответов :)

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

я не могу просто так взять готовое ПО

Что мешает ??? OpenNMS чудно всё делает.

robot12 ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Я могу произвольные параметры «ставить на контроль»? Например, число принятых пакетов составит более 23570 пакетов - тут же уведомление - да?

Нет

robot12 ★★★★★
()
Ответ на: комментарий от robot12

Нет

Ясно... Значит старый добрый поллинг и смотрение параметров на предмет их значений...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от robot12

RMON — стандарт описанный в пачке rfc, потому.

hizel ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Я могу произвольные параметры «ставить на контроль»?

В своих программах - как сделаешь, в чужих - может быть. Читай MIB и документацию от вендора.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

В своих программах - как сделаешь
в чужих - может быть

o_O

Читай MIB и документацию от вендора.

Зачем для этого mib, непонятно что-то. O_o

hizel ★★★★★
()
Ответ на: комментарий от tailgunner

Вкратце: в рамках SNMP (например 2c) предположим, на каком-то устройстве есть ЛЮБОЙ параметр, например число принятых ICMP-пакетов. Смогу ли я настроить устройство так, чтобы оно выслало уведомление на порт 162 если число ICMP-пакетов превысит определенное значение?

Вопрос до безобразия прост, но я пока не достиг понимания каковы лимиты возможностей SNMP. Я чисто интуитивно предполагаю, что возможность задать какие-то триггеры - есть.

Просто сижу ковыряю несколько программ для работы с SNMP и не вижу в них того, чтобы дало ответ... В частности, iReasoning MIB Browser - нету там настроек чтобы указать пороги срабатывания...

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

предположим, на каком-то устройстве есть ЛЮБОЙ параметр, например число принятых ICMP-пакетов. Смогу ли я настроить устройство так, чтобы оно выслало уведомление на порт 162 если число ICMP-пакетов превысит определенное значение?

Это зависит от устройства (не от SNMP).

каковы лимиты возможностей SNMP

Возможности SNMP в этом плане безграничны. Если ты пишешь агента, ты можешь реализовать в нем сколь угодно тонкие настройки триггеров. Если ты мониторишь устройства, реализующие некие MIB (и, специально для hizel, RFC) - нужно курить документацию на устройства (там должны быть отсылки к MIB, RFC и описание расширений от вендора, если таковые есть).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

т.е. возможность или невозможность задания триггера на значение параметра - зависит от реализации агента (модели устройства, вендора)? Или это в MIB задается что вот этот параметр я могу (или не могу) мониторить?

Второй вопрос: правильно ли я понимаю, что у разных веток в дереве параметров (MIB Tree или как там) - разная частота обновления? Одни параметры обновляются мгновенно при каждом обращении, некоторые могут раз в 5 секунд обновляться, некоторые еще реже - так, да? Если да, то плохо, не представляю как пропускную способность мониторить, либо поллить очень часто (что плохо), либо как-то триггер задать (возможно ли)?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Прежде всего: я знаком с SNMP с другой стороны - со стороны агентов, причем нестандартных, поэтому о возможностях, устройств, поддерживающих стандартные MIB, знаю мало.

т.е. возможность или невозможность задания триггера на значение параметра - зависит от реализации агента (модели устройства, вендора)?

Если она не задана в MIB/RFC и не настраивается специфичным для агента способом - да, конечно.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.