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.
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
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.
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ą:
-D
- uruchomienie jako demon-l /var/cache/nfdump
- wskazanie miejsca składowania
logów-P /var/run/nfcapd.pid
- wskazanie pidfile-b 10.2.1.185
- nasłuchiwanie na określonym adresie
(UDP)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.
Przedstawienie danych o wszystkich zarejestrowanych strumieniach to kwestia wskazania poleceniu nfdump lokalizacji logów:
# nfdump -R /var/cache/nfdump/ | head -n4
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
Przełącznik -A
pozwala agregować dane o
strumieniach:
# nfdump -R /var/cache/nfdump/ -A proto,dstip,dstport | head
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
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.
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
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
Automatyczne zwalnianie miejsca dla nowych logów zapewnia wpis w crontab:
*/15 * * * * root /usr/bin/nfexpire -e /var/cache/nfdump > /dev/null
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