NetFlow Input Filters
 

Funkcjonalność NetFlow Input Filters daje możliwość zbierania informacji na temat tylko wybranej przez nas części ruchu. Przykładowo, mogą być to przepływy związane z jakimiś protokołami, aplikacjami lub adresami IP serwerów, które z naszego punktu wiedzenia są ważne i wymagają monitorowania. Ponadto, dla każdej zdefiniowanej klasy ruchu możemy zbierać informacje z wszystkich pakietów lub określić częstotliwość ich samplowania..


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


Konfiguracja NetFlow Input Filters realizowana jest za pośrednictwem MQC (Modular QoS Command-Line Interface).

W ramach polityki (policy-map) MQC może zostać zdefiniowanych wiele różnych akcji, jakie mają zostać wykonane dla różnych klas ruchu (class-map). Jedną z nich jest zbieranie informacji o przepływach (netflow-sampler). Akcje te są wykonywane tylko w przypadku, kiedy ruch spełni kryteria (match) zdefiniowane wewnątrz klasy (class-map). Skonfigurowane polityki (policy-map) można przypiąć na wejściu (service-policy input) lub wyjściu (service-policy output) interfejsu/podinterfejsu.

Do wskazania interesującego nas ruchu, możemy posłużyć się wieloma kryteriami. Pełna ich lista została zaprezentowana poniżej ('match ?'). Najczęściej stosuje się bity CoS/802.1p przenoszone w znaczniku 802.1Q ramki Ethernetbity Experimental przenoszone w etykietach MPLSbity IP Precedence/DSCP przenoszone w pakiecie IPlisty ACL (Access Control List) klasyfikujące ruch lub protokół/aplikację obsługiwaną przez NBAR (Network-Based Application Recognition).

R4(config)# class-map ?    
  WORD       class-map name
  match-all  Logical-AND all matching statements under this classmap
  match-any  Logical-OR all matching statements under this classmap
  type       Configure CPL Class Map
 
R4(config)# class-map Traffic-Class-1-CM 
R4(config-cmap)# ?
Class-map configuration commands:
  description  Class-Map description
  exit         Exit from class-map configuration mode
  match        classification criteria
  no           Negate or set default values of a command
 
R4(config-cmap)# match ?
  access-group         Access group
  any                  Any packets
  application          Application to match
  class-map            Class map
  cos                  IEEE 802.1Q/ISL class of service/user priority values
  destination-address  Destination address
  discard-class        Discard behavior identifier
  dscp                 Match DSCP in IPv4 and IPv6 packets
  fr-de                Match on Frame-relay DE bit
  fr-dlci              Match on fr-dlci
  input-interface      Select an input interface to match
  ip                   IP specific values
  metadata             Metadata to match
  mpls                 Multi Protocol Label Switching specific values
  not                  Negate this match result
  packet               Layer 3 Packet length
  precedence           Match Precedence in IPv4 and IPv6 packets
  protocol             Protocol
  qos-group            Qos-group
  service              Service Instance to match
  source-address       Source address
  vlan                 VLANs to match
 
R4(config-cmap)# match

Po utworzeniu class-map'y, możemy ją zastosować w wielu policy-map'ach, które mogą zostać przypięte do wielu interfejsów. W naszym przykładzie, do klasyfikacji ruchu zostanie wykorzystany NBAR.

R4(config)# class-map ICMP-Traffic-CM
R4(config-cmap)# match protocol icmp
R4(config-cmap)# exit
R4(config)# do show class-map
 Class Map match-all ICMP-Traffic-CM (id 1)
   Match protocol icmp
 
 Class Map match-any class-default (id 0)
   Match any 
 
R4(config)#

Poza skonfigurowaną przed chwilą class-map'ą, widać jeszcze 'class-default'. Jest to domyślna klasa, która zawsze istnieje i działa na końcu każdej policy-map. Pasuje do niej cały ruch (kryterium 'match any'). Zwykle jest ona wykorzystywana, kiedy chcemy coś zrobić z ruchem niepasującym do żadnej ze zdefiniowanych przez nas klas. 

Dodamy teraz naszą klasę do polityki. Na jej końcu dodamy też jawnie klasę domyślną. Nie jest to niezbędne, ale dzięki temu będziemy ją widzieli po użyciu polecenia show policy-map.

R4(config)# policy-map Traffic-PM
R4(config-pmap)# class ICMP-Traffic-CM
R4(config-pmap-c)# class class-default
R4(config-pmap-c)# exit
R4(config-pmap)# exit
R4(config)# do show policy-map
  Policy Map Traffic-PM
    Class ICMP-Traffic-CM
    Class class-default
 
R4(config)# 

Powiedzieliśmy sobie wcześniej, że na znajdujących się w ramach polityk klasach może zostać zdefiniowanych wiele różnych akcji. Jedną z takich akcji jest zbieranie informacji o przepływach.

R4(config)# policy-map Traffic-PM 
R4(config-pmap)# class ICMP-Traffic-CM
R4(config-pmap-c)# ?
Policy-map class configuration commands:
  admit            Admit the request for 
  bandwidth        Bandwidth
  compression      Activate Compression
  drop             Drop all packets
  exit             Exit from class action configuration mode
  fair-queue       Enable Flow-based Fair Queuing in this Class
  flow             Flow subcommands
  log              Log IPv4 and ARP packets
  measure          Measure
  netflow-sampler  NetFlow action
  no               Negate or set default values of a command
  police           Police
  priority         Strict Scheduling Priority for this Class
  queue-limit      Queue Max Threshold for Tail Drop
  random-detect    Enable Random Early Detection as drop policy
  service-policy   Configure QoS Service Policy
  set              Set QoS values
  shape            Traffic Shaping
 
R4(config-pmap-c)# netflow-sampler ?
  WORD  Name of the flow sampler
 
R4(config-pmap-c)# 

Parametrem opcji netflow-sampler jest nazwa samplera. Zatem musimy go wcześnie skonfigurować. W naszym przykładzie nie chcemy samplowania ruchu, chcemy zbierać cały ruch ICMP. Stąd w konfiguracji samplera wskażemy, że ma dokonać samplowania 1 pakiet z 1 pakietu. W praktyce oznacza to zbieranie całego ruchu.

R4(config)# flow-sampler-map SAMPLER-1-out-of-1-TNF
R4(config-sampler)# mode random one-out-of 1 

Tak skonfigurowany sampler, został poniżej skonfigurowany jako akcja dla naszej klasy ruchu ICMP.

R4(config)# policy-map Traffic-PM             
R4(config-pmap)# class ICMP-Traffic-CM             
R4(config-pmap-c)# netflow-sampler SAMPLER-1-out-of-1-TNF
R4(config-pmap-c)# exit
R4(config-pmap)# exit
R4(config)# do show policy-map
  Policy Map Traffic-PM
    Class ICMP-Traffic-CM
      netflow-sampler: SAMPLER-1-out-of-1-TNF
    Class class-default
 
R4(config)# 

Na końcu należy przypiąć naszą politykę do interfejsu, na interesującym nas kierunku zbierania informacji. W naszym przypadku będzie to wejście i wyjście interfejsów Gi0/0 i Gi0/2.56 R4.  

R4(config)# interface GigabitEthernet 0/0
R4(config-if)# service-policy input Traffic-PM
R4(config-if)# service-policy output Traffic-PM
R4(config-if)# interface GigabitEthernet 0/2.56
R4(config-subif)# service-policy input Traffic-PM
R4(config-subif)# service-policy output Traffic-PM
R4(config-subif)# end
R4# show ip flow interface 
GigabitEthernet0/0
  ingress MQC netflow-sampler SAMPLER-1-out-of-1-TNF
  egress MQC netflow-sampler SAMPLER-1-out-of-1-TNF
GigabitEthernet0/2.56
  ingress MQC netflow-sampler SAMPLER-1-out-of-1-TNF
  egress MQC netflow-sampler SAMPLER-1-out-of-1-TNF
R4#

Po tej konfiguracji, zostało wygenerowane 100 pakietów ICMP z R1 do R6. Na interfejsie Gi0/2.56 zostało wyłapane po 100 pakietów na wejściu i wyjściu. 

R4# show policy-map interface GigabitEthernet 0/2.56
 GigabitEthernet0/2.56 
 
  Service-policy input: Traffic-PM
 
    Class-map: ICMP-Traffic-CM (match-all)  
      100 packets, 11800 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: protocol icmp
      netflow-sampler: SAMPLER-1-out-of-1-TNF
 
    Class-map: class-default (match-any)  
      13 packets, 2077 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: any 
 
  Service-policy output: Traffic-PM
 
    Class-map: ICMP-Traffic-CM (match-all)  
      100 packets, 11800 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: protocol icmp
      netflow-sampler: SAMPLER-1-out-of-1-TNF
 
    Class-map: class-default (match-any)  
      9 packets, 690 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: any 
R4#

Na interfejsie Gi0/0 wygląda to nieco inaczej. O ile na wejściu zostało wyłapane 100 pakietów, to na wyjściu 0. Spowodowane jest to działaniem technologii MPLS na interfejsie Gi0/0. NBAR ('match protocol') jest w stanie operować tylko na ruchu IP. Dlaczego zatem udało mu się wyłapać coś na wejściu, a nie udało na wyjściu?

W artykule o MPLS-aware NetFlow zostało wspomniane o operacji PHP, której skutkiem jest odebranie na wejściu interfejsu Gi0/0 R4 czystego pakietu IP. Zatem na wejściu interfejsu Gi0/0 R4 mamy do czynienia z ruchem IP, a na wyjściu z ruchem MPLS. Na pewno też nie pomoże nam zamiana NBAR na ACL, gdyż ona też operuje tylko na ruchu IP (zostało to sprawdzone i efekt był ten sam).

R4# show policy-map interface gigabitEthernet 0/0
 GigabitEthernet0/0 
 
  Service-policy input: Traffic-PM
 
    Class-map: ICMP-Traffic-CM (match-all)  
      100 packets, 11400 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: protocol icmp
      netflow-sampler: SAMPLER-1-out-of-1-TNF
 
    Class-map: class-default (match-any)  
      2314 packets, 189552 bytes
      5 minute offered rate 1000 bps, drop rate 0000 bps
      Match: any 
 
  Service-policy output: Traffic-PM
 
    Class-map: ICMP-Traffic-CM (match-all)  
      0 packets, 0 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: protocol icmp
      netflow-sampler: SAMPLER-1-out-of-1-TNF
 
    Class-map: class-default (match-any)  
      2285 packets, 242087 bytes
      5 minute offered rate 1000 bps, drop rate 0000 bps
      Match: any 
R4# 

NBAR zaczyna wyłapywać ruch ICMP w ruchu MPLS po wpisaniu clear interface GigabitEthernet 0/0 ("Clear the hardware logic on an interface") lub po restarcie routera poleceniem reload. Niemniej, zgodnie z dokumentacją NBAR dla ruchu MPLS nie jest wspierane. Po ponownym restarcie routera nadal wszystko działało i ruch był wyłapywany.

Należy uważać na pierwsze polecenie, gdyż spowoduje ono chwilową utratę połączenia do routera. Router też przestanie przekazywać pakiety. Poniżej można zobaczyć klasyfikację ruchu ICMP na wyjściu interfejsu Gi0/0 R4 oraz stosowny rekord przepływu w Main Cache.

R4# show policy-map interface GigabitEthernet 0/0
 GigabitEthernet0/0 
 
  Service-policy input: Traffic-PM
 
    Class-map: ICMP-Traffic-CM (match-all)  
      600 packets, 68400 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: protocol icmp
      netflow-sampler: SAMPLER-1-out-of-1-TNF
 
    Class-map: class-default (match-any)  
      3186 packets, 262951 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: any 
 
  Service-policy output: Traffic-PM
 
    Class-map: ICMP-Traffic-CM (match-all)  
      200 packets, 23600 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: protocol icmp
      netflow-sampler: SAMPLER-1-out-of-1-TNF
 
    Class-map: class-default (match-any)  
      2155 packets, 221539 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: any 
R4# show ip cache verbose flow
IP packet size distribution (6700 total packets):
   1-32   64   96  128  160  192  224  256  288  320  352  384  416  448  480
   .002 .040 .092 .865 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000
 
    512  544  576 1024 1536 2048 2560 3072 3584 4096 4608
   .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000
 
IP Flow Switching Cache, 278544 bytes
  4 active, 4092 inactive, 17 added
  925 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 34056 bytes
  0 active, 1024 inactive, 0 added, 0 added to flow
  0 alloc failures, 0 force free
  1 chunk, 1 chunk added
  last clearing of statistics never
Protocol         Total    Flows   Packets Bytes  Packets Active(Sec) Idle(Sec)
--------         Flows     /Sec     /Flow  /Pkt     /Sec     /Flow     /Flow
ICMP                10      0.0       443    95      4.9      62.4      15.5
Total:              10      0.0       443    95      4.9      62.4      15.5
 
SrcIf          SrcIPaddress    DstIf          DstIPaddress    Pr TOS Flgs  Pkts
Port Msk AS                    Port Msk AS    NextHop              B/Pk  Active
IPM: OPkts    OBytes  
Gi0/2.56       172.16.6.1      Gi0/0*         172.16.12.1     01 00  10     100 
0000 /0  0                     0000 /0  0     0.0.0.0               100     0.2
Sampler: 1  Class: 1  FFlags: 05  
 
Pos:Lbl-Exp-S 1:16-0-1
Gi0/2.56       172.16.6.1      Gi0/0          172.16.12.1     01 00  10     302 
0000 /0  0                     0000 /0  0     0.0.0.0                99    24.3
Sampler: 1  Class: 1  
 
Gi0/0          172.16.12.1     Gi0/2.56*      172.16.6.1      01 00  10     300 
0000 /0  0                     0800 /0  0     0.0.0.0               100    24.3
Sampler: 1  Class: 1  FFlags: 01  
 
Gi0/0          172.16.12.1     Gi0/2.56       172.16.6.1      01 00  10     309 
0000 /0  0                     0800 /0  0     0.0.0.0                98    24.3
Sampler: 1  Class: 1  
 
R4# 

Nie każdego może to zadowalać, gdyż zgodnie z dokumentacją nie jest to wspierane. Innym rozwiązaniem może być wcześniejsze oznaczenie ruchu ICMP w polu Experimental etykiety MPLS. Następnie w polityce wyjściowej tego interfejsu, możemy dla tak oznaczonego ruchu uruchomić zbieranie przepływów.

Pole Experimental składa się z 3 bitów, zatem mamy do dyspozycji wartości od 0 do 7. Pamiętając o tym, że podczas enkapsulacji pakietu IP w MPLS realizowane jest mapowanie bajtu ToS/DSCP na bity Experimental, dodamy do naszej polityki dla ruchu ICMP ustawienie wartości DSCP na CS2. Spowoduje to zamapowanie wartości CS2 na wartość 2 w polu Experimental etykiety MPLS.

R4(config)# policy-map Traffic-PM
R4(config-pmap)# class ICMP-Traffic-CM
R4(config-pmap-c)# set ?
  atm-clp        Set ATM CLP bit to 1
  cos            Set IEEE 802.1Q/ISL class of service/user priority
  cos-inner      Set Inner CoS
  discard-class  Discard behavior identifier
  dscp           Set DSCP in IP(v4) and IPv6 packets
  fr-de          Set FR DE bit to 1
  fr-fecn-becn   SET FR FECN-BECN
  ip             Set IP specific values
  mpls           Set MPLS specific values
  precedence     Set precedence in IP(v4) and IPv6 packets
  qos-group      Set QoS Group
  vlan-inner     Set Inner Vlan
 
R4(config-pmap-c)# set dscp cs2 

Następie skonfigurujemy odpowiednią klasę i politykę dla ruchu wychodzącego interfejsu Gi0/0. 

R4(config)# class-map ICMP-Traffic-in-MPLS-CM
R4(config-cmap)# match mpls ?
experimental Match MPLS experimental

R4(config-cmap)# match mpls experimental ?
topmost Match MPLS experimental value on topmost label

R4(config-cmap)# match mpls experimental topmost ?
<0-7> Enter up to 8 experimental values separated by white-spaces

R4(config-cmap)# match mpls experimental topmost 2

R4(config)# policy-map MPLS-Traffic-PM
R4(config-pmap)# class ICMP-Traffic-in-MPLS-CM
R4(config-pmap-c)# netflow-sampler SAMPLER-1-out-of-1-TNF
R4(config-pmap-c)# interface GigabitEthernet 0/0
R4(config-if)# no service-policy output Traffic-PM
R4(config-if)# service-policy output MPLS-Traffic-PM

Teraz ruch jest odpowiednio klasyfikowany i pojawił się w Main Cache stosowny rekord przepływu. Warto zwrócić też uwagę na dodatkową akcję ustawiania DSCP na wartość C2 w polityce Traffic-PM dla klasy ruchu ICMP.

R4# show policy-map interface gigabitEthernet 0/0
 GigabitEthernet0/0 
 
  Service-policy input: Traffic-PM
 
    Class-map: ICMP-Traffic-CM (match-all)  
      1220 packets, 130760 bytes
      5 minute offered rate 1000 bps, drop rate 0000 bps
      Match: protocol icmp
      netflow-sampler: SAMPLER-1-out-of-1-TNF
      QoS Set
        dscp cs2
          Packets marked 100
 
    Class-map: class-default (match-any)  
      5584 packets, 463354 bytes
      5 minute offered rate 2000 bps, drop rate 0000 bps
      Match: any 
 
  Service-policy output: MPLS-Traffic-PM
 
    Class-map: ICMP-Traffic-in-MPLS-CM (match-all)  
      100 packets, 11800 bytes
      5 minute offered rate 1000 bps, drop rate 0000 bps
      Match: mpls experimental topmost 2 
      netflow-sampler: SAMPLER-1-out-of-1-TNF
 
    Class-map: class-default (match-any)  
      123 packets, 13255 bytes
      5 minute offered rate 2000 bps, drop rate 0000 bps
      Match: any 
R4# show ip cache verbose flow
IP packet size distribution (10651 total packets):
   1-32   64   96  128  160  192  224  256  288  320  352  384  416  448  480
   .005 .125 .249 .619 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000
 
    512  544  576 1024 1536 2048 2560 3072 3584 4096 4608
   .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000
 
IP Flow Switching Cache, 278544 bytes
  4 active, 4092 inactive, 33 added
  3245 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 34056 bytes
  0 active, 1024 inactive, 0 added, 0 added to flow
  0 alloc failures, 0 force free
  1 chunk, 1 chunk added
  last clearing of statistics never
Protocol         Total    Flows   Packets Bytes  Packets Active(Sec) Idle(Sec)
--------         Flows     /Sec     /Flow  /Pkt     /Sec     /Flow     /Flow
ICMP                22      0.0       334    93      2.0     101.5      15.5
Total:              22      0.0       334    93      2.0     101.5      15.5
 
SrcIf          SrcIPaddress    DstIf          DstIPaddress    Pr TOS Flgs  Pkts
Port Msk AS                    Port Msk AS    NextHop              B/Pk  Active
IPM: OPkts    OBytes  
Gi0/2.56       172.16.6.1      Gi0/0*         172.16.12.1     01 40  10     100 
0000 /0  0                     0000 /0  0     0.0.0.0               100     0.2
Sampler: 1  Class: 1  FFlags: 05  
 
Pos:Lbl-Exp-S 1:16-2-1
Gi0/2.56       172.16.6.1      Gi0/0          172.16.12.1     01 40  10     100 
0000 /0  0                     0000 /0  0     0.0.0.0               100     0.2
Sampler: 1  Class: 1  
 
Gi0/0          172.16.12.1     Gi0/2.56*      172.16.6.1      01 40  10     100 
0000 /0  0                     0800 /0  0     0.0.0.0               100     0.2
Sampler: 1  Class: 1  FFlags: 01  
 
Gi0/0          172.16.12.1     Gi0/2.56       172.16.6.1      01 00  10     103 
0000 /0  0                     0800 /0  0     0.0.0.0                98     0.2
Sampler: 1  Class: 1  
 
R4#

Oprócz informacji o ID samplera pojawiło się w rekordach przepływów ID klasy. Jest ona także eksportowane do kolektora, co było widać w artykule o szablonach NetFlow v9. ID klasy, jest numerem klasy w policy-map, a nie jej ID w konfiguracji, którą można zobaczyć wydając polecenie show class-map.

W naszym przypadku zbieranie informacji o ruchu zostało włączone w pierwszej zdefiniowanej w ramach policy-map klasie, stąd wszędzie widać ID z numerem 1. Pomimo tego, że dla ruchu MPLS wykorzystana została inna klasa (class-map), to ID jest to samo, gdyż w ramach innej policy-map znajduje się ona również na pierwszym miejscu. 


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.