Skip to content

Парсинг логов tcpdump – как собрать статистику трафика на Linux, FreeBSD

 

Взял отсюда - http://wifix.ru/docs/parse_tcpdump

Для сбора статистики можно воспользоваться утилитой tcpdump. Для начала запустим screen, поскольку ей придется работать все время, пока логируется трафик.

Мы можем записывать весь трафик, если не знаем, что конкретно ищем:

tcpdump -w /tmp/tcpdump.log &

Или изначально отфильтровать его по каким-то параметрам, чтобы сократить объем анализируемых данных:

tcpdump -w /tmp/tcpdump.log dst 90.156.150.254 & # логируем весь трафик, направляемый на 90.156.150.254
tcpdump -w /tmp/tcpdump.log src 90.156.150.254 & # логируем весь трафик, отправляемый с 90.156.150.254
tcpdump -w /tmp/tcpdump.log host 90.156.150.254 & # логируем весь трафик с и на 90.156.150.254
tcpdump -w /tmp/tcpdump.log port 80 & # логируем весь трафик с и на 80 порт

Подождем какое-то время, чтобы набралась информация.

Допустим, нас интересуют только: время, объем, адрес отправителя, порт отправителя, адрес получателя и порт получателя пакета. Отформатируем данные с помощью Perl и получаем файл в нужном нам формате (traffic.log):

tcpdump -r /tmp/tcpdump.log -e -tt -nn | perl -pe 's/([0-9]*)\..*length\s([0-9]*):\s((?:\d+\.){3}\d+)\.(\d+)\s>\s((?:\d+\.){3}\d+)\.(\d+).*/$1 $2 $3 $4 $5 $6/' > traffic.log

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

timestamp size src_ip src_port dst_ip dst_port
1320240877 511 89.108.109.107 80 90.156.150.254 60605
1320240876 68 87.242.65.204 24696 90.156.150.254 22
1320240875 68 89.108.109.107 80 90.156.150.254 60605
1320240875 116 87.242.65.204 24696 90.156.150.254 22
1320240878 68 87.242.65.204 24696 90.156.150.254 22
1320240878 68 87.242.65.204 24696 90.156.150.254 22
1320240873 72 217.16.22.12 53 90.156.150.254 41775
1320240872 90 217.16.22.12 53 90.156.150.254 56838
1320240872 88 217.16.22.12 53 90.156.150.254 60901

Далее есть два пути - вы можете анализировать его при помощи textutils (те же awkgrep и sort) или загнать в базу MySQL, что предпочтительнее на больших объемах данных.

Заведем в MySQL базу данных и создадим в ней такую таблицу:

CREATE TABLE `traffic` ( `unixtime` int(10) unsigned NOT NULL, `size` int(10) unsigned NOT NULL, `src_ip` char(15) NOT NULL, `src_port` int(5) unsigned NOT NULL, `dst_ip` char(15) NOT NULL, `dst_port` int(5) unsigned NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1

Затем загрузим в нее наши данные:

mysqlimport –local –fields-terminated-by=» » traffic ./traffic.log

И можно приступать к анализу.

Например:

Дата и время первой записи в собранных нами данных:

SELECT FROM_UNIXTIME(`unixtime`) FROM `traffic` ORDER BY `unixtime` ASC LIMIT 1;

Дата и время последней записи в собранных нами данных:

SELECT FROM_UNIXTIME(`unixtime`) FROM `traffic` ORDER BY `unixtime` DESC LIMIT 1;

Суммарнный трафик:

SELECT SUM(`size`)/1024/1024 FROM `traffic`;

Получим список IP-адресов, которые отправляли нам трафик и запишем его в файл:

echo 'SELECT DISTINCT `src_ip` FROM `traffic` ORDER BY `src_ip`' | mysql -bN traffic | tee ip_list.txt

Узнаем, кто из этого списка отправлял нам больше всего трафика, мегабайты:

for i in `cat ip_list.txt`; do echo «SELECT \`src_ip\`, SUM(size)/1024/1024 FROM \`traffic\` WHERE \`src_ip\`=\»$i\»» | mysql -bN traffic; done | sort -grk 2 | tee ip-traf.txt | head -5

213.247.217.196 2962.77730083
89.108.109.107 258.25431156
87.249.11.138 70.06125736
217.16.22.12 14.94259071
89.175.164.21 12.19839001

С какого порта был передан этот трафик?

mysql> select distinct `src_port` from traffic where `src_ip`='213.247.217.196' order by src_port;
+———-+
| src_port |
+———-+
| 80 |
+———-+
1 row in set (0.00 sec)

На какой порт был передан этот трафик?

mysql> select distinct `src_port`, `dst_port` from traffic where `src_ip`='213.247.217.196';
+———-+———-+
| src_port | dst_port |
+———-+———-+
| 80 | 35011 |
| 80 | 35024 |
| 80 | 35038 |
| 80 | 35044 |
| 80 | 35047 |

10 rows in set (0.03 sec)
+———-+———-+
16717 rows in set (0.00 sec)

Теперь мы видим, что что-то с нашего сервера скачивает к себе данные с узла 213.247.217.196 по HTTP.

Узнав это, по логу tcpdump мы можем посмотреть, какие данные передавались с/на него (полезно если это незашифрованныйHTTP или почтовый трафик).

Посмотрим содержимое первых 3 пакетов с этого адреса:

tcpdump -r /tmp/tcpdump.log -A -e -с 3 src 213.247.217.196

17:34:39.686170 In ethertype IPv4 (0x0800), length 60: host-196.AVTOLOG.213.247.217.192.0xfffffff8.macomnet.net.http >www.jeeponline.ru.35011: S 977256998:977256998(0) ack 1534035549 win 8190 <mss 1460> E..,..@… …..Z….P..:?.&[o.]`…o{……
17:34:39.850999 In ethertype IPv4 (0x0800), length 1516: host-196.AVTOLOG.213.247.217.192.0xfffffff8.macomnet.net.http > www.jeeponline.ru.35011: . 1:1461(1460) ack 669 win 64240 E…C.@.{…….Z….P..:?.'[o..P…….HTTP/1.1 200 OK Cache-Control: private,
17:34:39.851152 In ethertype IPv4 (0x0800), length 1516: host-196.AVTOLOG.213.247.217.192.0xfffffff8.macomnet.net.http > www.jeeponline.ru.35011: . 1461:2921(1460) ack 669 win 64240 E…C.@.{…….Z….P..:?..[o..P….4..tionId>1</DestinationId><DestinationLogo%%

Мы явно видим, что по HTTP передается какие-то данные в XML или XML-подобном формате. Если посмотреть чуть побольше пакетов, то можно найти запрашиваемые файлы, по именам которых прогрепать скрипты сайтов клиента и узнать какие скрипты на нашем сервере могут выполнять эти запросы.

Leave a Reply

Your email address will not be published. Required fields are marked *

π