Китаев А.Е. (Kitaev_A_E сбчк mail.ru)
Описание семейства программ sniffxx для перехвата
заголовков IP пакетов с целью их дальнейшей
статистической обработки.
Программы используют библиотеку pcap и созданную мной библиотеку libKA (там размещены оригинальные функции для обработки строк, списков и др.).
Компилировались и запускались под управлением операционной системы Linux ( Red Hat 7.3 ).
Первое приложение - sniff91
Компиляция происходит так (приведу командную строку):
gcc o sniff91 sniff91.c lpcap L. libKA
Запуск на выполнение такой:
./sniff91 eth0 ./RES_0101
Здесь «eth0» - это прослушиваемый интерфейс. Если мы хотим контролировать, кто сколько скачивает байт из интернета, то программу имеет смысл запускать на Linux-маршрутизаторе, через который происходит выход в Интернет. Программы испытывалась на компьютере с ОС Linux (Red Hat 7.3 ), был настроен маскарад через iptables (или SNAT). «eth0» - это интерфейс, который был подсоединен к свичу, к этому же свичу подходили кабели и от других компьютеров локальной сети. То-есть, прослушивался тот интерфейс, который подсоединен к локальной сети.
«RES_0101» - это имя файла, в который будут записываться заголовки пакетов. Это текстовый файл (в формате UNIX, т.е. каждая строка заканчивается байтом 10). Каждая строка состоит из ряда полей (т.е. слов фактически), разделенных пробелами.
1-е поле: дата пакета (напр. 29.01.2007)
2-е поле: время пакета (например 21:31:54)
3-е поле: длина пакета (количество байт)
4-е поле: IP-адрес источника (напр. 192.168.0.70 ).
5-е поле IP-адрес получателя
6-е поле номер (код) протокола (6 это TCP, 17 это UDP и т.д.)
7-е поле текстовая расшифровка протокола (или TCP, или UDP, или OTHER если другой протокол).
Если протокол TCP, то есть еще 2 поля:
8-е поле: порт источника
9-е поле порт получателя.
Кроме всего этого была замечена одна тонкость. Некоторые перехватываемые пакеты имели явно неправильный вид. В них присутствовало что-то похожее на IP-адреса, но они были сдвинуты в другие поля. По признаку равенства поля версии четырем (смотрите литературу о полях заголовков IP-пакетов) производилась фильтрация, и в случае, если поле версии не равнялось 4, в строку записывались дата и время, как и для обычных пакетов, а дальше шло (после пробела) «strange wrong IP4 packet STRANGE».
Вот кусок этого файла с результатами перехвата:
29.01.2007 21:31:54 strange wrong IP4 packet STRANGE
29.01.2007 21:31:54 strange wrong IP4 packet STRANGE
29.01.2007 21:31:54 57 192.168.1.10 195.122.226.1 17 UDP
29.01.2007 21:31:54 276 195.122.226.1 192.168.1.10 17 UDP
29.01.2007 21:31:54 48 192.168.1.10 194.67.57.26 6 TCP 1034 80
29.01.2007 21:31:54 44 194.67.57.26 192.168.1.10 6 TCP 80 1034
29.01.2007 21:31:54 40 192.168.1.10 194.67.57.26 6 TCP 1034 80
29.01.2007 21:31:54 716 192.168.1.10 194.67.57.26 6 TCP 1034 80
29.01.2007 21:31:54 40 194.67.57.26 192.168.1.10 6 TCP 80 1034
29.01.2007 21:31:54 1500 194.67.57.26 192.168.1.10 6 TCP 80 1034
29.01.2007 21:31:55 40 192.168.1.10 194.67.57.26 6 TCP 1034 80
При работе программы на экран выводится номер пакета (эти номера, естественно, мелькают очень быстро). Прерывается работа программы нажатием Ctrl-C.
Второе приложение - sniff92
Компиляция и запуск на выполнение происходят также. Но при выводе в файл происходит определенная фильтрация. Во-первых отбрасываются «неправильные» пакеты (которые раньше помечались как strange в 3-м поле см.выше). Во-вторых контролируется адрес получателя, и в файл пишутся лишь пакеты, где у получателя первое число адреса есть 192, а второе 168. Также откидывается время пакета (таким образом 2-е поле в каждой строке это уже длина пакета).
Вот кусок выходного файла:
16.03.2007 68 192.168.0.1 192.168.0.70 6 TCP 22 1184
16.03.2007 40 192.168.0.70 192.168.0.1 6 TCP 1184 22
16.03.2007 68 192.168.0.1 192.168.0.70 6 TCP 22 1184
16.03.2007 68 192.168.0.1 192.168.0.70 6 TCP 22 1184
16.03.2007 40 192.168.0.70 192.168.0.1 6 TCP 1184 22
16.03.2007 68 192.168.0.1 192.168.0.70 6 TCP 22 1184
Третье приложение - sniff93
Компиляция и запуск на выполнение происходят также. Но здесь все таки пишется время пакета (решено не экономить 1/6 часть файла или даже менее). Кроме того выходной файл есть текстовый файл в формате DOS (каждая строка заканчивается на байты 13,10).
Четвертое приложение - sniff94
То же, что и sniff93, но исключен вывод времени.
/////////////////////////////////////////////////
В качестве «промышленного» варианта (на работе) запускался sniff94:
./sniff94 eth1 ./RES_0101
(это на работе). При большой нагрузке (в сети около 100 компьютеров, имеющих доступ к Интернет, ежедневно скачивается с Интернета более 1Г ) файл растет примерно на 1Мб в минуту. Торможения доступа к Интернету практически не заметно.