Экспорт ipv6 NetFlow v9 через ng_netflow на FreeBSD 9.0

FreeBSD logo

     Пришла в голову мысль собрать статистику по ip и ipv6 из того трафика который течет на трекер. С ipv4 было бы интересно посмотреть статистику по geoip и странам кто-же там все таки лазиет. По ipv6 больше интересовал вопрос каков процент трафика идет с “реальных” ipv6 а не 6to4 или teredo. На беглый взгляд 99,х% трафика там как раз 6to4 и teredo, осталось найти х. Варинатов было 2 – выдернуть базу пиров из памяти Opentracker’а или снимать статистику с сетевой подситемы. Первый вариант впринципе возможен, opentracker вроде как умеет скидывать свой дамп, но эта функция недокументирована и не факт что работает, читать исходники мне тоже не хотелось.
Второй вариант имеет несколько вариантов решения. В блоге на http://ip.v6net.ru/ я натыкался на интересную статейку по экспорту ipv6 статистики в NetFlow v9 на кошках. Дома у меня не кошка а фря, но в недавнем RELNOTES к 9й фре упоминалась в ng_netflow и ng_ipfw добавлена поддержка ipv6 и экспорта NetFlow v9. Вот его и посмотрим.

Коллектор

Коллектор и его настройка хорошо описаны в оригинальной статье, тут и разбирать нечего. Собрал, поправил пару строк в кинфиге и запустил.

ng_netflow

Для начала надо загрузить модуль ядра:

> kldload ng_netflow && kldstat | grep flow
25 1 0xffffffff80e35000 56eb ng_netflow.ko

В мане ng_netflow(4) вроде ничего хитрого нет, нода может экспортировать одновременно NetFlow v5 и v9 с соответствующих крючков, а трафик в нее можно заворачивать как с ng_ether так и голые пакеты если указать специально. Подстава в том что у stf интерфейса нету netgraph крючков и прицепиться непосредственно к интерфейсу не получится. А с ng интерфейса ip6 пакеты уходят уже обернутыми в ip4. Ну ладно, тогда буду заворачивать трафик в ноду через ipfw. Тем более что так даже можно даже точнее контролировать что туда пихать. Попробуем собрать граф:

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

Добавляем в ipfw правило отсылать копию ipv6 трафика в netgraph, воткнуть его нужно где-нибудь до того как ipfw применит какие-либо разрещающие правила динамические и статические. Ну пусть будет так:

ipfw add 08245 ngtee 624 ip6 from any to any via stf0

Смотрим идет ли экспорт netflow с сенсора

> tcpdump -npti lo0 port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 65535 bytes
IP 127.0.0.1.53044 > 127.0.0.1.12345: UDP, length 120
IP 127.0.0.1.53044 > 127.0.0.1.12345: UDP, length 120
IP 127.0.0.1.53044 > 127.0.0.1.12345: UDP, length 120
IP 127.0.0.1.53044 > 127.0.0.1.12345: UDP, length 5328
IP 127.0.0.1.53044 > 127.0.0.1.12345: UDP, length 120
IP 127.0.0.1.53044 > 127.0.0.1.12345: UDP, length 120

Что-то идет :)

Нода тоже говорит что что-то она пережевывает

ngctl msg NetFlow: info
Rec’d response “info” (805306369) from “[29]:”:
Args: { IPv6 bytes=596147175 IPv6 packets=517611 IPv6 records used=6921 fibs allocated=1 Active expiries=84181 Inactive expiries=311587 Inactive timeout=15 Active timeout=1800 }

Flowd  бурчит в дебаге что-то малопонятное.

Received max number of packets (512) on fd 3
netflow v.9 packet (len 2048) 97 recs, source 0x00000029
netflow v.9 template flowset from source 0x29 (len 172)
NetFlow v.9 template set from 127.0.0.1/0x29 with len 172:
Contains template 0x00000029/0x0100 with 20 records (offset 8):
Contains template 0x00000029/0x0103 with 20 records (offset 92):
short netflow v.9 flowset length 2048 bytes from 127.0.0.1

Набрав немного трафика я передернул flowd и стал разбирать чего он там наловил.

mv flows flows.1
killall -SIGUSR1 flowd
flowd-reader flows.1 >/tmp/flows.txt

В файлике /tmp/flows.txt оказалось что-то странное. Явно что-то было не так… Все потоки состояли из 1-го 2-х пакетов с, на первый взгляд, верными адресами src dst, но какими-то абсолютно левыми адресами портов, чуть ли не случайными. Я завернул через ipfw в ноду на отдельный хук еще и ip4 трафик – c ip4 все было нормаьно. Все потоки нормально собирались, адреса порты были похожи на те что должны быть. Я долго бился и искал проблему, пересобирал граф, мучал коллектор, но ничего не получалось. Netflow с ipv6 выдавал какую-то чушь. В конце концов я даже пересобрал граф и подцепил ноду к физическому интерфейсу ng_ether локалки. На мое удивление все прекрасно заработало! Я получил с коллектора вполне нормальные агрегированные ipv6 потоки.
Вобщем, однозначно что-то не ладно в королевстве – ng_netflow некорректно работает с ipv6 трафиком в случае если он попадает в ноду в виде raw пакетов.

Н-да… похоже статистические изыскания откладываются на некоторое время. Городить другой огород мне чего-то расхотелось.

UPD: Написал письмо с баг репортом Александру Черникову, он, вроде, плотно занимался ng_netflow. Ответил он довольно быстро, за что ему спасибо, сказал что про баг не в курсе, ipv6 особо не тестировался – обещаЛ посмотреть что там. Будем ждать…

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">