Время от времени возникает ситуация когда необходимо распараллелить приём sflow потоков на несколько анализаторов, для последующей обработки оных. Дабы реализовать возникшую потребность воспользуемся утилитой Samplicator.
Эта маленькая программа слушает заданный порт и форвардит приходящий поток на требуемые адреса назначения. Более полное описание возможностей можно прочесть на странице проекта.
Устанавливаем программу:
cd /opt git clone https://github.com/sleinen/samplicator.git cd samplicator ./autogen.sh # PS Для запуска скрипта требуются automake и autoconf, если # скрипт завершиться с ошибкой установите их и перезапустите оный ./configure make make install
Параметры запуска описаны на странице проекта в гитхаб, мы же запускаем программу со следующими параметрами:
samplicate -Sf -p 65012 127.0.0.1/55012 10.16.40.22/65012
-S — оставить адрес источника трафика не изменным
-f — запустить программу в фоновом режиме
-p — указываем порт на котором слушаем UDP
127.0.0.1/55012 — отправляем трафик в лупбек интерфейс для анализатора на этом сервере
10.16.40.22/65012 — форвардим трафик на удаленный сервер
Т.к. на одном порту два приложения слушать трафик не могут меняем конфиг NfSen’a который мы настраивали ранее. В файле /opt/nfsen/etc/nfsen.conf в строке
’12summit’ => { ‘port’ => ‘65012’, ‘col’ => ‘#00FFFF’, ‘type’ => ‘sflow’, },
меняем порт с 65012 на 55012 и запускаем NfSen
Проверим слушает ли NfSen данный порт и принимает пакеты:
$ netstat -ltupn | grep 55012 udp 0 0 0.0.0.0:55012 0.0.0.0:* 1599/sfcapd # видно что запущен sfcapd с айди процесса 1599 # проверим параметры процесса $ ps ax | grep 1599 1599 ? S 1:15 /usr/bin//sfcapd -w -D -p 55012 -u www-data -g www-data -B 200000 -S 1 -P /opt/nfsen/var/run/p55012.pid -z -t 300 -I 12summit -l /opt/nfsen/profiles-data/live/12summit # видно что действительно данный процесс слушает порт 55012 # и пишет данные в /opt/nfsen/profiles-data/live/12summit $ ls -lh /opt/nfsen/profiles-data/live/12summit total 8.0K drwxr-xr-x 5 www-data www-data 4.0K Jun 1 00:05 2020 -rw-r--r-- 1 www-data www-data 276 Jun 7 01:20 nfcapd.current.1597 $ ls -lh /opt/nfsen/profiles-data/live/12summit total 340K drwxr-xr-x 5 www-data www-data 4.0K Jun 1 00:05 2020 -rw-r--r-- 1 www-data www-data 335K Jun 7 01:23 nfcapd.current.1597
Размер файла увеличивается, значит всё работает как нужно. Проверим уходят ли пакеты на другой сервер:
tcpdump port 65012 | grep "40.22" tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes 01:26:24.566069 IP 10.0.0.12.33152 > 10.16.40.22.65012: UDP, length 1240 01:26:24.566146 IP 10.0.0.12.33152 > 10.16.40.22.65012: UDP, length 1316 01:26:24.630800 IP 10.0.0.12.33152 > 10.16.40.22.65012: UDP, length 1372 01:26:24.701860 IP 10.0.0.12.33152 > 10.16.40.22.65012: UDP, length 1372
К сожалению у нас UDP потоки разбросаны по различным портам, потому воспользоваться конфиг файлом и запустить один экземпляр программы мы не можем, поэтому делаем bash файлик:
$ cat /opt/samplicate-sflow.sh #!/usr/bin/env bash sleep 60 /usr/local/bin/samplicate -Sf -p 65012 127.0.0.1/55012 10.16.40.22/65012 /usr/local/bin/samplicate -Sf -p 65017 127.0.0.1/55017 10.16.40.22/65017 /usr/local/bin/samplicate -Sf -p 65015 127.0.0.1/55015 10.16.40.22/65015 /usr/local/bin/samplicate -Sf -p 65011 127.0.0.1/55011 10.16.40.22/65011 /usr/local/bin/samplicate -Sf -p 65013 127.0.0.1/55013 10.16.40.22/65013 /usr/local/bin/samplicate -Sf -p 65114 127.0.0.1/55114 10.16.40.22/65114
И добавляем этот скрипт в крон при запуске сервера:
$ crontab -e # добавляем вниз файла следующие строки # PS помните что последняя строка в кроне всегда должна быть пустой #run forwarding udp @reboot /opt/samplicate-sflow.sh