Sampling i analiza ruchu sieciowego cz. III – Konfiguracja ElastiFlow oraz ElasticStack w kontenerach Dockera.

Ekosystem monitorowania ruchu sieciowego składa się zasadniczo z trzech komponentów: W tym wpisie znajdziesz skrócony opis instalacji i konfiguracji środowiska, które było prezentowane w czasie webinaru. W naszym przykładowym środowisku znajdziemy: Zarówno ElasticFlow jak i ELK możemy zainstalować zarówno natywnie w systemie operacyjnym Linux jak i w kontenerach Docker. W tym artykule wykorzystam Dockera, a […]

Mar 25, 2025 - 14:20
 0
Sampling i analiza ruchu sieciowego cz. III – Konfiguracja ElastiFlow oraz ElasticStack w kontenerach Dockera.

Ekosystem monitorowania ruchu sieciowego składa się zasadniczo z trzech komponentów:

  • Urządzenia sieciowego, któr odpowiedzialne jest za analizę ruchu sieciowego i zbieranie danych oraz tworzenie rekordów przepływów zgodnych z wykorzystywanym do monitorowania protokołem
  • Zagregowane dane wysyłane są do kolektora, gdzie są przechowywane i analizowane.
  • Zintegrowane lub zewnętrzne narzędzie analityczne korzysta z zebranych przez kolektor danych umożliwiając ich analizę i wizualizację.

W tym wpisie znajdziesz skrócony opis instalacji i konfiguracji środowiska, które było prezentowane w czasie webinaru. W naszym przykładowym środowisku znajdziemy:

  1. Urządzenia sieciowe (routery) zbierające dane wykorzystując do tego celu NetFlow v9
  2. ElastiFlow, który działa jako kolektor odbierający dane NetFlow z urządzeń sieciowych.
  3. Stos ELK (Elasticsearch, Logstash, Kibana) umożliwia efektywną analizę i wizualizację danych

Zarówno ElasticFlow jak i ELK możemy zainstalować zarówno natywnie w systemie operacyjnym Linux jak i w kontenerach Docker. W tym artykule wykorzystam Dockera, a wszystkie kontenery będą umieszczone na jednej maszynie wirtualnej. Wykorzystam też Docker Compose do zarządzania osobno stosami ElasticFlow i ELK. Takie podejście umożliwi Ci w prosty sposób uruchomienie obu komponentów na niezależnych serwerach dokonując jedynie minimalnej modyfikacji plików konfiguracyjnych. Pliki konfiguracji stosów jak i pliki konfiguracyjne znajdziesz w załączniku do tego artykułu. Ze względu na wymagania sieciowe stosu ElastiFlow komunikacja między stosami będzie realizowana za pośrednictwem systemu hosta.

Instalację wykonam na serwerze działającym pod kontrolą systemu Ubuntu Server 24.04. Serwer ma adres 172.16.1.175.

Link do repozytorium: https://github.com/SzkolaDevNet/Elastistiflow-ELK-Docker-Compose

ElastiFlow

ElastiFlow to rozwiązanie do analizy ruchu sieciowego, które bardzo prosto integruje się ze stosem ELK w celu zbierania, przetwarzania, przechowywania oraz wizualizacji danych NetFlow, sFlow, IPFIX i innych podobnych protokołów. ElastiFlow umożliwia administratorom sieci monitorowanie, analizę wydajności oraz wykrywanie anomalii w ruchu sieciowym w sposób efektywny i skalowalny. Zintegrować możemy go też z innymi rozwiązaniami takimi jak Splunk, OpenSearch czy AWS OpenSearch Service.

Ciekawą i przydatną funkcją ElastiFlow jest możliwość wzbogacania (ang. enrichment) zabranych danych. Proces ten obejmuje dodawanie kontekstowych informacji do podstawowych rekordów ruchu sieciowego. Może obejmować różnorodne źródła danych i techniki, aby dostarczyć bardziej szczegółowy obraz ruchu sieciowego na przykład o wartość rekordów PTR (reverse lookup) dzięki czemu w analizowanych danych zobaczymy nie adresy IP a odpowiadające im rekordy reverse DNS. GeoIP pozwala na dodawanie informacji geograficznych na podstawie adresów IP źródłowych i docelowych, możemy też dodawać informacje o numerach autonomicznych systemów, do których należą adresy IP. Zaawansowane mechanizmy pozwalają na identyfikację aplikacji generujących ruch na podstawie portów, protokołów lub sygnatur, oznaczanie ruchu do/z znanych domen złośliwych lub phishingowych czy dodawanie tagów lub kategorii na podstawie określonych reguł lub wzorców ruchu. ElastiFlow jest jednym z elementów kompleksowego ekosystemu monitoringu oferowanego przez producenta.

Co najważniejsze, ElastiFlow w wersji Basic jest darmowy, musimy tylko poprosić o wygenerowanie licencji przez formularz na stronie producenta. Płatne w modelu subskrypcji wersje Standard oraz Premium różnią się przede wszystkim wyższymi limitami wydajności oraz wsparciem producenta. Pełne porównanie znajdziesz TUTAJ.

Konfiguracja ElastiFlow opiera się na środowiskach systemowych dostarczonych jako część Docker Compose Stack. Alternatywnie opcje konfiguracji można ustawić w pliku flowcoll.yml. Jednak dostawca nie zaleca tej metody. Wszystkie parametry konfiguracyjne, które jako zmienne środowiskowe zostaną przekazane do kontenera znajdują się w pliku leastiflow.env.  

Podstawowe parametry, które musimy uzupełnić to:

  • EF_ACCOUNT_ID – identyfikator klienta wygenereowany przy rejestracji licencji
  • EF_LICENSE_KEY – otrzymany klucz licencyjny
  • EF_PROCESSOR_ENRICH_IPADDR_DNS_NAMESERVER_IP – adres serwera DNS, na którym prowadzone są rekordy revDNS.
  • EF_OUTPUT_ELASTICSEARCH_ECS_ENABLE – wartość ustawiamy na True aby eksport danych do Elasticsearch był w formacie ECS.
  • EF_OUTPUT_ELASTICSEARCH_ADDRESSES – adres serwera Elasticsearch. Jeżeli uruchamiamy oba stosy na jednym urządzeniu wpisujemy 127.0.0.1:9200
  • EF_OUTPUT_ELASTICSEARCH_USERNAME – nazwę użytkownika w Elaticsearch
  • EF_OUTPUT_ELASTICSEARCH_PASSWORD – hasło użytkownika
  • EF_OUTPUT_ELASTICSEARCH_TLS_ENABLE – Elasticsearch domyślnie będzie oczekiwał połączenia zaszyfrowanego, więc ustawiamy wartość na true.
  • EF_OUTPUT_ELASTICSEARCH_TLS_SKIP_VERIFICATION – Elasticsearch domyślnie generuje własne certyfikaty self-signed, więc wyłączamy opcję sprawdzania weryfikacji certyfikatu ustawiając wartość true

Kolektor ElastiFlow wymaga minimalnej ilości miejsca na woluminy tymczasowe: jednego, w którym przechowywane są rekordy NetFlow przed ich przetworzeniem w celu utrwalenia danych po ponownym uruchomieniu kontenera, oraz drugiego na folder konfiguracyjny. Pamiętaj by przed pierwszym uruchomieniem utworzyć odpowiednie foldery na woluminy i wskazać poprawą ścieżkę w konfiguracji

Aby prawidłowo obsługiwać dane NetFlow i IPFIX, parametr network_mode kontenera musi być skonfigurowany na „host”. To ustawienie jest niezbędne, ponieważ bez niego adres IP źródłowy pakietów przychodzących może zostać utracony, gdy zostaną przekazane do sieci Docker za pomocą interfesu bridge. Ponieważ jedynym sposobem identyfikacji urządzenia wysyłającego w NetFlow i IPFIX jest adres IP źródłowy z nagłówka IP, zachowanie tych informacji jest krytyczne.

Elasticstack

Drugim elementem układanki jest Elasticstack, czyli Elasticsearch, Logstash i Kibana. W naszej konfiguracji nie będziemy wykorzystywali Logstash, który służy do  do pozyskiwania danych typu open source, które umożliwia zbieranie danych z różnych źródeł, przekształcanie ich i wysyłanie do wybranego miejsca docelowego. Dzięki wbudowanym filtrom i obsłudze ponad 200 wtyczek Logstash umożliwia użytkownikom łatwe pozyskiwanie danych niezależnie od źródła lub typu danych. Wykorzystamy natomiast Elasticsearch, czyli rozproszony silnik wyszukiwania i analizy zbudowany na Apache Lucene. Obsługa różnych języków, wysoka wydajność i dokumenty JSON bez schematu sprawiają, że Elasticsearch jest idealnym wyborem do różnych przypadków użycia analizy dzienników i wyszukiwania. Kibana zaś to narzędzie do wizualizacji i eksploracji danych wykorzystywane do analizy dzienników i szeregów czasowych, monitorowania aplikacji i przypadków użycia wywiadu operacyjnego. Oferuje potężne i łatwe w użyciu funkcje, takie jak histogramy, wykresy liniowe, wykresy kołowe, mapy cieplne i wbudowane wsparcie geoprzestrzenne. Ponadto zapewnia ścisłą integrację z Elasticsearch praktycznie „out-of-the-box”.

Przygotowana konfiguracja stosu z ELK zawiera usługę setup, która odpowiedzialna jest za początkową konfigurację wszystkich komponentów i walidację tej konfiguracji przy każdorazowym uruchomieniu stosu. W jego ramach działa jedna instancja Elasticsearch o nazwie es01 i jedna instancja Kibany (o nazwie kibana). Dodatkowo w konfiguracji jest zawarta definicja serwisu kibana-tls. Jest to kontener z oprogramowaniem Caddy, które pełni rolę reverse proxy, gdybyśmy w prosty sposób chcieli zamiast generowanych przez setup certyfikatów typu self-signed używać certyfikatów podpisanych przez własne CA dla front-endu Kibany, bez konieczności rekonfiguracji wewnętrznych certyfikatów wykorzystywanych do połączenia między Elasticseach i Kibaną. Parametry uruchomienia stosu zapisane są w pliku .env – w przeciwieństwie do Elastiflow znajdziemy tam parametry środowiskowe wykorzystywane pryz uruchamianiu Dockera, nie zaś zmienne przekazywane do uruchamianego kontenera. Znajdziemy tam między innymi domyślne hasła do logowania i do kont systemowych ELK. Jeżeli nie chcemy ich zmieniać to tego pliku nie musimy edytować. Parametry środowiskowe samych kontenerów są zdefiniowane w sekcji „environment” każdego z serwisów w pliku docker-compose.yaml. Tych parametrów też nie musimy w instalacji labowej edytować.

Pamietajmy jednak by podobnie jak w definicji stosu ElastiFlow poprawnie zdefiniować ścieżki do folderów montowanych jako woluminy serwisów. Przede wszystkim zadbajmy o to by folder wskazany jako wolumin elk-es01-data znajdował się na dysku z odpowiednio dużą ilością miejsca, gdyż to w nim będą przechowywane dane z NetFlow odebrane z Elastiflow. Instalacja labowa przewiduje uruchomienie jednego węzła Elasticsearch, w instalacji produkcyjnej warto rozwiażyć ich zwiększenie by poprawić o zoptymalizować wydajność działania stosu.

Komunikacja wewnętrzna między serwisami es01 a kibana odbywa się wewnętrzenie za pośrednictwem wirtualnej sieci elk_network. Port 9200 serwisu es01 jest udostępniony aby umożliwić kolektorom NetFlow wysyłanie do niego danych. Interfejs Kibany dostępny jest na portcie 5601.

Pierwsze uruchomienie

Zdefiniowane stosy aplikacji uruchamiamy poleceniem docker compose up -d z poziomu odpowiedniego folderu z konfiguracją każdego z nich. Logi możemy śledzić za pomocą polecenia docker compose log -f. Proces najlepiej zacząć od stosu ElastiFlow. Poprawne zainicjowanie aplikacji będzie sygnalizowane komunikatem ostrzeżenia, że ElastiFlow nie może podłączyć się do Elasticsearch pod adresem tcp://127.0.0.1:9200. Jeżeli zapomnieliśmy lub niepoprawnie w zmiennych środowiskowym skonfigurowaliśmy identyfikator klienta i klucz licencyjny to zobaczymy komunikat błędu i serwis nie podejmie nawet próby połączenia z Elasticsearch.

W kolejnym kroku uruchamiamy stos ELK. Początkowa inicjalizacja może zająć chwilę w zależności od dostępnych zasobów. Poprawne uruchomienie Elasticsearch spowoduje, ze ElastiFlow rozpocznie konfigurację niezbędnych komponentów aby wysyłać dane. Ta operacja także może chwilę potrwać. Po chwili powinien nam się także uruchomić kontener z Kibaną co pozwoli nam połączyć się z interfejsem graficznym pod adresem https://:5601/ gdzie IP to adres serwera, na którym uruchomiliśmy stos. Aby zobaczyć czy ElastiFlow poprawnie wygenerował niezbędne obiekty, wybieramy z menu Stack Management -> Index Management. Powinniśmy zobaczyć indeksy zaczynające się do „eastiflow-”.

Pod adresem https://docs.elastiflow.com/docs/data_platforms/elastic/kibana znajdziemy przygotowane przez twórców ElastiFlow obiekty, które po zaimportowaniu do Kibany pozwolą nam na korzystanie z predefiniowanych dashboardów. Musimy ze strony z tabeli „Kibana Objects for Network Flow Data” pobrać plik o schemacie ECS dla naszej wersji Kibany. Aby go zaimportować wybieramy z menu Stack Management -> Saved Object a następnie opcję Import. Zaimportowane dashboardy znajdziemy wybierając z menu Dashbords z sekcji Analytics, a następnie interesujący nas typ wizualizacji danych. Osobiście najbardziej lubie i najbardziej mi się przydają Top Talkers oraz Flows (src/dst).

Jedyne czego nam teraz brakuje to dane.

Eksportowanie NetFlow z urządzeń

Nie ma jednego standardu konfiguracji eksportowania danych z NetFlow. Każdy producent podchodzi do konfiguracji nieco inaczej, niemniej są trzy niezbędne do skonfigurowania elementy:

  • Adres kolektora NetFlow, do którego będą przesyłane dane
  • Monitorowany interfejs
  • Kierunek monitorowanego przepływu na interfejsie.

Parametry takie jak częstotliwość próbkowania mają domyślne swoje wartości i możemy ich nie rekonfigurować, jeżeli nie ma takiej potrzeby. Poniżej znajdziesz przykłady dla kilku popularnych platform.

Juniper JunOS:


set services flow-monitoring version9 template ipv4 flow-active-timeout 60
set services flow-monitoring version9 template ipv4 flow-inactive-timeout 60
set services flow-monitoring version9 template ipv4 ipv4-template
set forwarding-options sampling family inet output flow-server 172.16.1.175 port 9995
set forwarding-options sampling family inet output flow-server 172.16.1.175 version9 template ipv4
set interfaces ge-0/0/0 unit 0 family inet sampling input
set interfaces ge-0/0/0 unit 0 family inet sampling output

Cisco IOS XE (Flexible NetFlow)


flow exporter FlowExport
  destination 172.16.1.175
  transport udp 9995
  ttl 60
!
flow record RemoteFlow
  description IPv4 remote site
  match ipv4 destination address
  match ipv4 source address
  match ipv4 protocol
  match interface input
  match transport destination-port
  match transport source-port
  collect counter bytes long
  collect counter packets long
  collect interface output
  collect transport tcp flags
  collect timestamp absolute first
  collect timestamp absolute last
!
flow monitor FlowMonitor
  exporter FlowExport
  record RemoteFlow
  cache timeout active 60
  cache timeout inactive 15
!
interface g1/0/1
  ip flow monitor FlowMonitor input
  ip flow monitor FlowMonitor output

Cisco IOS:


ip flow-export destination 172.16.1.175 9995
ip flow-export version 5
ip flow-cache timeout active 1
ip flow-cache timeout inactive 15
!
interface g1/0/1
  ip flow ingress
  ip flow egress

FortiOS:


config system netflow
    config collectors
        edit 1
            set collector-ip "172.16.1.175 "
            set collector-port 9995
        next
    end
end
config system interface
    edit "wan1"
        set vdom "root"
        set netflow-sampler both
    next
end