Федеральное агентство по образованию РФ Государственное образовательное учреждение высшего профессионального образования Уральский государственный университет им. А.М.Горького Математико-механический факультет Кафедра высокопроизводительных компьютерных технологий Построение топологии локальной сети на основе SNMP запросов "Допущен к защите" ___________________ "___"____________2005 г. Дипломная работа студентки 5 курса Сигаковой Ксении Александровны Научный руководитель Игумнов Александр Станиславович Екатеринбург 2008 СОДЕРЖАНИЕ СОДЕРЖАНИЕ............................................................................................................................2 ВВЕДЕНИЕ ...................................................................................................................................3 1. ПОСТАНОВКА ЗАДАЧИ ......................................................................................................4 2. ТЕОРЕТИЧЕСКИЙ РАЗДЕЛ ...............................................................................................5 2.1 Switch ....................................................................................................................................5 2.2 SNMP ....................................................................................................................................6 2.3 PERL .....................................................................................................................................9 2.4 Graphviz-win .......................................................................................................................11 3. РЕШЕНИЕ ..............................................................................................................................13 3.1 Сбор информации ..............................................................................................................13 3.2 Обработка информации ....................................................................................................17 3.3 Алгоритм ............................................................................................................................18 ЗАКЛЮЧЕНИЕ .........................................................................................................................21 СПИСОК ЛИТЕРАТУРЫ .......................................................................................................22 ПРИЛОЖЕНИЯ .........................................................................................................................23 Приложение 1. Условные обозначения .................................................................................23 Приложение 2. Результаты .....................................................................................................24 2 ВВЕДЕНИЕ В последнее время отношение к компьютерам сильно меняется. Если еще несколько лет назад для успешной работы организаций достаточно было только наличия компьютеров на рабочих местах сотрудников, то теперь уже во многих организациях от компьютера нет практически никакой пользы, если он не подключен к сети. Все больше и больше программных систем устанавливается на сервер, а пользователи работают с ними в режим терминального доступа. Т.е. получается, что компьютер из самодостаточной системы постепенно превращается в один из элементов сети, а производительность и успешность работы предприятий уже зависит от устойчивости сети, в том числе и от быстроты обнаружения и исправления ошибок. Если сеть достаточно большая, то найти сбой бывает достаточно сложно, т.к. для этого необходимо знать топологию сети, но при наличии большого числа сетевых устройств топология может часто меняться (например, при отключении интерфейса, переподключении с одного интерфейса на другой и т.д.). Возникает проблема построения реальной топологии сети в любой момент времени. 3 1. ПОСТАНОВКА ЗАДАЧИ Целью данной работы была разработка набора программных средств, позволяющих анализировать топологию локальной сети на основе SNMP запросов таблиц MAC адресов управляемых свичей. Данная задача делится на три части: сбор информации; На этом этапе необходимо при помощи SNMP запросов получить таблицы MAC адресов управляемых свичей и соответствие для каждого свича его физического адреса и ip-адреса. Потом эти данные приводятся к некоторой удобной для дальнейшей обработки форме. анализ информации; Полученные на предыдущем этапе данные анализируются в соответствии с некоторым алгоритмом, после чего строится приблизительная топология сети. вывод полученных результатов. Полученная топология сети выводится в виде рисунка с помощью утилиты neato из Graphviz-win v2.18. 4 2. ТЕОРЕТИЧЕСКИЙ РАЗДЕЛ 2.1 Switch Сетевой коммутатор или свич (от англ. switch — переключатель) — устройство, предназначенное для соединения нескольких устройств компьютерной сети и коммутации данных на основе MAC-адресов. В отличие от хаба, который передает данные на все порты, свич передает данные только непосредственно на порт получателя. Это повышает производительность и безопасность сети. Свич хранит в памяти специальную таблицу MAC-адресов, в которой указывается к какому порту подключено сетевое устройство с определенным MAC-адресом. При первоначальном включении свича в сеть эта таблица пуста. Когда на какой-либо порт приходят пакет данных, свич определяет MAC-адрес получателя и ищет его в своей таблице, если находит – отправляет на соответствующий порт, иначе отправляет на все порты. При этом свич определяет MAC-адрес отправителя, и заносит его в таблицу. Т.к. множество сетевых устройств, подключенных к определенному порту свича, может изменяться (при отключении или переключении на другой интерфейс), необходимо каким-то образом корректировать таблицу MAC-адресов. Для этого у каждой записи в таблице есть специальный таймер. Когда на свич передается пакет с определенным MACадресом отправителя, таймер для соответствующей записи в таблице обнуляется. Если таймер достигает какого-то определенного значения (заданного конфигурацией свича), запись удаляется. 5 2.2 SNMP В конце 80-ых годов сеть Интернет стала достаточно большой и продолжала быстро развиваться, стали использоваться сетевые устройства разных производителей. В связи с этим появились проблемы, связанные с управлением сетью. Возникла необходимость в создании каких-либо универсальных стандартов управления, которые бы поддерживались всеми устройствами, независимо от производителя. В 1987 году сообщество IETF приняло решение создать упрощенный набор стандартов для управления в сети Интернет, который назвали Simple Network Management Protocol (SNMP). В дальнейшем предполагалось перейти на стандарты более высокого уровня, но от этой идеи отказались в связи с распространенностью и развитием SNMP. SNMP работает на 7 уровне модели OSI, уровне приложений, и использует протокол UDP (User Datagram Protocol) . Основные функции: осуществление обмена управляющей информацией между сетевыми устройствами; сбор информации о статусе и текущей конфигурации сетевых устройств; изменение конфигурации сетевых устройств. Можно выделить следующие элементы модели управления с использованием SNMP: управляющая станция: станция, с которой осуществляется управление сетью, чаще всего это рабочая станция администратора; агент управления: специальный модуль на сетевом устройстве, служащий для обработки SNMP запросов; база управляющей информации (MIB); протокол управления. Расскажем немного о MIB. Вся информация о сетевом устройстве хранится в базе управляющей информации (MIB Management Information Base). Обычно MIB представляют в виде дерева, каждому элементу которого соответствует уникальный численный и символьный идентификатор (OID - object identifier). Листами является набор параметров, определяющих текущую 6 конфигурацию и состояние устройства. Примерами таких параметров могут быть: количество портов, состояние интерфейса, версия оборудования, время жизни дейтограмм и т.д. Структура MIB описывается в SMI (Structure of Management Information – cтpуктуpа информации управления). Также SMI определяет некоторое подмножество стандартного языка OSI – ASN.1 (Abstract Syntax Notation One), с помощью которого описывается синтаксис MIB. Стандартной ветвью MIB, используемой для управления сетью, является ветвь iso(1).org(3).dod(6).internet(1).mgmt(2).mib-2(1), которая содержит информацию по следующим группам: система(1), интерфейсы(2), трансляция адресов(3), IP(4), ICMP(5), TCP(6), UDP(7), EGP(8), CMOT(9), передача(10), SNMP(11). Если какой-либо производитель или организация разрабатывают свой собственный набор переменных, он добавляется к MIB (после официальной регистрации) как поддерево в ветви iso(1).org(3).dod(6).internet(1).private(4).enterprise(1). Каждое сетевое устройство поддерживает стандарт MIB-II (ветвь 1.3.6.1.2.1) и MIB своего производителя. Для получения и установки значений переменных MIB на каждом сетевом устройстве есть специальный модуль, называемый агентом управления. Он получает SNMP пакеты и выполняет некоторые действия в зависимости от типа команды: GET – команды, предназначенные для получения значений переменных. Если агент получает команду такого типа, он в отклике возвращает значения запрашиваемых переменных, либо идентификатор ошибки в случае неудачи. SET – команды, предназначенные для конфигурирования сетевого устройства путем установки значений переменных MIB. Если агент получает команду такого типа, он пытается присвоить переменной соответствующее значение и посылает отклик GET управляющей станции, в котором содержится информация о состоянии или идентификатор ошибки в случае неудачи. Параметры MIB бывают двух видов: только для чтения (read-only): константы (версия оборудования) и переменные статистики (количество входящих пакетов). Для работы с ними возможно использование только команд GET. 7 для чтения и для записи(read-write): переменные, предназначенные для конфигурирования устройства (записи в таблице маршрутизации). Для работы с ними возможно использование команд GET и SET. Также существует особый тип команд TRAP, которые генерируется агентом на сетевом устройстве для уведомления управляющей станции об определенных событиях, таких как изменение состояния интерфейса, ошибка авторизации и др. Данный тип сообщения не требует ответа. 8 2.3 PERL PERL (Practical Extraction and Report Language) был разработан Ларри Уоллом (Larry Wall) в 1986 году, когда ему потребовалось создание отчетов на основе большого числа файлов с многочисленными перекрестными ссылками между ними. Стандартный фильтр awk, как оказалось, не мог управлять открытием и закрытием большого числа файлов на основе содержащейся в них же самих информации о расположении файлов. Тогда Ларри решил разработать язык программирования, который сочетал бы в себе возможности обработки текстовых файлов (sed), генерации отчетов (awk), решения системных задач (shell) и низкоуровневое программирование, доступное на языке С. Результатом этого решения и явился язык PERL, интерпретатор для которого был написан на С. Новый язык программирования сочетал в себе возможности системного администрирования и обработки файлов. В настоящее время это язык программирования высокого уровня, предназначенный для написания сценариев. Основные сферы применения: системное программирование; CGI-программирование; поддержка узлов Web; Основные особенности языка PERL: 1. это интерпретируемый язык программирования, т.е. написанные программы анализируются в момент их исполнения и не требуют предварительной компиляции (сборки). Интерпретатор perl отличается от традиционных интерпретаторов тем, что программа транслируется в промежуточный байт-код, и только после этого выполняется. В традиционных интерпретаторах каждый вводимый оператор интерпретируется и сразу же выполняется, что может приводить к синтаксическим ошибкам во время выполнения. Perl-программа свободна от этого "недостатка", так как все синтаксические ошибки обнаруживаются во время трансляции в байт-код. Таким образом, PERL сочетает в себе наилучшие элементы компилируемых программирования. 9 и интерпретируемых языков 2. является избыточным, т.е. для выполнения одной и той же задачи Perl предлагает несколько средств ее реализации. Разработчик может выбрать то, которое ему более понятно и которое ему проще применить, не тратя времени на изучение более сложных возможностей. К тому же в каждой конкретной ситуации одно из средств реализации может оказаться намного более подходящим, чем другие. 3. оптимизирован для просмотра содержимого текстовых файлов, выделения из них информации и генерирования отчетов на основе этой информации; 4. наличие огромного количества свободно распространяемых подключаемых пакетов и модулей дополнительных расширений возможностей Perl, включающих работу с многочисленными популярными системами управления базами данных, сетевыми ресурсами, различными протоколами и др. 5. интерпретаторы perl вместе с документацией по их установке и работе разработаны и свободно распространяются для различных платформ. 10 2.4 Graphviz-win Graphviz(Graph Visualization Software) – набор программ, предназначенный для представления какой-либо информации в виде схем, диаграмм, графов. Основные две утилиты: dot – предназанчена для рисования иерархических структур, ориентированных графов; neato – предназначена для рисования неориентированных графов. Для целей данной работы является наиболее подходящей. Исходными даными в простейшем случае является граф, заданный списком ребер, который описан в определенной форме в некотором файле. Также в этом файле могут быть установлены настройки отображения, такие как: длина ребер, цвет и форма узлов и т.д. Запускается программа либо из графической оболочки GVedit.exe, или из командной строки: neato.exe -Tgif -O graph.dot где опция –Tgif устанавливает тип файла, в котором сохраняется получаемое отображение (в данном случае .gif), опция –O <имя файла> указывает файл с исходными данными. Рассмотрим подробнее формат представления графа. Описание графа должно быть внутри блока graph G{ }. Настройка параметров ребер: edge [len = 1.5,color=red]; Настройка параметров узлов: node [shape=box]; для всех, для конкретного узла необходимо слово "node" заменить на соответствующее название узла. 11 Пример входного файла: graph G{ edge [len = 1.5]; #устанавка длины ребра "0.0.0.1.0.0" -- "hab_0.0.0.1.0.0_78"; "hab_0.0.0.1.0.0_78" -- "0.0.3.0.0.0"; "hab_0.0.0.1.0.0_78" -- "0.0.2.0.0.0"; "0.0.0.2.0.1"; [shape=box]; #установка формы узла(прямоугольник) "0.0.0.2.0.0" -- "0.0.0.2.0.1"; } Было решено компьютеры отображать в виде прямоугольников, свичи и хабы в виде эллипсов. Названиями являются mac-адреса, для хабов название содержит слово "hab_", потом идет mac-адрес свича и порт, к которому он подключен. 12 3. РЕШЕНИЕ 3.1 Сбор информации Предполагается, что нам известны ip-адреса свичей, и они записаны в файле "ip.txt" по одному в каждой строчке. Необходимо получить таблицы MAC-адресов, а также для каждого свича соответствие ip-адреса mac-адресу. Если использовать для этой цели perl-скрипт, то необходимо подключать дополнительные модули SNMP_Session.pm, BER.pm и SNMP_util.pm, которые обеспечивают удаленный доступ к агентам SNMP версий 1 и 2. Но поскольку задача сбора информации не является приоритетной для данной дипломной работы и служит в основном только для проверки корректности разработанного алгоритма, решено было воспользоваться утилитой Snmputil.exe и bat-скриптами. В результате были написаны два bat-скрипта: do.bat: for /f %%l in (ip.txt) do call snmp.bat %%l для каждой строчки из файла "ip.txt" запускает скрипт snmp.bat, передав ему в качестве параметра ip-адрес, содержащейся в ней; snmp.bat: Snmputil.exe walk %1 public .1.3.6.1.2.1.17.4.3.1.2 >%1 запускает Snmputil.exe с параметрами: ip-адрес свича (из переменной), "public" в качестве "строки сообщества" (community; определяет группу доступа, по сути является паролем), ".1.3.6.1.2.1.17.4.3.1.2" – oid (идентификатор объекта). Данный SNMP запрос возвращает таблицу MAC-адресов заданного свича и записывает ее в файл с названием таким же, как и ip-адрес, в формате: Variable = .17.4.3.1.2.0.0.14.37.23.243 Value = Integer32 78 Variable = .17.4.3.1.2.0.1.2.182.112.165 Value = Integer32 6 13 В первой строке ".17.4.3.1.2" – идентификатор объекта (без идентификатора стандартной ветви MIB-II ".1.3.6.1.2.1"), после которого идет MAC-адрес (в данном примере "0.0.14.37.23.243" и "0.1.2.182.112.165"). Во второй строке тип объекта (Integer32) и номер порта (в данном примере 78 и 6). Третья строка пустая. Расскажем немного об идентификаторе объекта(oid) .1.3.6.1.2.1.17.4.3.1.2. Этот объект принадлежит стандартной ветви MIB-II (.1.3.6.1.2.1)., подветви dot1dBridge(17), которая описывает управляемые объекты для мостов. Последние четыре числа в символьной записи означают: .dot1dTp(4). dot1dTpFdbTable(3). dot1dTpFdbEntry(2). dot1dTpFdbPort(1). Для сохранения arp-таблицы периодически выполняется команда: arp -a >> arptable в результате которой в файле "arptable" появляется информация о соответствии ip-адреса mac-адресу для различных устройств в сети в формате: Internet Address Physical Address Type 195.19.132.27 00-30-05-3f-de-fe dynamic 195.19.132.65 00-0a-e4-8c-42-e3 dynamic 195.19.132.66 00-50-8b-8b-6d-06 dynamic 195.19.132.130 00-04-76-a4-68-61 dynamic Таким образом, чтобы найти необходимый mac-адрес, достаточно найти строку, в которой содержится соответствующий ip-адрес. Замечания: формат возвращаемых значений SNMP запросов указан для ОС Windows, для других систем он может отличаться. Например, для Linux результат будет представлен в следующей форме: SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.14.37.23.243= INTEGER: 78 SNMPv2-SMI::mib-2.17.4.3.1.2.0.1.2.182.112.165= INTEGER: 6 14 Это различие не столь существенно, т.к. необходимые данные (mac-адрес и порт) извлекаются с помощью регулярного выражения, которое можно легко изменить, подстроив под нужный формат. Следует обратить внимание, что SNMP-запрос возвращает mac-адреса в десятичной системе счисления, в то время как в arp-таблице они в шестнадцатеричном виде. К тому же, используются разные символы-разделители: "." и "-". Следовательно, необходимо привести нужные mac-адреса к какому-либо общему формату. Например так (в качестве параметра передается ip-адрес): sub mac_from_ip{ my $ip = $_[0]; open (FA, "arptable.txt") || die "Can't open file arptable.txt\n"; while (<FA>){ if ($_=~/$ip/){ $_ =~/(([\dabcdef]+)-([\dabcdef]+)-([\dabcdef]+)-([\dabcdef]+)([\dabcdef]+)-([\dabcdef]+))/; if (defined $1){ my$m = hex($2).".".hex($3).".".hex($4).".".hex($5).".".hex($6).".".hex($7); close(FA); return $m; } } } close(FA); print "Can't find ip in arptable\n"; } Дальнейшее преобразование полученной информации в более удобный для обработки вид происходит в основном скрипте build_topology.pl. Для этого служит подпрограмма init. Для каждого ip-адреса из файла "ip.txt" она ищет файл с соответствующим именем и записывает его таблицу MAC-адресов в трехмерный хеш %switch, измерениями которого являются: MAC-адрес свича, номер порта, MAC-адрес устройства из таблицы. sub init { open (F, "ip.txt") || die "Can't open file ip.txt\n"; while (<F>) { chomp(); $_ = ~/(\d+.\d+.\d+.\d+)/; my $ip = $1; my $mac; my $port; my $i=1; my %p; open (F2, $ip) || die "Can't open file $ip \n"; while (<F2>) { chomp(); 15 if ($_ eq "End of MIB subtree."){last;} if ($i % 3 == 1) { $_ =~/.\d+.\d+.\d+.\d+.\d+.(\d+.\d+.\d+.\d+.\d+.\d+)/; $mac = $1; }elsif ($i % 3 == 2) { $_ = /Value = Integer32 (\d+)/; $port = $1; if (exists $p{$1}) { my %sw = %{$p{$1}}; $sw{$mac} = 1; $p{$1} = \%sw; }else { my %s; $s{$mac} = 1; $p{$1} = \%s; } } $i++; } $switch{(mac_from_ip($ip))} = \%p; close(F2); } close(F); } После этого подпрограмма build_hesh строит хеш %hesh_sw, в котором ключами являются mac-адреса свичей, а значениями "1" или "2". Данный хеш используется в двух случаях. Во-первых, для того чтобы определить по mac-адресу сетевого устройства является ли оно свичем. Во-вторых, в алгоритме построения топологии: значение "2" элемента хеша означает, что соответствующий свич помечен как пройденный. 16 3.2 Обработка информации На предыдущем этапе были получены все необходимые данные. Теперь нужно их обработать в соответствии с алгоритмом, изложенным ниже. Алгоритм основывается на нескольких утверждениях: 1. Предполагается, что в сети нет циклов и у каждого свича в таблице MAC-адресов присутствуют все другие свичи, т.к. в противном случае однозначное построение топологии невозможно. Тогда сеть можно представить в виде дерева, причем за корень дерева можно принять любой свич. 2. Пусть два свича соединены напрямую: S2 S1 P1 P2 Рис. 3.1 тогда множества mac-адресов на порту p1 и p2 не пересекаются. Из предположения, что в сети нет циклов, следует, что для любых двух свичей существует единственный путь, их соединяющий. Тогда ребро (p1,p2) соединяет два непересекающихся поддерева с корневыми элементами S1 и S2. На порт p1 могут приходить данные только из поддерева с корнем S2, а на порт p2 – из поддерева с корнем S1. 3. Пусть два свича соединены через хаб: S1 HUB S2 Другие устройства Рис. 3.2 Используя предыдущее утверждение, делаем вывод, что пересечением множеств macадресов на порту p1 и p2 будут являться mac-адреса "других устройств". 17 3.3 Алгоритм Выберем какой-нибудь свич S1 и начнем обход по каждому его порту. Пусть первый порт p1. Проверим какие mac-адреса привязаны к p1. Возможны несколько вариантов: 1. один mac-адрес, причем не свича. Считаем, что к данному порту свича напрямую подключен один компьютер. PC1 S1 Рис. 3.3 2. несколько mac-адресов, но среди нет свича. Считаем, что к данному порту напрямую подключен хаб, соединенный с несколькими компьютерами. PC1 PC2 HUB S1 PC3 Рис. 3.4 3. несколько mac-адресов, причем среди них ровно один свич S2. Ищем у S2 порт, к которому привязан S1. Допустим это p2. Рассмотрим пересечение множеств macадресов привязанных к p1 и p2. Возможны два случая: a. пересечение пустое; Следовательно, к S1 подключен напрямую только S2. Все остальные устройства подключены уже к S2. S2 S1 Рис. 3.5 18 b. пересечение не пустое; Считаем, что к данному порту напрямую подключен хаб, соединенный с S2 и компьютерами, входящими в пересечение. S2 S1 HUB PC2 PC3 Рис. 3.6 4. несколько mac-адресов, причем среди них больше одного свича. Ищем у каждого свича порт p*, к которому привязан S1. Рассматриваем попарные пересечения множеств mac-адресов привязанных к p* и p1. Возможны два случая: a. существует пустое пересечение; К p1 напрямую подключен свич, с портом которого получено пустое пересечение, все остальное соединяется уже через него. S2 S1 Рис. 3.7 b. все пересечения не пустые; Ищем общее пересечение M. Считаем, что к p1 напрямую подключен хаб, соединенный со всеми свичами из M и компьютерами, mac-адреса которых привязаны к p*. S2 S1 HUB PC1 S3 Рис 3.8 19 В результате получаем некоторый участок сети. Затем помечаем свич S1 как пройденный и запускаем алгоритм для всех подключенных к нему свичей (в случаях 3-5). Получается что-то похожее на рекурсивый обход дерева. После того как обошли все доступные с S1 устройства, проверяем, остались ли непомеченные свичи, если да, то запускаем алгоритм для них. Такая ситуация возможна, если исходная информация будет неполной, тогда топология сети будет состоять из нескольких непересекающихся участков. 20 ЗАКЛЮЧЕНИЕ В ходе дипломной работы был разработан алгоритм построения топологии сети, а также написан скрипт на языке PERL, моделирующий его работу. При запуска скрипта на реальных данных были получены результаты, доказывающие правильность разработанного алгоритма. Также были даны некоторые пояснения и советы для дальнейшей доработки до готового к использованию программного продукта. 21 СПИСОК ЛИТЕРАТУРЫ 1. Гук М. Аппаратные средства локальных сетей – СПБ.: Питер, 2000. 2. Таненбаум Э. Компьютерные сети - СПБ.: Питер, 2007. 3. 4. http://ru.wikipedia.org 5. 22 ПРИЛОЖЕНИЯ Приложение 1. Условные обозначения OC – операционная система ПО - программное обеспечение PERL - Practical Extraction and Report Language 23 Приложение 2. Результаты Пример изображения топологии сети. Рис. П.1 24