V6NET.RU

+ НАЧАЛО - НАЧАЛО

+ РАЗДАЧА АДРЕСОВ - РАЗДАЧА АДРЕСОВ

+ СБОР СТАТИСТИКИ - СБОР СТАТИСТИКИ

+ ДЕТАЛИ - ДЕТАЛИ

+ СПРАВОЧНАЯ - СПРАВОЧНАЯ

Сбор IPv6 статистики с помощью Netflow

Логи нужно хранить за последние три года… анализировать трафик тоже приходится… Словом, без статистики не обойтись.

Вот, пытаемся сделать учет IPv6-трафика с использованием NetFlow. Стандартная схема: сенсоры — это роутеры Cisco, коллекторы работают под *BSD.

Настройка первого сенсора.

В соответствии с «фирменной» документацией, поддержка Netflow для IPv6 появилась в версиях Cisco IOS, начиная с 12.2(33), правда в некоторых источниках упоминается, что на самом деле это началось с 12.4(20). То есть лучше всего заранее проверить, есть ли такая возможность в установлнных IOS-ах.

Итак, начинаем с 7206, версия 12.4(24). Вообще-то там была 12.4(15), но по совету друзей мы сделали апгрейд.

Набор команд, которыми нужно пользоваться, не так уж и велик:

ipv6 cef

(без этого не работает NetFlow)

ipv6 flow-export version 9

в 5й версии нет IPv6

ipv6 flow-export destination 192.168.123.45 9876

(аналогично 4й версии протокола)

Вся прелесть — в последней команде: можно отправлять v4 и v6 трафик на один коллектор, но на разные порты, чтобы складывать его в разные файлы — это очень удобно для анализа, особенно в начале работы. А также можно отправлять коллектору статистику раздельно: используя NetFlow5 для IPv4 и NetFlow9 для IPv6, что мы и сделали. А еще прикольно то, что отправка статистики по IPv6 осуществляется только на IPv4-адрес коллектора. Без вариантов!

Кстати, команда ipv6 flow-export version 9 в конфигурационном файле не появилась, так как 9 версия используется по-умолчанию.

Ну, и на нужных интерфейсах следуеть дать команды

ipv6 flow ingress

ipv6 flow egress

или одну, или обе — вопрос вашей схемы учета.

Затем можно наблюдать за результатами: для начала убеждаемся, что статистика по IPv4 продолжает отправляться, а затем смотрим, идет ли процесс сбора статистики по IPv6.

gw-0#sh ipv6 flow export

Flow export v9 is enabled for main cache
VRF ID : Default
Destination(1)  192.168.123.45 (9876)
Version 9 flow records
2194545377 flows exported in 216329615 udp datagrams
16 flows failed due to lack of export packet
0 export packets were sent up to process level
0 export packets were dropped due to no fib
0 export packets were dropped due to adjacency issues
0 export packets were dropped due to fragmentation failures
0 export packets were dropped due to encapsulation fixup failures


Судя по всему, процесс идет. Смотрим дальше:

gw-0#sh ipv6 flow cache

IP packet size distribution (400031 total packets):
1-32   64   96  128  160  192  224  256  288  320  352  384  416  448  480
.000 .238 .449 .074 .130 .052 .025 .007 .004 .002 .000 .000 .000 .000 .000
- 512  544  576 1024 1536 2048 2560 3072 3584 4096 4608
- .000 .000 .000 .011 .000 .000 .000 .000 .000 .000 .000
IP Flow Switching Cache, 475168 bytes
37 active, 4059 inactive, 354077 added
7063749 ager polls, 0 flow alloc failures
Active flows timeout in 30 minutes
Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 33928 bytes
0 active, 1024 inactive, 0 added, 0 added to flow
0 alloc failures, 0 force free
1 chunk, 1 chunk added
SrcAddress                              InpIf    DstAddress                              OutIf    Prot SrcPrt DstPrt Packets
2001:987:6::2                           Gi0/1    2Axx:yyyy:0:A::123:1                    Gi0/0    0x11 0x0035 0x40C3 1 

…и много-много подобных строк…

Ура! Процесс пошел! Можно переходить к коллектору!

Настройка второго сенсора.

А тут подстерегала неудача — несмотря на IOS 12.4(24), команд для конфигурирования NetFlow для IPv6 там не оказалось. Будем разбираться..

Настройка первого коллектора.

Сейчас сбор данных IPv4-NetFlow5 идет на машине под ОС FreeBSD при помощи пакета flow-tools. Пакет хороший, стабильно работающий, но очень старый, и разработчики давным-давно перестали обновлять его. Начинаем искать замену.

Наибольшее число положительных отзывов приходится на пакет flowd. С нашей точки зрения, у него есть несомненные плюсы:

Устанавливаем его. В конфигурационном файле нужно прописать ip-адреса и порты, с которых будет приниматься трафик, а также путь к файлу, куда будет записываться статистика. Кстати, директории на пути к файлу должны существовать, так как пакет не умеет создавать их. И, естественно, flowd должен иметь право записи в этом месте. Для запуска flowd достаточно этих опций.

Перед запуском при помощи tcpdump убеждаемся, что пакеты со статистикой поступают на машину:

# tcpdump -n -i em0 port 9876

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em0, link-type EN10MB (Ethernet), capture size 96 bytes
23:17:20.448271 IP 192.72.2.3.53515 > 192.168.1.2.9876: UDP, length 1416
23:17:32.448893 IP 192.72.2.3.53515 > 192.72.1.2.9876: UDP, length 1244


Вроде работает.. Запускаем flowd:

/usr/local/sbin/flowd -f <path_to_config_file>

Для отладки есть два ключа: -d (генерировать вспомогательную информацию) и -g (не переходить в фоновый режим) . В результате файл со статистикой появился и начал расти.

В отличие от flow-tools здесь нет «естественного» механизма ротации файлов, но в мануале сказано, что при получении сигнала SIGUSR1 происходит закрытие файла с логом и открытие его заново. Это свойство позволяет написать несложный скрипт, который осуществляет ротацию файлов. Вообще-то, достаточно трех строк:

DATE=date +%Y%m%d%-H%M%S

mv /opt/netflow6/gw-core/ipv6-flow /opt/netflow6/gw-core/$DATE-ipv6-flow

kill -SIGUSR1 cat /var/run/flowd.pid

Осталось только сделать вызов такого скрипта из cron с заданным интервалом. По аналогии с flow-tools делаем интервал равным 15 мин.

Просматриваем файлы, очень любопытно, что в них. Оказалось, что практически весь трафик — это ICMP-пакеты и DNS запросы и ответы. Интересно, когда появится первое обращение к www-серверу?

Тремя днями позже

Обьединить файлы со статистикой за одни сутки очень просто. Поскольку они имеют вид filename-yyyymmddhhmmss, то достаточно такой команды:

flowd-reader -q -o ./daily/daily-yyyymmdd filename-yyyymmdd*

(ключ -о задает результирующий файл)

после чего исходные файлы можно удалить

rm filename-yyyymmdd*

Поработаем с суточным файлом, для чего переходим в ./daily и для начала экспортируем в ascii-вид:

flowd-reader daily-yyyymmdd > daily-yyyymmdd.txt

Разумеется, комбинацию yyyymmdd следует заменить на реальные данные.

Для начала — самое любопытное: смотрим, были ли (вообще) обращения к веб-серверам:

grep «]:80 » daily-yyyymmdd.txt

Увы, пока не было. А вот

grep «]:25 » daily-yyyymmdd.txt

показывает, что почтовый обмен (точнее — его попытки) были, и не одна. При рассмотрении почтовых логов выяснилось, что нас пытались посетить несколько спамеров (и были отсеяны еще на сетевом уровне), а пара нормальных почтовых сессий была отвергнута по причине отсутствия реверсных записей IPv6 у почтовиков. То есть кто-то настроил почтовик (и ОС, под которой он работает) для работы с IPv6, а созданием реверсной записи не удосужился. Вот, почта и не пошла..

Итоги: 18 апреля 2011 года нас навестил первый IPv6-спамер.

Для удобства написали несложный скрипт (фактически состоящий из нескольких совсем простых скриптов), чтобы автоматически обьединять мелкие дневные flow-файлы в один большой, вычислять суммарный входящий и исходящий IPv6-трафик и отправлять результат по почте. Скрипт вызывается из cron после часа ночи, а утром мы видим результат.

Первая часть: нужно только скорректировать пути к директориям с файлами в первых строках. И — обрабатываются файлы за предыдущий день! После успешной обработки исходные файлы удаляются, а в директории с исходными файлами в поддиректории summ появитсся файл вида 20110423-summ, то есть файл с данными за 23 апреля 2011г.

#!/usr/bin/perl
#
# merge many small flow files for 1 day into one big
use Date::Calc qw(Add_Delta_Days);
#
# edit this variables:
#
$wrkdir="/opt/netflow6/gw-6/"; # directory with flow files
$progdir="/
usr/local/bin/"; # directory with flowd and flowd-reader executables
# output file is placed into subdir summ of $wrkdir, in this example - in /opt/netflow6/gw-6/summ/
# do not forget to create this directory if needed
#
($sec,$min,$hh0,$dd0,$mm0,$yy0,$wday,$yday,$isdst) = localtime(time);
$yy0+=1900;
$mm0+=1;
($yy0,$mm0,$dd0)=Add_Delta_Days($yy0,$mm0,$dd0,-1);
# correct 1-digit values, e.g. 1 ->01, 9 ->09.
if (length($dd0) == 1) { $dd0="0".$dd0; }
if (length($mm0) == 1) { $mm0="0".$mm0; }
$wrkdir1=$wrkdir.$yy0.$mm0.$dd0."*";
$wrkdir2=$wrkdir."summ/".$yy0.$mm0.$dd0."-summ";
# merge daily files and then delete them
$cmd=$progdir."flowd-reader -q -o ".$wrkdir2." ".$wrkdir1."; "."rm ".$wrkdir1;


Следующий фрагмент служит для вычисления суммарного входящего и исходящего IPv6-трафика. (предполагается, что файл с дневной статистикой уже сформирован).

Для этого нужно добавить еще один файл с названием stat.awk с таким содержимым (всего три строчки):

$13 ~ /[2001:0db8/ {totalout+=$19}

$15 ~ /[2001:0db8/ {totalin+=$19}

END { print “Total bytes in: “, totalin; print “Total bytes out: “, totalout; }

Нужно заменить 2001:0db8 на фактический префикс, любой (!) длины, но только по 4-битной границе.

Затем нужно выполнить вот этот скрипт:

#!/usr/bin/perl
#
use Date::Calc qw(Add_Delta_Days);
# edit this variables:
$wrkdir="/opt/netflow6/files/";           # directory with flow files
$progdir="/usr/local/bin/";               # directory with flowd and flowd-reader executables
$awkdir="/home/mydir/flowd/";             # directory with stat.awk  script file
$mailaddr="mymail\@mydomain.ru";
#
($sec,$min,$hh0,$dd0,$mm0,$yy0,$wday,$yday,$isdst) = localtime(time);
$yy0=$yy0+1900;
$mm0=$mm0+1;
$dd0-=1;
# correct 1-digit values, e.g. 1 -> 01, 9 -> 09.
if (length($dd0) == 1) { $dd0="0".$dd0; }
if (length($mm0) == 1) { $mm0="0".$mm0; }
$wrkdir1=$wrkdir.$yy0.$mm0.$dd0."*";
$wrkdir2=$wrkdir."summ/".$yy0.$mm0.$dd0."-summ";
# calc. STATISTICS and print it into IPv6-stat.txt
$cmd=$progdir."flowd-reader $wrkdir2 > /tmp/lastdayflow.txt";
system "$cmd";
$cmd="/usr/bin/awk -f ".$awkdir."stat.awk /tmp/lastdayflow.txt > /tmp/IPv6-stat.txt";
system "$cmd";
# send email to me with result
$cmd="mail -s $dd0\.$mm0\.$yy0\.Daily-IPv6-stat $mailaddr < /tmp/IPv6-stat.txt";
system "$cmd";


Тут все очевидно. Берется файл-результат работы предыдущего скрипта, экспортируется в текстовый формат, затем применяется awk-скрипт. Результат отправляется по почте.

Обе части Perl-скриптов легко обьединяются. Полагаю, что добавить файл на awk, состоящий из 3 строчек, также не составит труда.

И вот результат — сейчас у нас за сутки (апрель 2011г.) проходит 50Мбайт входящего IPv6-трафика, и 15Мбайт исходящего. И это на фоне террабайтного IPv4….

Дополнение от 12.02.2012

Вот небольшой скрипт, который парсит логи веб-сервера и выдает статистику по посещаемости с IPv6-адресов.

Написан на Великом и Могучем AWK (помещается в файл v6log.awk):

BEGIN {i=0}

$0 ~ /^[23][a-h0-9]*:/ {

v6[$1]++ }

END { for (word in v6)

print ++ii,v6[word],word «\n» }

А вызывается он так:

awk -f v6log.awk access

Скрипт выдает кол-во IPv6-адресов, попавших в логи, кол-во обращений с каждого адреса и сам адрес. Проверено, работает. Скрипт должен иметь право читать логи веб-сервера, считаем, что файл с логом называется access.

У нас сейчас (апрель 2011г.) наблюдается посещение с 1-2 уникальных IPv6-адресов в день.

Еще проще посмотреть то же самое в логах почтовой машины, у нас это Postfix. Например так:

grep -E ‘[[23][a-h0-9]*:’ maillog | grep disconnect

а если хочется посчитать число таких обращений, то нужно добавить wc -l в конце строки:

grep -E ‘[[23][a-h0-9]*:’ maillog | grep disconnect| wc -l

Опять-таки скрипт должен иметь право читать файл с логом «почтовика», и предполагаем, что этот файл называется maillog. Проверено, работает.