Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







ПРОГРАМНАЯ РЕАЛИЗАЦИЯ ПАКЕТНОГО ФИЛЬТРА





 

Модифицируем код функции getsock_recv(), подключив к создаваемому сокету

фильтр. Подключаемый фильтр описывает следующая структура (см. <linux/filter.h>):

 

struct sock_fprog

{

unsigned short len; /* Number of filter blocks */

struct sock_filter *filter;

};

 

Здесь struct sock_filter *filter - это программа фильтрации, представляющая собой массив структур struct sock_filter.

 

Перед тем, как составлять программу фильтрации, определим условия фильтрации: принимать пакеты IP протокола, адрес отправителя - 192.168.1.2, транспортный протокол - TCP, порт - telnet.

 

При составлении программы фильтрации воспользуемся следующими макроопределениями (см. <linux/filter.h>):

 

#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k }

#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k }

 

/*

* Листинг 5. Программа фильтрации

*/

 

struct sock_fprog Filter;

struct sock_filter BPF_code[] = {

 

/*

* В принятом Ethrnet-кадре по смещению, равному 12 байт (6 байт MAC-адреса

* отправителя + 6 байт MAC-адреса получателя) находится 2-х байтовый

* идентификатор протокола сетевого уровня. Эти 2 байта мы загружаем в

* аккумулятор

*/

BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),

 

/*

* Проверяем соответствие значения, загруженного в аккумулятор, идентификатору

* IP протокола (ETH_P_IP). При выполнении условия равенства этих значений

* переходим к следующей инструкции (jt = 0). В противном случае смещаемся

* на 8 инструкций вниз (jf = 8) и выходим из программы фильтрации с возвратом

* нулевого значения

*/

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, ETH_P_IP, 0, 8),

 

/*

* Загружаем в аккумулятор 4-х байтовое значение, находящееся по смещению 26

* в принятом пакете. Это значение соответствует IP адресу источника

*/

BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),

 

/*

* Проверяем соответствие значения, загруженного в аккумулятор, IP адресу



* 192.168.1.2, в шестнадцатеричном представлении - 0xC0A80102. В сетевом

* формате этот адрес выглядит как 0x0201A8C0. Это связано с порядком передачи

* данных в сети - передача начинается с байта младшего разряда. Если адреса не

* совпали - выходим из программы фильтрации

*/

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, 0xC0A80102, 0, 6),

 

/*

* Загружаем в аккумулятор 1 байт, находящийся по смещению 23. Этот байт

* содержит идентификатор протокола транспортного уровня

*/

BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, IPPROTO_TCP, 0, 4),

 

/*

* Определяем длину IP заголовка

*/

BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, ETH_HLEN),

 

/*

* Значение длины IP заголовка загружено в индексный регистр. Порт источника

* находится по смещению, определяемому суммой длин IP и Ethernet заголовков

*/

BPF_STMT(BPF_LD+BPF_H+BPF_IND, ETH_HLEN),

 

/*

* Проверяем значение порта источника

*/

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, 0x17, 0, 1),

BPF_STMT(BPF_RET+BPF_K,1500),

BPF_STMT(BPF_RET+BPF_K,0),

};

 

Программа фильтрации готова. Заполняем поля структуры struct sock_fprog Filter и подключаем фильтр к сокету:

 

Filter.len = 11; // количество структур в массиве BPF_code

Filter.filter = BPF_code;

 

setsockopt(sd, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(struct sock_fprog));

 

В приведенном примере есть существенный недостаток - исходные данные для

фильтрации (IP адрес и порт) вводятся непосредственно в текст программы.

 

Модифицируем функцию getsock_recv() для возможности гибкой настройки на новые условия фильтрации. Параметры фильтрации - IP адрес и порт - будут передаваться из главной функции. Прототип функции getsock_recv() принимает следующий вид:

 

int getsock_recv (int, __u8 *, int)

 

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

В массиве BPF_code третий и восьмой элементы перепишем в следующем виде:

 

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, 0, 0, 6), // 3-й элемент

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, 0, 0, 1), // 8-й

 

Здесь константы, содержащие значение IP адреса и порта, обнулены.

Заполним их значениями, переданными из главной функции:

 

BPF_code[3].k = __swab32(inet_addr(ip_addr));

BPF_code[8].k = port;

 

Строковое значение IP адреса мы преобразуем в сетевой формат, а затем при помощи макроопределения __swab32 (см. файл <linux/byteorder/swab.h>) меняем местами байты - нулевой с третьим, второй с первым.

 

В итоге функция getsock_recv() будет выглядеть следующим образом:

 

/*

* Листинг 6. Функция создания пакетного сокета и подключения

* пакетного фильтра (файл getsock_recv.c)

*/

 

#include <sys/socket.h>

#include <linux/types.h>

#include <linux/in.h>

#include <linux/if_ether.h>

#include <linux/if_packet.h>

#include <linux/filter.h>

#include <linux/byteorder/swab.h>

 

int getsock_recv (int index, __u8 *ip_addr, int port)

{

int sd;

 

struct sockaddr_ll s_ll;

struct sock_fprog Filter;

struct sock_filter BPF_code[] = {

BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, ETH_P_IP, 0, 8),

BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, 0, 0, 6),

BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, IPPROTO_TCP, 0, 4),

BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, ETH_HLEN),

BPF_STMT(BPF_LD+BPF_H+BPF_IND, ETH_HLEN),

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_IMM, 0, 0, 1),

BPF_STMT(BPF_RET+BPF_K,1500),

BPF_STMT(BPF_RET+BPF_K,0),

};

 

sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

if(sd < 0) return -1;

 

memset((void *)&s_ll, 0, sizeof(struct sockaddr_ll));

 

s_ll.sll_family = PF_PACKET;

s_ll.sll_protocol = htons(ETH_P_ALL);

s_ll.sll_ifindex = index;

 

if(bind(sd, (struct sockaddr *)&s_ll, sizeof(struct sockaddr_ll)) < 0) {

close(sd);

return -1;

}

 

BPF_code[3].k = __swab32(inet_addr(ip_addr));

BPF_code[8].k = port;

 

Filter.len = 11;

Filter.filter = BPF_code;

 

if(setsockopt(sd, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(struct sock_fprog))<0) {

perror("SO_ATTACH_FILTER");

close(sd);

return -1;

}

 

return sd;

}

 

 

Осталось внести именения в главную функцию (полный текст не приводится):

 

int main(int argc, char **argv)

{

 

/* Определения переменных */

....

 

if(argc != 3) {

perror("argc");

return -1;

}

 

/* Определение параметров интерфейса и отображение результатов */

....

 

/* Получение дескриптора пакетного сокета */

 

if((eth0_if = getsock_recv(ifp.index, argv[1], atoi(argv[2]))) < 0) {

perror("getsock_recv");

return -1;

}

 

/* Цикл приема пакетов и отображения результатов */

....

}

 

 

При запуске анализатора в командной строке задаются параметры - IP адрес отправителя и порт.

 

Составление программы фильтрации можно существенно упростить, если воспользоваться услугами tcpdump. Например, составим программу фильтрации, принимающую пакеты, источником которых является хост 192.168.1.1, транспортный протокол - TCP, порт - 23. Вводим команду:

 

tcpdump -dd src 192.168.1.1 and tcp src port 23

 

Получаем в ответ:

 

{ 0x28, 0, 0, 0x0000000c },

{ 0x15, 0, 10, 0x00000800 },

{ 0x20, 0, 0, 0x0000001a },

{ 0x15, 0, 8, 0xc0a80101 },

{ 0x30, 0, 0, 0x00000017 },

{ 0x15, 0, 6, 0x00000006 },

{ 0x28, 0, 0, 0x00000014 },

{ 0x45, 4, 0, 0x00001fff },

{ 0xb1, 0, 0, 0x0000000e },

{ 0x48, 0, 0, 0x0000000e },

{ 0x15, 0, 1, 0x00000017 },

{ 0x6, 0, 0, 0x00000060 },

{ 0x6, 0, 0, 0x00000000 },

 

Это и есть искомая программа фильтрации.

ГЛАВА 3. ЭКОНОМИЧЕСКОЕ ОБОСНОВАНИЕ

Разработка плана работы заняло 25 часов и было потрачено 100$.

Для данной дипломной работы производился сбор данных, которое заняло 50 часов.

На разработку протокола анализатора локальной сети было потрачено 20 рабочих дней и заняло это всё 160 часов и было потрачено 1000$.

Было использована 2 компьютера и локальная сеть предприятия.

В итоге затраты на данный проект по разработке протокола анализатора заняло 2100$ и было потрачено 135 часов рабочего времени.

 

 

ЗАКЛЮЧЕНИЕ

В данной работе рассмотрен вопрос разработки протокола анализатора. Актуальность данной работы обусловлена тем, что в связи с распространением персональных компьютеров и созданием на их основе автоматизированных рабочих мест (АРМ), возросло значение проблемы технологий передачи данных между вычислительными системами. В настоящее время практически каждая организация имеет свою локальную вычислительную сеть, а фирмы, имеющие многочисленную филиальную сеть, сталкиваются с проблемами отслеживание трафика.

Поставленная в работе цель разработать протокол анализатор локальной сети.

Для достижения поставленной цели в процессе выполнения работы были решены следующие задачи:

· произведен анализ предметной области;

· проведен анализ прикладных задач, использующих сетевые технологии;

· разработан протокола анализатора локальной сети;

· подведены итоги работы.

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

 

СПИСОК ЛИТЕРАТУРЫ

 

1. Сети VPN и MPLS – технологии. [Электронный ресурс]. Режим доступа: http://www.lessons-tva.info/archive/nov030.html

2. VPN-маршрутизаторы. [Электронный ресурс]. Режим доступа: http://www.tp-linkru.com/products/biz-list-4909.html

3. Бройдо В. Л., Ильина О. П. Вычислительные системы, сети и телекоммуникации. – М.: Радио и связь, 2011. - 560 c.

4. Ги, К. Введение в локальные вычислительные сети; М.: Радио и связь - Москва, 2011. - 176 c.

5. Епанешников А. М., Епанешников В. А. Локальные вычислительные сети; М.: Диалог-МИФИ, 2013. - 224 c.

6. Колбин Р. В. Глобальные и локальные сети. Создание, настройка и использование. М.: Бином. Лаборатория знаний, 2011. - 815 c.

7. Колбин Р. В. Глобальные и локальные сети. Создание, настройка и использование (+ CD). М.: Бином. Лаборатория знаний, 2012. - 224 c.

8. Ларионов А.М.; Майоров С.А.; Новиков, Г.И. Вычислительные комплексы, системы и сети. М.: Энергоатомиздат, 2014. - 288 c.

9. Мелехин В. Ф., Павловский Е. Г. Вычислительные системы и сети. М.:Академия, 2013. - 208 c.

10. Олифер В., Олифер Н. Компьютерные сети. Принципы, технологии, протоколы; СПб.: Питер, 2013. - 944 c.

11. Поляк-Брагинский А. Локальные сети. Модернизация и поиск неисправностей. СПб.: БХВ-Петербург, 2012. - 832 c.

12. Ботт Эд, Зихерт Карл Локальные сети и безопасность Microsoft Windows XP. Inside Out (+ CD-ROM). – М.: Эком, 2010. - 944 c.

13. Пятибратов А. П., Гудыно Л. П., Кириченко А. А. Вычислительные системы, сети и телекоммуникации. М.: Инфра-М, 2014. - 736 c.

14. Расстригин Л.А. Вычислительные машины, системы, сети. М.: Наука, 2011. - 224 c.

15. Столлингс Вильям Компьютерные сети, протоколы и технологии Интернета; СПб.: БХВ-Петербург, 2011. - 832 c.

16. Флинт Д. Локальные сети ЭВМ: архитектура, принципы построения, реализация; М.: Финансы и статистика, 2013. - 359 c.

17. Фролов А.В.; Фролов, Г.В. Локальные сети персональных компьютеров. Использование протоколов IPX, SPX, NETBIOS; М.: Диалог-Мифи, 2013 - 160 c.

18. Хорев П.Б. Программно-аппаратная защита информации. – М.: Форум, 2011. – 352 с.









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2019 zdamsam.ru Размещенные материалы защищены законодательством РФ.