Ошибка: Failed to parse the Currency Converter XML document.
$59 503.16


Ошибка: Failed to parse the Currency Converter XML document.
$58 537.36


Ошибка: Failed to parse the Currency Converter XML document.
$1 595.77


Вычисление IP адресов через SNMP или как получить доступ к таблице маршрутизации.

Все мы когда-то начинали программирование в сети с простой операции определения IP адреса, принадлежащему нашему компьютеру. Задав такой вопрос в форуме, мы обычно получали очень короткий ответ: Используй gethostbyname() для «localhost». Всё это конечно хорошо, но в большинстве случаев этого недостаточно. Прежде всего, эта функция дает Вам только IP адрес, но не дает никакой другой информации, в то время как иногда бывает полезно узнать маску подсети. Так же бывает ситуация, когда на компьютере установлено более одного сетевого устройства (другие сетевые карты, модемы), которые имеют собственные IP адреса. А если же ещё и TCP/IP будет неправильно настроен, то Вы вообще получите неправильный IP адрес.


В Windows 95 и Windows NT имеются специальные утилиты статистики. IPCONFIG в NT и WINIPCFG в Win95, которые определяют Ваши IP адреса, сетевую маску, и даже MAC адрес Вашего адаптера. Утилита NETSTAT показывает список активных TCP и UDP соединений, а так же детализирует статистику передачи данных. Утилита ROUTE дает Вам возможность просмотреть, а так же изменить таблицу маршрутизации. И наконец утилита ARP даёт возможность получить доступ к таблице определения адресов. Для нас, как для программистов это означает, что существует какой-то способ залезть во внутренности TCP/IP. Так почему бы не попробовать это сделать!


На мой взгляд попытка определения IP адреса — это первый шаг к тому, чтобы со временем залезть во внутрь протокола TCP/IP.

Итак, есть одна вещь, которая объединяет все вышеперечисленные утилиты IPCONFIG, NETSTAT, ROUTE и ARP. Все они используют DLL под название INETMIB1.DLL.

В документации Microsoft сказано, что это расширение для SNMP агента. Если правильно обращаться к этой DLL-ке, то мы сможем получить всю, необходимую нам информацию, а так же многое многое другое. Всё, что нам нужно сделать — это съэмулировать расширяемого агента Windows и вызвать DLL с правами OID.

Давайте разберёмся, что же такое SMNP, расширяемый агент и OID.

Что такое SNMP

SNMP расшифровывается как Простой Протокол Управления сетью (Simple Network Management Protocol). SNMP был разработан с целью решить сложную проблему управления сетью. На сегодняшний день практически все устройства так или иначе связаны с сетью: принтеры, маршрутизаторы, репитеры, мосты, многофункциональные сервера и настольные компьютеры. (Единственно, что пока ещё не включили в сеть — это кофеварки, холодильники и пылесосы, но думаю, что скоро настанет и их час :) Каждое из этих устройств имеет свои параметры, свои настройки и может предоставлять различную информацию о себе.

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

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

Структура данных SMNP

Данные, обработанные SNMP агентом разбиты на части, которые называются «management information bases» или сокращённо MIB. MIB-ы описаны через язык определений под названием «Abstract Syntax Notation». Любая программа может общаться с агентом и обрабатывать полученную от него информацию только если она имеет MIB агента.

Информация, содержащаяся в MIB может описывать неограниченное количество объектов. Каждый объект имеет уникальный идентификатор, называемый OID. Проще говоря OID — это последовательность чисел, которые идентифицируют объект. Каждый объект, который может быть обработан через SNMP, имеет свой уникальный OID. Все существующие в мире OID-ы организованы в одну большую древовидную структуру. Последовательности чисел, которые представляют собой OID-ы — это идентификаторы ветвей дерева. Каждое поддерево в дереве назначается IETF, чтобы гарантировать уникальность каждой ветви дерева.

Каждая ветвь имеет имя и номер, связанные с ним. Соответственно все объекты SNMP имеют примерно такое имя: iso.org.dod.internet которое соответствует числу 1.3.6.1.

Все основные TCP/IP объекты, содержащиеся внутри поддеревьев basic, называются «основанные на MIB-II». Определение MibII можно прочитать в RFC1213 . Читая файл MibII, мы можем увидеть, что для того, чтобы получить информацию от системы, нам необходимо считать значение из iso.org.dod.internet.mgmt.mib — 2.system.sysDescr (1.3.6.1.2.1.1.1.0)

Последний числовой идентификатор 0, показывает, что для того, чтобы прочитать sysDescr, нам необходимо читать скалярное значение.

Скалярные значения довольно просты в чтении. Например, чтобы считать текущий IP адрес нашей машины, нам необходимо прочитать значение iso. org. dod. internet. mgmt. mib — 2. ip. ipAddrTable. ipAddrEntry. ipAddress. IPADDRESSREALVALUE либо 1, 3, 6, 1, 2, 1, 4 , 20, 1 ,1,?,?,?,?. Каждый вопросик — это цифра ip адреса. Предположим, что IP адрес Вашей машины 123.45.67.89, тогда Вы получите значение 1, 3, 6, 1, 2, 1, 4 , 20, 1 ,1, 123, 45, 67, 89. Естевственно, чтобы считать это значение, надо быть уверенным, что оно существует.

IpAddress — это элемент таблицы, проиндексированной непосредственно по этому адресу. Чтобы получить доступ к некоторым объектам таблицы, нам необходимо сопоставить их базовые OID с ихними индексами. В нашем примере используется deadloop, так как мы должны знать ip адрес, чтобы получить его!

SNMP решает данную проблему поддержкой команды, позволяющей пользователю искать данные в дереве. Если у Вас есть данный OID, то Вы можете запросить значение объекта со следующим OID. В нашем случае, если мы будем запрашивать значение элемента, следующего за 1.3.6.1.2.1.4.20.1.1 , то получим полный OID и значение нашего первого IP интерфейса. С полным значением OID первого интерфейса мы можем использовать запрос «get next» для получения IP адреса второго интерфейса и так далее.

Чтобы получить IP маски, необходимо использовать 1.3.6.1.2.1.4.20.1.3 как стартовый OID.

SMNP и Windows

Итак, вернёмся к нашей DLL-ке. Эта DLL-ка общается с агентом через API по средствам трёх функций:
SnmpExtensionInit — Функция инициализации агента.

SnmpExtensionQuery — Основная функция запроса.

SnmpExtensionTrap — обработчик ловушек.

Dll так же может поддерживать
SnmpExtensionInitEx() — Это расширенная версия SnmpExtensionInit, которая предоставляет большие возможности, чем SnmpExtensionInit.

Итак, всё готово для того, чтобы загрузить DLL, смоделировать инициализацию агента, а затем получить IP адрес, а так же всё, что нам необходимо по мимо этого.

SNMP команды

SNMP имеет три основных команды — Get, Set, And GetNext. В каждом вызове SnmpExtensionQuery содержится приличное количество данных. В эту функцию передаётся структура типа RFC1157VarBindList. Эта структура — список элементов VarBind, которые определены следующим образом:

typedef struct {
    RFC1157VarBind *list;
    UINT len;
    } RFC1157VarBindList;

typedef struct vb {
    AsnObjectName name;
    AsnObjectSyntax value;
    } RFC1157VarBind;

Структура VarBind содержит как имя элемента (OID) , так и его значение.

Get и Set используются для доступа к данным объектов, и мы не нуждаемся в них, для получения информации, которой мы заинтересованы.

GetNext немного отличается от Get и Set. Он используется для путешевствия по длинному дереву OID, которые поддерживает агент. Если сделать запрос в SnmpExtensionQuery через GetNext, то функция вернёт первое значение, которое поддерживает агент, и оно будет лексикографически больше того, которым снабжён OID.

Как общаться с inetmib1.dll

Чтобы приступить к использованию DLL-ки, для начала необходимо вызвать функцию SnmpExtensionInit(). Эта функция имеет 3 параметра — ссылка на нулевое время, обработчик ловушки и идентификатор объекта для получения поддерживаемого представления. Для более полного понимания этой функции и её старшего брата SnmpExtensionInitEx() необходимо более детальное исследование snmp расширения DLL. Здесь мы не будем угляться в это исследование, а ограничимся тем, что в MibII эти значения можно принять по умолчанию.

Затем мы делаем вызов Query через запрос GetNext, и повоторяем вызов до тех пор, пока функция не перестанет возвращать нам ip адреса. Но для этого передадим в функцию VarBind, содержащую: iso.org.dod.internet.mgmt.mib — 2.ip.ipAddrTable.ipAddrEntry.ipAddress (т.е. 1,3,6,1,2,1,4,20,1,1) в каждом вызове.

Если мы имеем 3 IP адреса 205.5.3.1, 205.5.3.3 и 205.5.3.6, то первый раз мы получим обратно 1,3,6,1,2,1,4,20,1,1,205.5.3.1. Второй — 1,3,6,1,2,1,4,20,1,1,205.5.3.3 и третий — 1,3,6,1,2,1,4,20,1,1,205.5.3.6. И, наконец, четвёртый раз возвращаемое значение будет выглядеть как 1,3,6,1,2,1,4,20,1,2 либо как 1,3,6,1,2,1,4,20,1,3. что будет сигнализировать о том, что функция больше не может получить ip адресов.

Не забудьте, что функция GetIpAddress всегда будет возвращать внутренний адрес (127.0.0.1). Он всегда существует.

 

Интересное

Горячие Клавиши
Сочетания клавиш Выполняемое действиеShift + влево Вызов контекстного менюAlt+Backspace Перейти на предыдущую страницуShift + вправо Перейти на следующую страницуAlt+Home Перейти на домашнюю...
Подробнее...
CSS вёрстка: учимся сами
Время от времени в мой почтовый ящик приходит очередное письмо, содержащее всего одну просьбу: меня просят рассказать о неком алгоритме изучения «блочной» вёрстки. Настало время...
Подробнее...
Время выполнения SQL запросов
Итак, нам нужно засечь время, потраченное на выполнение SQL запросов ? Это не очень легко, но и не сложно. Начнем с определения задачи. Необходимо выдать полное время, затраченное на генерацию...
Подробнее...
Используем базу данных MySQL
mysql — Система Управления Базами Данных (СУБД). Основное отличие от всех остальных СУБД это то,что она является бесплатной. В силу того, что mysql бесплатна, она поддерживается очень многими...
Подробнее...
Настройка видеокарты от...
Никогда не возникал вопрос, почему под Linux'ом так откровенно тормозят потрясающие демки, quake 3 и прочее, требующее более или менее приличной производительности от видеокарты, хотя на...
Подробнее...
Как сгенерировать файл...
Рано или поздно любой веб-мастер сталкивается с необходимостью защиты своего сайта, более тонкой настройки доступа к различным его параметрам. Один из вариантов — использовать специальный...
Подробнее...
Пошаговое руководство по...
В этом пошаговом руководстве представлены инструкции по балансировке сетевой нагрузки (Network Load Balancing, NLB) в среде служб терминалов, что позволяет получить такие преимущества, как...
Подробнее...
Десять советов по...
Использование всевозможных технологий удаленного администрирования рабочих станций позволяет существенно сэкономить время и деньги. Ниже приводятся некоторые советы, которые помогут читателям в...
Подробнее...
Захват чужих имен
Особенности доменных имен, уже бывших в чей-то собственностиНе знаю, как вам, но мне иногда кажется, что все лучшие доменные имена уже разобрали. Не раз я придумывал потрясающее доменное имя, и...
Подробнее...
GSM – шлюз: Как через...
У меня возникла необходимость по нескольку раз в день принимать и отправлять фак- сы на даче, где нет городского телефона. Слышал, что для таких целей можно каким-то образом приспособить мобильный...
Подробнее...