Клонирование потока Netflow на несколько приемников трафика.
Имеется ситуация, когда с маршрутизатора Cisco ASR1006 в формате Netflow ver9 льется поток данных о NAT трансляциях. На маршрутизаторе Cisco ASR1006 в конфигурации прописано:
ip nat log translations flow-export v9 udp destination 10.200.15.117 2000
(лить nat log в формате netflow ver9 на ip 10.200.15.117 и порт 2000)
Эту строчку можно написать только один раз и следовательно лить логи NAT трансляций в формате Netflow можно только на один адрес/порт получателя. Но иногда возникает необходимость распараллелить поток Netflow на два сервера-приемника или больше.
Для решения этой задачи можно воспользоваться утилитой samplicator, умеющей размножать UDP трафик. (https://github.com/sleinen/samplicator).
Схема должна в конечном счет получиться такая:
1. Установка утилиты samplicator, позволяющей размножать потоки UDP:
# cd /usr/src/
# git clone https://github.com/sleinen/samplicator
# cd samplicator
# automake
# ./autogen.sh
# ./ configure
# make
# make install
2. Запуск утилиты samplicator выполняется командой:
# samplicate -S 127.0.0.1/2059 172.16.6.130/2059
После запуска утилиты консоль будет заблокирована и система начнет слушать порт 2000 (по умолчанию для утилиты samplicate) и все UDP пакеты отправлять получателям:
- ip 127.0.0.1 порт 2059
- ip 172.16.6.130 порт 2059
Ключ -S указывает на то что утилите необходимо сохранить оригинальный ip адрес источника трафика.
В соседней консоли сервера можно проконтролировать прием и отправку пакетов с помощью tcpdump:
Проверка приходящих пакетов на порт 2000:
#tcpdump port 2000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:25:13.250021 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
09:25:13.262595 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
09:25:13.275274 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
Видим, что пакеты при ходят с 10.200.15.118 на наш сервер (10.200.15.117)
Обозначение sieve-filter – это как раз порт 2000.
Проверка уходящих пакетов на порт 2059
#tcpdump port 2059
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:27:55.685079 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1052
09:27:55.690870 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1052
09:27:55.697099 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1088
Видим, что пакеты уходят на второй сервер 172.16.6.130 на порт bmc-messaging (2059) с сохраненным ip адресом источника (10.200.15.118).
Что бы запустить команду в фоне выполняем:
# samplicate -Sf 127.0.0.1/2059 172.16.6.130/2059
Для добавления в автозагрузку добавляем эту строчку в файл /etc/rc.local
Чтобы заставить утилиту samplicate слушать не порт 2000, а любой другой необходимо применить ключ –p.
Например для прослушивания порта 4000 выполняем:
# samplicate -Sf -p 4000 127.0.0.1/2059 172.16.6.130/2059
3. Справка
Если нужно просто попрактиковаться и нет потока Netflow с Cisco, отправить UDP пакеты получателю на определенный ip и порт можно воспользоваться утилитой netcat и выполнить команду:
# echo -n "foo" | nc -4u -w1 10.200.15.117 2000
Пакет с содержимым «foo» уйдет на ip 10.200.15.117 и на порт 2000
Что бы убедиться, что локальный приемник Netflow трафика принимает пакеты на Ip 127.0.0.1, порт 2059 не достаточно утилиты tcpdump. Она не может прослушать интерфейс lo.
Смотрим кто слушает порт 2059
# netstat -ltupn | grep 2059
udp 0 0 0.0.0.0:2059 0.0.0.0:* 1459/nfcapd
Ищем как запущен процесс nfcapd
# ps ax | grep nfcapd
1456 ? S 0:00 /usr/local/bin/nfcapd -w -D -l /mnt/disk1/NFLogs/netflow/R7/ -p 2055
1459 ? S 9:53 /usr/local/bin/nfcapd -w -D -l /mnt/disk1/NFLogs/NEL/R7/ -p 2059
6669 pts/0 S+ 0:00 grep nfcapd
Видим, что порт 2059 прослушивается утилитой и при этом задействуется директория /mnt/disk1/NFLogs/NEL/R7/.
Смотрим содержимое директории несколько раз подряд:
# ls -l /mnt/disk1/NFLogs/NEL/R7/
итого 115708
-rw-r--r-- 1 root root 118482132 Янв 30 09:39 nfcapd.current.1457
# ls -l /mnt/disk1/NFLogs/NEL/R7/
итого 117756
-rw-r--r-- 1 root root 120579156 Янв 30 09:39 nfcapd.current.1457
Размер файла меняется. Значит данные получаются и записываются.
Если размер файла меняться не будет – значит что-то не так и локальный сборщик netflow не работает.