🗣️

netflow の練習

2023/01/28に公開

netflow

ネットワークを流れるトラフィックの統計情報などを取得する機能です。
統計情報はフローコレクタと呼ばれるサーバへ転送することができます。

https://e-words.jp/w/NetFlow.html

td-agent

td-agent(fluentd) をフローコレクタとして利用するために、td-agent と netflowプラグインをインストールします。

$ curl -fsSL https://toolbelt.treasuredata.com/sh/install-debian-buster-td-agent4.sh | sudo sh 
$ sudo td-agent-gem install fluent-plugin-netflow

以下のように設定を追加します。

$ sudo cp -pi /etc/td-agent/td-agent.conf{,.000}
$ sudo vi /etc/td-agent/td-agent.conf
$ diff -u /etc/td-agent/td-agent.conf{,.000}
@@ -126,15 +126,3 @@
 #    path /var/log/td-agent/td-%Y-%m-%d/%H.log
 #  </store>
 #</match>
-
-<match netflow.*>
-  @type stdout
-</match>
-
-<source>
-  @type netflow
-  tag netflow.event
-  port 5141
-  versions [5, 9]
-</source>

設定を追加したら td-agent を再起動します。

$ sudo td-agent --dry-run
$ sudo systemctl restart td-agent.service

td-agent(fluentd) で収集したデータを elasticsearch に喰わせて kibana で可視化することができますが、ここではデータ収集のみにとどめます。

Netflow version 5

Netflow にはいくつかのバージョンがあります。
バージョン5は標準的なもので、所定のキーに基づいてパケットを識別して、所定の統計情報を収集します。

インタフェースに適用します。
必要に応じて、受信方向の統計を取る場合は ingress、送信方向なら egress を指定します。

r1(config)#int s1/0
r1(config-if)#ip flow ingress
r1(config-if)#ip flow egress

フローエクスポータを指定します。

r1(config)#ip flow-export version 5
r1(config)#ip flow-export destination 10.2.0.1 5141 udp
r1(config)#ip flow-export source fa0/0

設定内容は、show ip flow interface、show ip flow export で確認することができます。

フローのキャッシュの内容は下記で確認することができます。

r1#show ip cache flow
IP packet size distribution (0 total packets):
   1-32   64   96  128  160  192  224  256  288  320  352  384  416  448  480
   .000 .000 .000 .000 .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
  0 active, 4096 inactive, 0 added
  0 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 25800 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

SrcIf         SrcIPaddress    DstIf         DstIPaddress    Pr SrcP DstP  Pkts

ping を打って、キャッシュの内容を確認します。

r1#show ip cache flow
IP packet size distribution (24 total packets):
   1-32   64   96  128  160  192  224  256  288  320  352  384  416  448  480
   .000 .000 .000 1.00 .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
  5 active, 4091 inactive, 5 added
  43 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 25800 bytes
  5 active, 1019 inactive, 5 added, 5 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

SrcIf         SrcIPaddress    DstIf         DstIPaddress    Pr SrcP DstP  Pkts
Se1/0         172.16.0.254    Se1/0         172.16.0.254    01 0000 0000     5
Se1/0         172.16.0.254    Se1/0*        172.16.0.254    01 0000 0000     5

SrcIf         SrcIPaddress    DstIf         DstIPaddress    Pr SrcP DstP  Pkts
Se1/0         172.16.0.254    Local         172.16.0.253    01 0000 0800     5
r1#show ip cache flow
IP packet size distribution (29 total packets):
   1-32   64   96  128  160  192  224  256  288  320  352  384  416  448  480
   .000 .000 .000 1.00 .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
  1 active, 4095 inactive, 6 added
  87 ager polls, 0 flow alloc failures
  Active flows timeout in 30 minutes
  Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 25800 bytes
  1 active, 1023 inactive, 6 added, 6 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                 5      0.0         4   100      0.0       0.1      15.1
Total:               5      0.0         4   100      0.0       0.1      15.1

SrcIf         SrcIPaddress    DstIf         DstIPaddress    Pr SrcP DstP  Pkts

SrcIf         SrcIPaddress    DstIf         DstIPaddress    Pr SrcP DstP  Pkts
Se1/0         172.16.0.254    Local         172.16.0.253    01 0000 0800     5

fluentd に送信されたログを確認します。

admin@ip-10-0-0-73:~/zenn$ sudo tail -f /var/log/td-agent/td-agent.log

2002-03-01 09:18:31.000000000 +0900 netflow.event: {"version":5,"uptime":1111508,"flow_records":1,"flow_seq_num":6,"engine_type":0,"engine_id":0,"sampling_algorithm":0,"sampling_interval":0,"ipv4_src_addr":"172.16.0.254","ipv4_dst_addr":"172.16.0.253","ipv4_next_hop":"0.0.0.0","input_snmp":3,"output_snmp":0,"in_pkts":5,"in_bytes":500,"first_switched":"2002-03-01T00:18:04.967Z","last_switched":"2002-03-01T00:18:05.059Z","l4_src_port":0,"l4_dst_port":2048,"tcp_flags":16,"protocol":1,"src_tos":0,"src_as":0,"dst_as":0,"src_mask":24,"dst_mask":24,"host":"10.2.0.254"}

Flexible Netflow

Flexible Netflow では、フローを識別するキーと、統計情報を収集するフィールドを柔軟に指定することができます。
これは フローレコード で設定します。

r1(config)#flow record FLOWRECORD
r1(config-flow-record)#match ipv4 source address
r1(config-flow-record)#match ipv4 destination address
r1(config-flow-record)#match transport source-port
r1(config-flow-record)#match transport destination-port
r1(config-flow-record)#collect counter bytes
r1(config-flow-record)#collect counter packets

Flexible Netflow では、出力フォーマットを指定することができます。
これは フローエクスポータ で設定します。(ここではデフォルトのままとしています。)

r1(config)#flow exporter FLOWEXPORTER
r1(config-flow-exporter)#destination 10.2.0.1
r1(config-flow-exporter)#source fa0/0
r1(config-flow-exporter)#transport udp 5141

フローモニター で、設定したフローレコードとフローエクスポータを指定します。

r1(config)#flow monitor FLOWMONITOR
r1(config-flow-monitor)#record FLOWRECORD
r1(config-flow-monitor)#exporter FLOWEXPORTER

フローモニターをインタフェースに、適用します。

r1(config)#int s1/0
r1(config-if)#ip flow monitor FLOWMONITOR input

設定内容を確認します。

r1#show flow record
flow record FLOWRECORD:
  Description:        User defined
  No. of users:       1
  Total field space:  20 bytes
  Fields:
    match ipv4 source address
    match ipv4 destination address
    match transport source-port
    match transport destination-port
    collect counter packets
    collect counter bytes


r1#show flow monitor
Flow Monitor FLOWMONITOR:
  Description:       User defined
  Flow Record:       FLOWRECORD
  Flow Exporter:     FLOWEXPORTER
  Cache:
    Type:              normal
    Status:            allocated
    Size:              4096 entries / 196620 bytes
    Inactive Timeout:  15 secs
    Active Timeout:    1800 secs
    Update Timeout:    1800 secs



r1#show flow exporter
Flow Exporter FLOWEXPORTER:
  Description:              User defined
  Tranport Configuration:
    Destination IP address: 10.2.0.1
    Source IP address:      10.2.0.254
    Source Interface:       FastEthernet0/0
    Transport Protocol:     UDP
    Destination Port:       5141
    Source Port:            56556
    DSCP:                   0x0
    TTL:                    255


r1#show flow interface
Interface Serial1/0
  FNF:  monitor:         FLOWMONITOR
        direction:       Input
        traffic(ip):     on

ping を実行して、fluentd に出力されたログを確認します。
Flexible Netflow ではバージョンは9になります。

admin@ip-10-0-0-73:~/zenn$ sudo tail -f /var/log/td-agent/td-agent.log

2002-03-01 09:41:50.000000000 +0900 netflow.event: {"version":"9","flow_seq_num":"0","flowset_id":"256","ipv4_src_addr":"172.16.0.254","ipv4_dst_addr":"172.16.0.253","l4_src_port":0,"l4_dst_port":2048,"in_pkts":5,"in_bytes":500,"host":"10.2.0.254"}
2002-03-01 09:42:12.000000000 +0900 netflow.event: {"version":"9","flow_seq_num":"1","flowset_id":"256","ipv4_src_addr":"172.16.0.254","ipv4_dst_addr":"172.16.0.253","l4_src_port":0,"l4_dst_port":2048,"in_pkts":5,"in_bytes":500,"host":"10.2.0.254"}

大量のパケットで統計情報を取ると、CPU負荷が高まります。
フローサンプラー を指定することで、統計対象となるパケットを間引きすることができます。

r1(config)#sample FLOWSAMPLER
r1(config-sampler)#mode random 1 out-of 2

フローモニターをインタフェースに適用するときに、同時に、フローサンプラーも指定します。

r1(config)#int s1/0
r1(config-if)#no ip flow monitor FLOWMONITOR input
r1(config-if)#ip flow monitor FLOWMONITOR sampler FLOWSAMPLER input

設定内容を確認します。

r1#show flow interface
Interface Serial1/0
  FNF:  monitor:         FLOWMONITOR
        direction:       Input
        traffic(ip):     sampler FLOWSAMPLER

r1#show flow monitor
Flow Monitor FLOWMONITOR:
  Description:       User defined
  Flow Record:       FLOWRECORD
  Flow Exporter:     FLOWEXPORTER
  Cache:
    Type:              normal
    Status:            allocated
    Size:              4096 entries / 196620 bytes
    Inactive Timeout:  15 secs
    Active Timeout:    1800 secs
    Update Timeout:    1800 secs

GitHubで編集を提案

Discussion