NetFlow, rodzaje jego pamięci i eksport danych
 

Z usługi NetFlow głównie korzysta się tam, gdzie pojawia się potrzeba gromadzenia informacji o wymienianym ruchu. Poza aspektami prawnymi, które mogą narzucać przetrzymywanie takich informacji, są one często gromadzone z innych powodów. Pozwalają wizualizować aktualny i historyczny przebieg ruchu w sieci, dzięki czemu są dobrą podstawą planowania jej przyszłych zmian oraz obrazowania wpływu tych zmian na jej działanie. Dają możliwość monitorowania działających aplikacji i usług oraz  analizę zachodzących w sieci zdarzeń i anomalii.

Dzięki nim, łatwiej możemy wskazania źródło ataku lub niepowołanego incydentu. Dane te również wykorzystywane są pomiędzy różnymi organizacjami w celach marketingowych lub rozliczeniowych.


Czym są przepływy
 
NetFlow umożliwia dostęp do informacji o przesyłanym w sieci ruchu oraz eksport tych informacji do wskazanego miejsca, nazywanego kolektorem (ang. collector). Informacje te gromadzone są w formie przepływów (ang. flow).
 
Przepływ, to jednokierunkowa sekwencja pakietów o pewnych wspólnych właściwościach. Wspólne właściwości określone są przez pola klucze lub inaczej pola kluczowe (ang. key fields). Dla każdego przepływu istnieje możliwość zbierania dodatkowych, odnoszących się do niego informacji. Są one przetrzymywane w polach nie-kluczach lub inaczej polach niekluczowych (ang. non-key fields). Jako, że wartość pól niekluczowych nie musi być identyczna, to jest ona brana z pierwszego pakietu składającego się na dany przepływ. Nie dotyczy to pól liczników, flag, wartości minimalnych i maksymalnych, które też należą do pól niekluczowych.

Początkowo, przepływy można było zbierać tylko na wejściu interfejsu (ang. ingress), obsługiwany był tylko protokół IP w wersji 4, a pola kluczy były na stałe zdefiniowane i niezmienne. Każdy taki przepływ określany był jako seria pakietów, które posiadają wspólne od 5 do 7 parametrów:

  • interfejs wejściowy (SNMP ifIndex),
  • pola Source i Destination Address w nagłówku protokołu IPv4,
  • pole DSCP (Differentiated Services Code Point), dawniej ToS (Type of Service) w nagłówku IPv4,
  • pole Protocol w nagłówku IPv4,
  • pola Source i Destination Port w nagłówku protokołu TCP/UDP. 

Oczywiście, ostatnie dwa pola klucze dotyczą tylko ruchu TCP/UDP, stąd mamy od 5 do 7 parametrów kluczowych.


Tradictional NetFlow nie obsługuje IPv6 i nie wykrywa UDP-Lite, które stosowane jest tam, gdzie w przypadku IPv6 chcemy uniknąć wyliczania sumy kontrolnej dla każdego datagramu (np. w celu zwiększenia wydajności tuneli CAPWAP działających po IPv6). Oznacza to, że dla ruchu UDP-Lite rozpatrywane będzie tylko 5 pól kluczowych. Wsparcie dla IPv6 pojawiło się wraz z wprowadzeniem Flexible NetFlow.


Pamięć i gromadzenie przepływów
 
Informacja o przepływach zbierane są w pamięci Main Cache. Dostęp do nich można uzyskać za pomocą poleceń show ip cache flow (informacje podstawowe) lub show ip cache verbose flow (informacje rozszerzone). Okrojony wynik tych poleceń można zobaczyć poniżej (nagłówek i cztery przykładowe przepływy):
 
R2# show ip cache flow | begin SrcIf
SrcIf         SrcIPaddress    DstIf         DstIPaddress    Pr SrcP DstP  Pkts
Gi0/1         10.9.200.133    Gi0/0         148.251.239.195 06 C6E1 03E1     1 
Gi0/1         10.9.200.133    Gi0/0         148.251.239.195 06 C6E2 03E1     1 
Gi0/1         10.9.200.133    Gi0/0         148.251.239.195 06 C6FC 03E1     1 
Gi0/1         31.172.177.106  Gi0/0         93.180.166.220  11 0035 F2A4     1 

R2#

Rozszerzone informacje na temat tych samych przepływów widać poniżej:  

R2# show ip cache verbose flow | begin SrcIf
SrcIf          SrcIPaddress    DstIf          DstIPaddress    Pr TOS Flgs  Pkts
Port Msk AS                    Port Msk AS    NextHop              B/Pk  Active
Gi0/1          10.9.200.133    Gi0/0          148.251.239.195 06 00  10       1 
C6E1 /0  0                     03E1 /0  0     0.0.0.0                52     0.0

Gi0/1          10.9.200.133    Gi0/0          148.251.239.195 06 00  10       1 
C6E2 /0  0                     03E1 /0  0     0.0.0.0                52     0.0

Gi0/1          10.9.200.133    Gi0/0          148.251.239.195 06 00  10       1 
C6FC /0  0                     03E1 /0  0     0.0.0.0                52     0.0

Gi0/1          31.172.177.106  Gi0/0          93.180.166.220  11 00  10       1 
0035 /0  0                     F2A4 /0  0     0.0.0.0               190     0.0

R2#

Ilość gromadzonych informacji zależna jest od konfiguracji pamięci Main Cache. Domyślnie, kiedy przepływ wygaśnie, jest usuwany z Main Cache i może zostać wyeksportowany do kolektora lub przeniesiony do któregoś ze wcześniej skonfigurowanych Aggregation Caches.

Przykład Aggregation Caches, w którym odbywa się agregacja informacji w oparciu o Destination Prefix można zobaczyć poniżej (nagłówek i zagregowane przepływy)

R2# show ip cache flow aggregation destination-prefix | begin Dst If
Dst If         Dst Prefix      Msk  AS    Flows  Pkts B/Pk  Active
Null           224.0.0.0       /8   0        1     1    58     0.0
Gi0/1          93.157.73.0     /24  0        1     2    58     0.0
Null           93.157.73.24    /29  0        4    13    76    17.2
Local          10.10.255.1     /32  0        6    18    44    27.4
Gi0/1          93.157.72.0     /23  0        1     4   292     9.0
Gi0/0          216.0.0.0       /8   0        1     6   612     9.0
Tu1            10.8.0.0        /16  0        1     2    58     0.0

R2# 

Wykorzystanie Aggregation Caches wymaga ich wcześniejszego konfiguracji. Bez tego dane są po prostu usuwane z Main Cache lub eksportowane, jeśli również zostało to wcześniej odpowiednio skonfigurowane.


Przebieg wędrowania przepływów

 


Zatem w Main Cache przetrzymywane są tylko informacje o aktywnych przepływach, do których dostęp można uzyskać bezpośrednio na urządzeniu, które je zbiera. Urządzenie zakłada, że przepływ wygasł, jeśli:

  • połączenie ruchu TCP zostało zamknięte (FIN) lub zresetowane (RST),
  • brak jest ruchu związanego z danym przepływem (inactive time, domyślnie 15 sekund),
  • żyje zbyt długo (active time, domyślnie 30 minut).

Zmian domyślnych wartości czasowych przetrzymywania przepływów w Main Cache można dokonać poleceniami:

R2(config)# ip flow-cache timeout active ?
<1-60> Timeout in minutes
R2(config)# ip flaw-cache timeout active 30
R2(config)# ip flow-cache timeout inactive ?
<10-600> Timeout in seconds
R2(config)# ip flaw-cache timeout inactive 15

Z każdym pakietem aktywnego przepływu aktualizowane są dane na jego temat i resetowana jest wartość czasu 'inactive'. Licznik czasu 'active' rozpoczyna swoje działanie z pierwszym pakietem dla danego przepływu. Po jego wygaśnięciu, przepływ może zostać wysłany do kolektora i jeśli tylko ruch związany z tym przepływem nadal istnieje, to na jego miejscu pojawia się identyczny wpis, dla którego zbierane są nowe dane statystyczne.

Z każdym wyeksportowanym przepływem powiązane są informacje czasowe (Start Time i End Time), dzięki którym kolektor jest w stanie scalić je w jeden przepływ. Przepływy usuwane są z Main Cache również w przypadku jego zapełnienia. Gdy zacznie brakować miejsca przyjmuje się, że w pierwszej kolejności wygaśnięciu podlegają przepływy, które są najstarsze. Tak naprawdę, juz kiedy zaczyna go brakować, załączana jest specjalna funkcja heurystyczna, której zadaniem jest szybsze wygasanie przepływów (szybsze, niż wartość licznika 'inactive'). Domyślny Main Cache obsługuje 4096 przepływów i można zmienić to poniższym poleceniem.

R2(config)# ip flow-cache entries ?
<1024-524288> Entries

R2(config)# ip flow-cache entries 65536
%The change in number of entries will take effect after either
the next reboot or when netflow is turned off on all interfaces.
R2(config)#

Zwiększając ilość obsługiwanych przepływów, należy pamiętać o tym, że jeden wpis potrzebuje minimum 64 bajtów pamięci. Zatem dla 65536 wpisów będziemy potrzebować minimum 4MB pamięci. Minimum, gdyż ilości informacji przetrzymywaną o każdym przepływie można rozszerzyć. Poniżej można zobaczyć pełną zawartość Main Cache. Oprócz samych przepływów, znajdują się tam informacje statystyczne oraz informacje o wykorzystaniu i konfiguracji Main Cache. Wdać, żę aktualnie w pamięci (IP Flow Swiching Cache) jest 37 aktywnych wpisów i zostało 4059 wolnych miejsc na przepływy (nie wszystkie przepływy zostały pokazane).

Od 1d01h (last clearing of statistics) urządzenie utworzyło w pamięci 77335 wpisów dla nowych przepływów, a NetFlow sprawdzał 1966767 (ager polls) razy, czy nie należy przedawnić któregoś z nich. 0 (flow alloc failures) razy doszło do problemu z alokacją przestrzeni dla nowego wpisu. NetFlow zużywa 278544 bajtów pamięci (zaalokowana pamięć dla maksymalnej ilości wpisów).


IP Sub Flow Cache wykorzystywane jest przy włączeniu agregacji lub eksportu. Trafiają tam tymczasowo przepływy, które wygasły. Ilość wpisów aktywnych rośnie, kiedy dane trafiają do eksportu/zagregowania, a spada kiedy zostanie to wykonane, np. zostanie wysłany pakiet do kolektora. Pamięć ta składa się z kawałków po 1024 bajty (chunk). Widać, że został zaalokowany 1 kawałek. Poniżej w wyniku debug widać, że maksymalnie dostępnych jest ich 48.


R2# show ip cache flow      
IP packet size distribution (1201032 total packets):
   1-32   64   96  128  160  192  224  256  288  320  352  384  416  448  480
   .001 .312 .264 .016 .006 .003 .005 .002 .001 .002 .001 .001 .000 .000 .000
 
    512  544  576 1024 1536 2048 2560 3072 3584 4096 4608
   .000 .002 .001 .005 .369 .000 .000 .000 .000 .000 .000
 
IP Flow Switching Cache, 278544 bytes
  37 active, 4059 inactive, 77335 added
  1966767 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 34056 bytes
  74 active, 950 inactive, 154670 added, 77335 added to flow
  0 alloc failures, 0 force free
  1 chunk, 3 chunks added
  last clearing of statistics 1d01h
Protocol         Total    Flows   Packets Bytes  Packets Active(Sec) Idle(Sec)
--------         Flows     /Sec     /Flow  /Pkt     /Sec     /Flow     /Flow
TCP-Telnet        1913      0.0         1    56      0.0       0.2      15.4
TCP-FTP             23      0.0         1    44      0.0       0.2      15.5
TCP-WWW           3385      0.0        69  1003      2.5       1.3      10.4
TCP-SMTP           101      0.0         7    46      0.0       0.3       2.5
TCP-X              222      0.0         1    40      0.0       0.0      15.3
TCP-NNTP             1      0.0         1    40      0.0       0.0      15.3
TCP-other        38624      0.4        14   768      6.1       5.7      13.7
UDP-DNS           3824      0.0         1    75      0.0       0.0      15.5
UDP-NTP           2443      0.0         1    76      0.0       0.5      15.5
UDP-TFTP            10      0.0         1    42      0.0       0.0      15.3
UDP-other        11981      0.1         2   171      0.3       4.6      15.5
ICMP              7015      0.0         3   111      0.2      18.9      15.0
IP-other          7739      0.0        40    79      3.3      36.9      15.2
Total:           77281      0.8        15   599     12.7       9.1      14.3
 
SrcIf         SrcIPaddress    DstIf         DstIPaddress    Pr SrcP DstP  Pkts
Gi0/1         10.10.201.210   Gi0/0         172.217.21.46   06 C0C6 01BB     1 
Gi0/1         10.10.201.121   Gi0/0         216.58.209.78   06 C9BB 01BB     5
 

R2# 

Informacje statystyczne na temat przepływów można wyczyścić poleceniem (wyzerowane/usunięte zostaną fragmenty wyniku powyższego polecenia oznaczone zieloną czcionką za wyjątkiem informacji nagłówkowych/legend):

R2# clear ip flow stats

Dokładniejsze informacje, związane z alokacją przestrzeni pamięci na potrzeby działania NetFlow, można zobaczyć po włączeniu debug ip flow cache. Następnie należy wyłączyć i wyłączyć protokół NetFlow.

R4# debug ip flow cache 
IP Flow cache allocation debugging is on
R4# conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R4(config)# interface GigabitEthrnet 0/0
R4(config-if)# no ip flow ingress 
*Aug 19 14:05:42.225 UTC: IPFLOW: Freeing flow cache
*Aug 19 14:05:42.225 UTC: IPFLOW: Sub-Flow cache removed
*Aug 19 14:05:42.225 UTC: IPFLOW: Last flow capture removed. Freeing cache.
*Aug 19 14:05:42.225 UTC: IPFLOW: Last flow capture removed. Freeing cache.
R4(config-if)# ip flow ingress 
R4(config-if)#
*Aug 19 14:05:49.335 UTC: IPFLOW: Total memory available for flow cache: 95235899
    Initial number of flow entries: 4096
*Aug 19 14:05:49.335 UTC: IPFLOW: Calculated numbers *before* cache allocation are:
    4096 hash buckets, 16384 hash size, 64 entry size,
    4096 desired flow entries, 1024 flow entries per block,
    4 total cache blocks.
*Aug 19 14:05:49.335 UTC: IPFLOW: Alloced 4096 flow entries from a desired 4096 entries
    Allocated: 4096 hash buckets
    Total flow cache size = 278544
*Aug 19 14:05:49.335 UTC: IPFLOW: Sub-Flow table enabled.
*Aug 19 14:05:49.335 UTC: IPFLOW: Sub-Flow numbers are:
    1024 sub-flows per chunk, 512 hashflag len,
    1 chunks allocated, 48 max chunks,
    1024 allocated records, 1024 free records, 34056 bytes allocated
*Aug 19 14:05:49.335 UTC: Flow MPLS feature has been enabled on an interface
*Aug 19 14:05:49.335 UTC: IPFLOW: Allocated and initiated cache table
R4(config-if)#

Istnieje 12 predefiniowanych Aggregation Caches, do których trafiają przepływy jakie wygasły w Main Cache. Domyślnie wszystkie są wyłączone. Poniżej można zobaczyć pełną zawartość jednego z Aggregation Caches (Destination Prefix). Oprócz zagregowany przepływów, znajdują się tam informacje na temat konfiguracji i wykorzystania tego Aggregation Cache. Domyślnie mieści on tak samo jak Main Cache 4096 przepływów.

R2# show ip cache flow aggregation ?
  as                      AS aggregation cache
  as-tos                  AS TOS aggregation cache
  bgp-nexthop-tos         BGP nexthop TOS aggregation cache
  destination-prefix      Destination Prefix aggregation cache
  destination-prefix-tos  Destination Prefix TOS aggregation cache
  prefix                  Source/Destination Prefix aggregation cache
  prefix-port             Source/Destination Prefix port aggregation cache
  prefix-tos              Source/Destination Prefix TOS aggregation cache
  protocol-port           Protocol and port aggregation cache
  protocol-port-tos       Protocol, port, TOS aggregation cache
  source-prefix           Source Prefix aggregation cache
  source-prefix-tos       Source Prefix TOS aggregation cache
 
R2# show ip cache flow aggregation destination-prefix
 
IP Flow Switching Cache, 278544 bytes
  5 active, 4091 inactive, 118 added
  2336 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 34056 bytes
  5 active, 1019 inactive, 36702 added, 36702 added to flow
  0 alloc failures, 0 force free
  1 chunk, 2 chunks added
 
Minimum destination mask is configured to /8
 
Dst If         Dst Prefix      Msk  AS    Flows  Pkts B/Pk  Active
Null           224.0.0.0       /8   0        1     1    58     0.0
Gi0/1          93.157.73.0     /24  0        1     2    58     0.0
Null           93.157.73.24    /29  0        4     8    70    29.8
Null           10.10.99.0      /24  0        1     1    76     0.0
Tu1            10.8.0.0        /16  0        1     2    58     0.0

R2#

Kiedy zagregowana informacja o przepływie/przepływach trafi do któregoś z Aggregation Caches, podlega podobnym zasadom jak wpisy w Main Cache. Rozpatrywane są lokalne dla danego Aggregation Cache ustawieniam czasów 'active' i 'inactive' oraz ilości przetrzymywanych w nim wpisów 'entries'. Różnicą jest nie rozpatrywanie flag ruchu TCP, gdyż żaden ze schematów agregacji ich nie obsługuje/używa. Zmian domyślnych wartości czasów wygasania przepływów aktywnych i nieaktywnych oraz ich obsługiwanej ilości, można dokonać per każdy Aggregation Cache w kontekście jego konfiguracji. Poniżej widać przykład dla Destination Prefix Aggragation Cache.

R2(config)# ip flow-aggregation cache destination-prefix
R2(config-flow-cache)# cache timeout active ?
  <1-60>  Timeout in minutes

R2(config-flow-cache)# cache timeout active 30
R2(config-flow-cache)# cache timeout inactive ?
  <10-600>  Timeout in seconds

R2(config-flow-cache)# cache timeout inactive 15
R2(config-flow-cache)# cache entries ?
  <1024-524288>  Entries

R2(config-flow-cache)# cache entries 65536 
%The change in number of entries will take effect after either the next reboot or when netflow is turned off on all interfaces.
R2(config-flow-cache)#

Rodzaj i ilość danych eksportowanych do kolektora zależy od wybranej wersji eksportu danych. Należy pamiętać, że niekoniecznie wszystkie informacje, jaki można zobaczyć w Main Cache będą eksportowane i niekoniecznie wszystkie będą wspierane przez kolektor. Dostępnych jest kilka wersji formatu eksportu danych NetFlow.


Export danych o przepływach
 
Mamy możliwość eksportu informacji do maksymalnie dwóch kolektorów per cache. Poniżej znajdują się przykładowe polecenia umożliwiające skonfigurowanie wersji eksportu danych i zdefiniowanie kolektorów (adres IP i numer portu UDP). Polecenia trybu konfiguracji globalnej dotyczą Main Cache, a pozostałe Destination Prefix Aggregation Cache.
 
R2(config)# do show version | include Cisco IOS Software
Cisco IOS Software, C3900 Software (C3900-UNIVERSALK9-M), Version 15.3(3)M6, RELEASE SOFTWARE (fc1)
R2(config)# ip flow-export version ?
  1  
  5
  9
 
R2(config)# ip flow-export version 1
R2(config)# ip flow-export destination 10.246.4.91 9995
R2(config)# ip flow-export destination 10.246.4.92 9995
R2(config)# ip flow-export destination 10.246.4.93 9995
%Exceeded maximum export destinations
R2(config)# ip flow-aggregation cache destination-prefix  
R2(config-flow-cache)# export version ?
  8  Version 8 export format
  9  Version 9 export format
 
R2(config-flow-cache)# export version 8
R2(config-flow-cache)# export destination 10.246.4.91 9995
R2(config-flow-cache)# export destination 10.246.4.92 9995
R2(config-flow-cache)# export destination 10.246.4.93 9995
%Exceeded maximum export destinations
R2(config-flow-cache)# do show running-config | include export destination
ip flow-export destination 10.246.4.91 9995
ip flow-export destination 10.246.4.92 9995
 export destination 10.246.4.91 9995
 export destination 10.246.4.92 9995
R2(config)# 

Podsumowanie
 
Przekazaliśmy tutaj tylko ogólne informacje na temat protokołu NetFlow, jego pamięciach i eksporcie danych. Ważne by pamiętać, że NetFlow składa się z dwóch konfigurowalnych komponentów. Jeden zajmuje się obsługą przepływów w lokalnej pamięci urządzenia, a drugi ich eksportem do kolektora. 
 
Do głównych zastosowań zebranych danych o przepływach ruchu można zaliczyć:
  • obrazowanie wykorzystania dostępnych łącz,
  • analiza wykorzystywanych w sieci aplikacji i usług,
  • analiza wpływu wprowadzonych zmian na ruch w sieci,
  • wykrywanie i obrazowanie anomalii,
  • wykrywanie i klasyfikacja zagrożeń,
  • identyfikacja źródła zgłoszonego/wykrytego incydentu,
  • rozliczenia (systemy billingowe),
  • diagnoza i rozwiązywanie problemów,
  • planowania rozbudowy i zmian,
  • profilowania użytkowników i aplikacji. 

Zainteresowanych zbieraniem danych o ruchu oraz jego analizą zachęcamy do zapoznania się z Cisco Stealthwatch.


Poniżej widać kilka zrzutów graficznych z kolektora (nfsen), gdzie widać przykład wizualizacji ruchu. W łatwy sposób można zaznaczyć interesujący nas fragment wykresu, by zobaczyć składający się na niego ruch.

Dzięki temu nie tylko wiemy ile ruchu pojawiło się w naszej sieci, ale też co to był za ruch. 



 



Tradictional NetFlow (TNF) jest starszym sposobem konfiguracji NetFlow, który stosowany był od początku jego powstania. Obecnie dostępny jest też nowy sposób konfiguracji, o nazwie Flexible NetFlow (FNF).


Zapraszamy do kontaktu drogą mailową This email address is being protected from spambots. You need JavaScript enabled to view it. lub telefonicznie +48 797 004 932.