目錄

前言
基本原理
Aggregation
Sampler
Filter
NetFlow 處理流程

前言

NetFlow 讓網管人員可以收集 Packet 的 Header 資訊,從而分析網絡的狀況,包括網絡流量的類型及使用量等。收集和分析這些數據對網絡的監控及持續發展有極大幫助,本文以 Router 上的設定為主,即關於 Packet Header 收集的設定,並未包含使用軟件分析數據的教學。

基本原理

NetFlow 基本分為 Exporter 和 Collector 兩個角色,Exporter 即負責收集 Packet Header 資訊的設備,通常是 Router。Router 會在 Interface 上收集、整合和篩選 Packet Header,然後傳送至 Collector。Collector 則可以是普通 Windows 或 Linux Server,也可以是專門用作收集的 Appliance、VM 等,在 Server 上安裝了軟體便可以把數據作分析、繪圖及產生一些老闆最愛看的流量報告之類,較具名氣的品牌有 Solarwind,如果預算較緊也有 Opensource 的選擇,例如 NfSen。

netflow

以上圖為例子,我們想用 R2 收集 R1 和 R3 之間的流量。假設 R4 是一台 Collector,其 e1/0 的 IP Address 為 192.168.24.4。我們可用以下指令把 R2 設定成 Exporter:

R2(config)#ip flow-export version 9
R2(config)#ip flow-export destination 192.168.24.4 2055

然後在 Interface e1/0 啟動 NetFlow。

R2(config)#interface Ethernet1/0
R2(config-if)#ip flow ingress
R2(config-if)#ip flow egress

Version 可選 1、5 或 9,v1 太舊,一般不用。v5 和 v9 的分別是,v5 送出來的 NetFlow 資訊包中,每筆資料的欄名 (Field Name) 都是預設不可改,而 v9 的欄名則比較 Dynamic,由 NetFlow Template 去定義,所以比較有彈性,Exporter 會定期送一份 NetFlow Template 給 Collector 說明每個欄位的意思。如果 NetFlow Collector 支緩 v9 的話,就選 v9 吧。2055 是 NetFlow 慣用的 UDP Port,也可自行選擇其他 Port,當然 Collector 的接收 Port 設定要相同。完成設定後可以跑 Wireshark Capture R2 的 e1/2 ,然後在 R1 產生一些 Traffic 去 R3 例如 Ping,就會看到 Exporter 把 Traffic Flow 的資訊傳給 Collector。

Wireshark 會捕捉到類似以下這些資訊。

netflow

然後在 Collector 上 (例如:NfSen),大概會看到類似下圖的 Traffic Flow 資訊。

netflow

Flow Cache

但流經 Router 的 Packet 成千上萬,Router 如何判斷那些 Packet 是同一條 Flow?其實 Router 會基於 Packet Header 裡面的 7 個值來判斷,如果全部相同則判斷為同一條 Flow。

  1. Ingress Interface
  2. Source IP
  3. Destination IP
  4. IP Protocol Number
  5. TCP 或 UDP Source Port
  6. TCP 或 UDP Destination Port
  7. IP Type of Service (ToS)

所以 Router 會把收集到的 Packet Header 資訊貯在自己的 Flow Cache 中,並作出統計,到「時機到了」才把資訊傳給 Collector。用指令 show ip cache flow 可以看到這些資訊。

R2#show ip cache flow 
IP packet size distribution (3861 total packets):
   1-32   64   96  128  160  192  224  256  288  320  352  384  416  448  480
   .000 .221 .001 .259 .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 .517 .000 .000 .000 .000 .000 .000 .000

IP Flow Switching Cache, 4456704 bytes
  3 active, 65533 inactive, 9 added
  1623 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 533256 bytes
  3 active, 16381 inactive, 9 added, 9 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
TCP-Telnet           2      0.0         8    45      0.0       2.1       1.0
ICMP                 3      0.0       999   700      2.0      25.9      15.5
IP-other             1      0.0         3    40      0.0       5.0      15.1
          
SrcIf         SrcIPaddress    DstIf         DstIPaddress    Pr SrcP DstP  Pkts
Total:               6      0.0       502   695      2.0      14.5      10.6

SrcIf         SrcIPaddress     DstIf         DstIPaddress     Pr SrcP DstP  Pkts
Et1/1         3.3.3.10         Et1/0*        1.1.1.10         01 0000 0000   265 
Et1/0         1.1.1.10         Et1/1         3.3.3.30         01 0000 0800   265 

何時才是所謂的「時機到了」?看 Active Flow Timeout 和 Inactive Flow Timeout。即是說,一些還在傳輸的 Flow,Router 會每隔 30 分鐘才更新 Collector 一次,而已經完成的 Traffic Flow,在完成後 15 秒,Router 就會告知 Collector。更改 Timeout 指令如下,留意時間單位不同。

R2(config)#ip flow-cache timeout active ?
    Timeout in minutes

R2(config)#ip flow-cache timeout inactive ?
    Timeout in seconds

R2(config)#ip flow-cache timeout active 5
R2(config)#ip flow-cache timeout inactive 10

Aggregation

在 Router 把 Flow Cache 的資訊送給 Collector 之前,可以先做 Aggregation 把資料進一步整合。例如,如果我們不需要 Collector 知道 Flow 來自那個獨立 Source Address,而只希望 Collector 知道 Flow 來自那個 Network Prefix 便足夠了,可以把 Flow 按 Source Prefix 組合起來。

R2(config)#ip flow-aggregation cache source-prefix
R2(config-flow-cache)#export version 9
R2(config-flow-cache)#export destination 192.168.24.4 2055
R2(config-flow-cache)#cache timeout active 5
R2(config-flow-cache)#cache timeout inactive 10
R2(config-flow-cache)#enabled

參數跟上一部份類似,注意要設 enabled 才能把此 Aggregation 生效。然後便可透過 show ip cache flow aggregation source-prefix 指令查看 Aggregation Cache 裡面的資訊,格式跟 Cache Flow 類似。

R2#show ip cache flow aggregation source-prefix

IP Flow Switching Cache, 278544 bytes
  2 active, 4094 inactive, 13 added
  191 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 34056 bytes
  2 active, 1022 inactive, 13 added, 13 added to flow
  0 alloc failures, 0 force free
  1 chunk, 1 chunk added

Src If         Src Prefix      Msk  AS    Flows  Pkts B/Pk  Active
Et1/0          1.1.1.0         /24  0        2   198   100     9.9
Et1/1          3.3.3.0         /24  0        2   198   100     9.9

除了 Source-prefix,還有其他 Aggregation 方法包括:Port、ToS 等。

R2(config)#ip flow-aggregation cache ?
  as                      AS aggregation
  as-tos                  AS-TOS aggregation
  bgp-nexthop-tos         BGP nexthop TOS aggregation
  destination-prefix      Destination Prefix aggregation
  destination-prefix-tos  Destination Prefix TOS aggregation
  prefix                  Prefix aggregation
  prefix-port             Prefix-port aggregation
  prefix-tos              Prefix-TOS aggregation
  protocol-port           Protocol and port aggregation
  protocol-port-tos       Protocol, port and TOS aggregation
  source-prefix           Source Prefix aggregation
  source-prefix-tos       Source Prefix TOS aggregation

Sampler

如果訊息量極多,處理大量的 Packet Header 會消耗 Router 資源,我們可以設定 Sampler,即不處理所有 Packet Header,只抽查部份 Packet Header 來放進 Flow Cache 之中。例如以下設定在 Interface 上每 50 個 Packet 只隨機抽樣 1 個放進 Flow Cache。

R2(config)#flow-sampler-map MAP_NETFLOW_SAMPLER
R2(config-sampler)#mode random one-out-of 50
R2(config-sampler)#exit

把原本的 ip flow 設定拿掉,換成 flow-sampler,預設只有 ingress,如想 egress 也做 Sampler 則需多下一條指令指明 egress。

R2(config)#int ethernet 1/0
R2(config-if)#no ip flow egress
R2(config-if)#no ip flow ingress
R2(config-if)#flow-sampler MAP_NETFLOW_SAMPLER
R2(config-if)#flow-sampler MAP_NETFLOW_SAMPLER egress

使用 Sampler 要注意的是 Sampling Rate 越低 (即 one-out-of 參數越大) 則數據失真越嚴重,Packet 量少的 Traffic Flow 有機會被忽略。另外,Collector 必需設定相同的 Sampling Rate 以便估算實際 Bandwidth 使用量。

Filter

最後,我們還可以用 Filter 決定監察範圍,方法是用 Policy Map 決定把那些 Traffic 打進那一個 Sampler。例如:我們只希望監察由 1.1.1.10 到 3.3.3.10 的 Traffic Flow。

R2(config)#ip access-list extended TRAFFIC     
R2(config-ext-nacl)#permit ip host 1.1.1.10 host 3.3.3.10
R2(config-ext-nacl)#exit
R2(config)#class-map CLASS_FLOW
R2(config-cmap)#match access-group name TRAFFIC
R2(config-cmap)#exit
R2(config)#policy-map POLICY_NETFLOW_FILTER
R2(config-pmap)#class CLASS_FLOW
R2(config-pmap-c)#netflow-sampler MAP_NETFLOW_SAMPLER

在 Interface 上把原有的 Sampler 拿掉,然後使用 Policy。

R2(config)#int ethernet 1/0
R2(config-if)#no flow-sampler MAP_NETFLOW_SAMPLER
R2(config-if)#no flow-sampler MAP_NETFLOW_SAMPLER egress
R2(config-if)#service-policy input POLICY_NETFLOW_FILTER

由於 Policy 通過 Class 來宣告應用那條 Sampler,這意味著我們可以為不同的 Traffic 類型使用不同的 Sampling Rate。

R2#show policy-map POLICY_NETFLOW_FILTER
  Policy Map POLICY_NETFLOW_FILTER
    Class CLASS_1
      netflow-sampler: SAMPLER_1
    Class CLASS_2
      netflow-sampler: SAMPLER_2
    Class CLASS_3
      netflow-sampler: SAMPLER_3
    Class class-default
      netflow-sampler: SAMPLER_DEFAULT

NetFlow 處理流程

最後總結一下整個 NetFlow 處理流程如下圖。

netflow