Samplicator — клонируем и форвардим UDP (sflow) потоки

Время от времени возникает ситуация когда необходимо распараллелить приём 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

[Голосов: 0 Средний бал: 0]