Pull to refresh

Учет трафика Cisco ASA с помощью NetFlow и nfdump на FreeBSD или Linux

Network technologies *

Введение


Практически перед каждым администратором сети встает задача учета трафика. Либо это нужно для биллинга, либо просто для мониторинга активности.
Для решения этой задачи можно использовать стандартный протокол NetFlow (RFC 3954), который поддерживается производителями сетевого оборудования (Cisco, Juniper, 3Com и др.), а также Linux, *BSD и прошивкой DD-WRT. Netflow позволяет передавать данные о трафике (адрес отправителя и получателя, порт, количество информации и др.) с сетевого оборудования (сенсора) на коллектор. Коллектор, в свою очередь, сохраняет полученную информацию. В качестве коллектора можно использовать обычный сервер. Проиллюстрирую схему картинкой из википедии:

Архитектура NetFlow

Когда я взялся настраивать NetFlow, оказалось что opensource решения для реализации коллектора плохо работают с Cisco ASA, а в Интернете очень мало информации, что в этом случае делать. Я решил восполнить этот пробел: подружить FreeBSD / Linux с Cisco ASA можно за 20 минут.



Начнем с того, что у меня не заработало:
flow-tools — не работает вообще, видимо не поддерживает NetFlow v9.
flowd — не сохраняет данные о количестве переданных байт и пакетах.
nfcapd — неправильно сохраняет дату и время, число переданных байт.

Не отрицаю такой возможности, что виноваты мои кривые руки, или что в новой версии этих программ добавят безглючную поддержку Cisco ASA.

Коллектор


После долгих поисков я наткнулся на версию nfdump с поддержкой NSEL: nfdump-1.5.8-NSEL, которая отлично работает с ASA.

Процесс установки — стандартный:
Снача скачиваем и распаковываем nfdump-1.5.8-NSEL.
Затем в папке nfdump-1.5.8-NSEL:
./configure
make
make install


После этого мы получим несколько программ:
nfcapd — демон-коллетор, слушает порт, собирает данные и пишет в файлы.
nfdump — читает и выводит собранные nfcapd данные.
nfexpire — производит ротацию файлов, созданных nfcapd.
nfreplay — читает собранные nfcapd файлы и отправляет их по сети на другой коллектор.

Запускаем коллектор:
nfcapd -l <папка для записи данных> -t <интервал ротации файлов (сек)> -D

nfcapd начнет писать полученные данные в временный файл nfcapd.current.PID в папке заданной параметром -l. Когда пройдет интервал времени, заданный -t, nfcapd скопирует содержимое временного файла в nfcapd.yyyymmddhhmm. Таким образом, в каждом таком файле будет храниться информация о трафике за последние -t секунд.
Ключ -D указывает работать в режиме демона.
Параметр -b задает IP-адрес, который необходимо слушать, -p позволяет сменить порт по умолчанию.

Сенсор


Теперь необходимо настроить Cisco ASA. Т.к. я — профан в Cisco, приведу ссылки на готовые мануалы:
Если вы настраиваете ASA через GUI ASDM.
Если вы настраиваете ASA через труЪ консоль.

К сожалению в моей версии ASDM (6.3) был глюк, который не позволял добавить коллектор в policy rule, поэтому все равно пришлось лезть в консоль.

Теперь, если все прошло успешно, на коллектор должны посыпаться пакеты:
tcpdump port 9995
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em0, link-type EN10MB (Ethernet), capture size 96 bytes
18:22:36.909747 IP 192.168.4.1.56684 > 192.168.4.7.9995: UDP, length 1436
18:22:37.012687 IP 192.168.4.1.56684 > 192.168.4.7.9995: UDP, length 1464
18:22:37.065782 IP 192.168.4.1.56684 > 192.168.4.7.9995: UDP, length 1432
...

А в папке, куда сохраняются файлы nfcapd, должен начать расти размер файлов.

Сборка мусора


При ~30 коннектах в секунду (сеть 150 пользователей) лог за 1 минуту занимает около 2 Мб.
Чтобы избежать захламления диска, добавим nfexpire в crontab команду:
/usr/local/bin/nfexpire -e <папка для записи данных> -s <макс. размер данных> -t <макс. время жизни данных>
Например, запуск nfexpire с параметром -t 2w удалит все файлы старше двух недель, а с -s 20g — наиболее старые файлы, так чтобы их общий размер был не более 20 Гб. Эти параметры можно использовать вместе.

Обработка данных


Получить данные из nfcapd.* файлов в человекочитаемом формате можно с помощью утилиты nfdump:
nfdump -r <путь к файлу>
2011-09-04 19:53:45.484 TCP 192.168.2.11:1057 NA -> 217.20.152.98:80 DENIED I-ACL 0
2011-09-04 19:53:45.554 TCP 66.249.66.34:55383 NA -> 46.46.152.214:80 DELE-U Deleted 0
2011-09-04 19:53:30.887 TCP 192.168.4.183:63015 46.46.152.212:63015 -> 89.185.97.235:80 CREATE Ignore 214
...

Как можно заметить, вывод nfdump легко поддается дальнейшему парсингу. Нужно учитывать, что каждая запись содержит информацию не об одном пакете, а о потоке — наборе пакетов, проходящих в одном направлении.
Nfdump также умеет читать несколько файлов, собирать статистику и фильтровать записи.

Также существует веб-интерфейс к nfdump — NfSen, который умеет рисовать красивые графики.

Если вы хотите самостоятельно обрабатывать данные, вам понадобится ключ -x демона nfcapd — он позволяет запустить программу, когда очередной файл будет готов. Например, я написал для обработки вывода nfdump скрипт на php, и моя строка запуска nfcapd выглядит вот так:
/usr/local/bin/nfcapd -t 600 -w -p 9999 -l /data/flows/ -D -x '/usr/local/bin/php /usr/local/share/sams/all_traf_stats.php %d/%f' &
Обратите внимание, что команда заключена в одинарные кавычки и что как параметры скрипту передаются %d и %f — это папка nfcapd и имя последнего файла соответственно.

Логировать каждый пакет в базе данных оказалось очень затратно, поэтому мой скрипт просто считает статистику по каждому хосту и протоколу в байтах раз в 10 минут. Таким образом, я отслеживаю завирусованные машины и любителей загрузить канал организации скачиванием фильмов — утром мне приходит письмо с top20 «качальщиков». Также данные из nfdump дополняют статистику прозрачного прокси сервера Squid, который обслуживат только 80-й порт.
Если кому-то для примера нужен этот скрипт, вы можете его скачать, но не ожидайте красивого кода :) Скрипт хорошо справляется при ~500 записях в секунду. Если нагрузка будет очень большая, то он начнет есть слишком много памяти.

Выводы


Используя NetFlow можно организовать учет трафика, получая информацию с маршрутизаторов и брандмауэров. Это позволит логировать трафик, получать статистику для биллинга или выявлять подозрительную активность в сети. Также в этом топике я постарался рассказать как заставить работать Cisco ASA в паре с FreeBSD, т.к. в свое время я не нашел такое howto в сети.
Tags: ciscocisco asanetflownfdumpfreebsd
Hubs: Network technologies
Total votes 10: ↑8 and ↓2 +6
Comments 6
Comments Comments 6

Popular right now