NetFlow

Вода (общие фразы).

Конечно, хотелось бы, чтобы были безлимитные каналы к апстримам, и чтобы была возможность предоставлять клиентам только безлимитные тарифные планы. Но увы, пока не получатся, значит без биллинга не обойтись. Да и логи нужно хранить за последние три года…

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

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

В соответствии с «фирменной» документацией, поддержка Netflow для IPv6 появилась в версиях 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й версии протокола

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

Кстати, команда ipv6 flow-export version 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. С нашей точки зрения, у него есть несомненные плюсы:

  1. работает и с NetFlow9, и с IPv6
  2. существует package для FreeBSD и OpenBSD
  3. прост, состоит из 2 утилит и 1 конфигурационного файла

Устанавливаем его. В конфигурационном файле нужно прописать 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 строчек, также не составит труда.

И вот результат — сейчас у нас за сутки проходит 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.

У нас сейчас наблюдается посещение с 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. Проверено, работает.

 


  *** Via IPv4 ***  

NetFlow: 1 комментарий

  1. admin Автор записи
    Небольшое дополнение: после установки на втором роутере 15й версии ИОСа (и после добавления нескольких строк в конфигурацию роутера) не удалось обнаружить каких-либо записей от этого роутера в flow-файлах. Начали проверять: GW-3#sh ipv6 flow cache IP packet size distribution (30511 total packets): 1-32 64 96 128 160 192 224 256 288 320 352 384 416 448 480 .000 .033 .362 .193 .053 .025 .018 .007 .009 .005 .003 .021 .013 .011 .008 512 544 576 1024 1536 2048 2560 3072 3584 4096 4608 .006 .004 .003 .199 .014 .000 .000 .000 .000 .000 .000 IP Flow Switching Cache, 475168 bytes 51 active, 4045 inactive, 27128 added 551131 ager polls, 0 flow alloc failures Active flows timeout in 30 minutes Inactive flows timeout in 15 seconds IP Sub Flow Cache, 33992 bytes 0 active, 1024 inactive, 0 added, 0 added to flow 0 alloc failures, 0 force free 1 chunk, 1 chunk added — вроде все работает. Далее — на коллекторе: GW-3#sh ipv6 flow export Flow export v9 is enabled for main cache VRF ID : Default Source(1) 217.xxx.yyy.zzz (GigabitEthernet7/1) Destination(1) 217.xxx.yyy.ttt (1234) Version 9 flow records 16693542 flows exported in 557479 udp datagrams 0 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 И тут придраться не к чему. Переходим на коллектор: сначала проверяем конфигурационный файл, разрешен ли прием данных с этого коллектора. Убеждаемся, что разрешен, в flowd.conf есть строки flow source 217.xxx.yyy.zzz flow source 217.xxx.yyy.ttt эти строки есть (можно заменить одной, указав целую подсеть), здесь все верно. $ sudo tcpdump -n -i fxp0 port 1234 Password:**** tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on em0, link-type EN10MB (Ethernet), capture size 96 bytes 13:21:25.587485 IP 217.xxx.xxx.aaa.53515 > 217.xxx.yyy.aaa.1234: UDP, length 1416 ..... ^C — и тут все в порядке, пакеты от второго роутера идут. А вот при запуске flowd в отладочном режиме (то есть с ключами -dg) этих пакетов не видно… Немного работы, и… выяснилось, что flow-пакеты от Cisco, содержащие данные по IPv6-трафику, должны отправляться от имени интерфейса, на котором поднят IPv6. Забавно… Ну да ладно, заработало — и хорошо! Сейчас данные от двух сенсоров принимаются в один файл. Что лучше: принимать в разные файлы, а потом обьединять или принимать сразу в один файл? Не знаю.. Осталось попробовать запустить вторую копию коллектора на другом порту и попытаться записывать данные от двух сенсоров в разные файлы. Вдруг пригодится..
      *** Via IPv4 ***  

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.