Обчислення IP адрес через SNMP або як отримати доступ до таблиці маршрутизації, C / C + +, Програмування, статті

Stas Khirman, Raz Galili, WWW.ІСХОДНІКІ.РУ

Всі ми колись починали програмування в мережі з простої операції визначення 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 за коштами трьох функцій:


Dll так само може підтримувати


Отже, все готово для того, щоб завантажити 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). Він завжди існує.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*