目录

前言
基本原理
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