Netflow i OpenBSD

Tomasz Marciniak

2012-08-24

Netflow to protokół firmy Cisco, umożliwiający obserwację transmisji sieciowych i generowanie statystyk. Systemy open-source, takie jak BSD, czy Linux, posiadają implementacje Netflow, zapewniające te same funkcjonalności.

Nadajnik Netflow w OpenBSD

System OpenBSD od wersji 4.4 wzwyż posiada wbudowany nadajnik statystyk Netflow. Opiera się on o zapis stanów w filtrze pakietów pf. Dla każdej reguły filtra, która tworzy stan, zbierane i wysyłane są dane o strumieniach Netflow. Żeby włączyć Netflow dla wszystkich reguł, należy dodać do pliku konfiguracyjnego /etc/pf.conf dyrektywę:

set state-defaults pflow

Alternatywnie, można zbierać statystyki selektywnie, poprzez dodanie tylko do wybranych reguł opcji pflow, np.:

pass in quick on $if_vlan_eo reply-to ( $if_vlan_eo $ip_gw_eo ) to $net_internal tagged wan_eo_130 label wan_eo_130 keep state (pflow)

Uwaga - powyższa składnia reguły pochodzi z filtra w wersji 4.5, w nowszych wersjach opcję dodaje się analogicznie.

Uruchomienie nadawania statystyk polega na skonfigurowaniu pseudointerfejsu pflow, np.:

ifconfig pflow0 flowsrc 10.2.1.252 flowdst 10.2.1.185:9995

Parametr flowsrc wskazuje na adres jednego z lokalnych interfejsów sieciowych firewalla OpenBSD, zaś flowdst to adres i port zdalnego odbiornika Netflow. Jest bardzo ważne, żeby explicite podać wartość parametru flowsrc, ponieważ bez niego mimo iż statystyki będą wysyłane, niektóre odbiorniki Netflow nie będą ich przyjmować.

Dodanie konfiguracji interfejsu pflow0 do pliku /etc/hostname.pflow0 zapewnia trwałe działanie funkcji po restarcie systemu:

# cat /etc/hostname.pflow0
up flowsrc 10.2.1.252 flowdst 10.2.1.185:9995

Odbiornik Netflow: nfdump

Dane Netflow mogą być odbierane na zdalnym serwerach. W tym celu należy zainstalować jeden z licznych odbiorników Netflow. Z uwagi na praktyczne funkcjonalności raportowania, wybrałem oprogramowanie nfdump, które składa się z serwera zbierającego dane (nfcapd) oraz narzędzia analitycznego (nfdump). Zestaw zawiera także inne narzędzia pomocnicze.

Konfiguracja przyjmowania danych

Serwer nfcapd konfigurowany jest argumentami wiersza poleceń. W moim środowisku uruchamiam go z parametrami:

/usr/bin/nfcapd -D -l /var/cache/nfdump -P /var/run/nfcapd.pid -b 10.2.1.185

Kolejne opcje oznaczają:

Generowanie raportów

Do wyświetlenia raportów ze zgromadzonych danych służy polecenie nfdump. Szczegółowe informacje o możliwościach tego narzędzia można znaleźć w podręczniku systemowym nfdump(1), tutaj skupimy się na wybranych, praktycznych przykładach.

Wyświetlenie wszystkich strumieni

Przedstawienie danych o wszystkich zarejestrowanych strumieniach to kwestia wskazania poleceniu nfdump lokalizacji logów:

# nfdump -R /var/cache/nfdump/ | head -n4

Wybór strumieni

Obsługa składni filtrów tcpdump jest standardem wśród sieciowych narzędzi i nfdump nie jest wyjątkiem. Żeby wybrać z logów określone strumienie, można podać kryteria w znany sposób, np.:

# nfdump -R /var/cache/nfdump/ "src host vpn.eo.pl and dst port 80" | head -n10

Dodatkowo, można określić zakres czasu, w którym szukamy interesujących nas strumieni. Należy pamiętać, że czasy aktywności strumieni mogą być bardzo rozległe.

# nfdump -t 2012/08/28.07:00:00-2012/08/28.16:00:00 -R /var/cache/nfdump/ | tail

Agregacja danych

Przełącznik -A pozwala agregować dane o strumieniach:

# nfdump -R /var/cache/nfdump/ -A proto,dstip,dstport  | head

Sortowanie

Do tworzenia rankingów strumieni, posortowanych wg różnych kryteriów, używamy opcji -s. Oto kilka przykładów.

Lista dziesięciu IP, które nadawały najwięcej danych:

# nfdump -R /var/cache/nfdump/ -s srcip/bytes

Lista 10 adresów IP, które stworzyły najwięcej strumieni:

# nfdump -R /var/cache/nfdump/ -s srcip/flows

Rotacja logów nfdump

Ilosć danych Netflow z aktywnie eksploatowanych urządzeń, takich jak firewalle czy routery, może być bardzo duża. Należy uważnie kontrolować pojemność zasobów dyskowych przechowujących logi i nie dopuszczać do przepełnienia. Do zarządzania rotacją logów nfdump służy polecenie nfexpire. Za jego pomocą można łatwo określić limit ilości składowanych danych.

Wyświetlenie statystyk rotacji

Poniższy przykład pokazuje, jak zbadać aktualne ustawienie i status rotacji logów.

# nfexpire -l /var/cache/nfdump/
Include nfcapd bookeeping record in /var/cache/nfdump/
First:     2012-08-21 07:41:00
Last:      2012-08-23 11:36:31
Lifetime:  186931 = 2.2 days
Numfiles:  341
Filesize:  50335744 = 48.0 MB
Max Size:  <none>
Max Life:  <none>
Watermark: 95%
Status:    OK 

Automatyczna rotacja logów

Demon nfcapd posiada przełącznik -e, jednak w używanej przeze mnie wersji (1.6.1 Debian) nie działa on poprawnie. Teoretycznie pozwala na bezobsługową rotację. W zastępstwie korzystamy z crond.

Konfiguracja rotacji logów wg rozmiaru jest możliwa dzięki wydaniu polecenia:

# nfexpire -s 100M -e /var/cache/nfdump/
Include nfcapd bookeeping record in /var/cache/nfdump/
Expired files: 0
Expired file size: 0 B
Expired time range: 0 sec
First:     2012-08-21 07:41:00
Last:      2012-08-23 11:37:07
Lifetime:  186967 = 2.2 days
Numfiles:  342
Filesize:  51736576 = 49.3 MB
Max Size:  104857600 = 100.0 MB
Max Life:  <none>
Watermark: 95%
Status: OK

Ustawia ono “quotę” (bez związku z quotami systemu plików) 100M i tworzy plik statusu, z którego korzysta nfcapd i kolejne użycia nfexpire:

# cat /var/cache/nfdump/.nfstat
first=1345527660
last=1345714627
size=51736576
maxsize=104857600
numfiles=342
lifetime=0
watermark=95
status=0

Rotacja za pomocą crond

Automatyczne zwalnianie miejsca dla nowych logów zapewnia wpis w crontab:

*/15 * * * * root /usr/bin/nfexpire -e /var/cache/nfdump > /dev/null

Troubleshooting

Problemy z przesyłaniem danych do odbiornika

W przypadku wątpliwości co do funkcjonowania transferu informacji o strumieniach między nadajnikiem a odbiornikiem, możemy użyć klasycznego sniffera tcpdump lub bardziej specjalistycznego narzędzia, np. tshark. Jest to tekstowa wersja popularnego wireshark, tak jak on wyposażona w dekoder protokołów. Dzięki temu można wstępnie zweryfikować transfer i spójność danych. Przykład użycia:

# tshark -d udp.port==9995,cflow port 9995
Running as user "root" and group "root". This could be dangerous. Capturing on eth0
0.000000 10.2.1.252 -> 10.2.1.185 CFLOW total: 30 (v5) flows
0.000017 10.2.1.252 -> 10.2.1.185 CFLOW total: 30 (v5) flows
0.000043 10.2.1.252 -> 10.2.1.185 CFLOW total: 30 (v5) flows
0.000051 10.2.1.252 -> 10.2.1.185 CFLOW total: 30 (v5) flows
0.000070 10.2.1.252 -> 10.2.1.185 CFLOW total: 30 (v5) flows