Grafana로 NetFlow v9 트래픽 분석

라우터에서 내보낸 NetFlow 버전 9 레코드를 수집하여 트래픽 상황을 시각화하고 분석하는 시스템을 구축해 보았습니다.

완제품 이미지



Grafana를 통한 NetFlow 트래픽 시각화 대시보드



목적



NetFlow v9를 지원하는 무료 시각화 소프트웨어 가 적고, 상용 소프트웨어는 고가이기 때문에, 부담없이 가시화할 수 있는 구조를 만들 수 없을까 생각하고 있었는데, NetOpsCoding #3 툴을 응용하면 만들 수 있을까라고 생각해 보았습니다.

건설



NetFlow 내보내기 (라우터) 준비, 구축



Cisco ASR1001을 사용해 보았습니다.
  • Cisco ASR 1001
  • IOS XE Software, Version 03.16.03.S


  • Cisco AVC (Application Visibility and Control)라는 기능으로 트래픽을 애플리케이션 식별하는 필드를 NetFlow v9 템플릿에 올려 보았습니다.

    설정은 이런 느낌입니다.


    플로우 레코드 정보와 템플릿 출력을 확인.
    #show flow monitor monitor-avc-monitoring cache format table 
    
    IPV4 SRC ADDR    IPV4 DST ADDR    APP NAME                          trns src port  trns dst port  intf input            intf output                bytes        pkts    time first     time last  ip prot
    ===============  ===============  ================================  =============  =============  ====================  ====================  ==========  ==========  ============  ============  =======
    X.X.X.X          X.X.X.X          layer7 twitter                            52441            443  Gi0/0/1               Gi0/0/0                     4898          37  11:43:44.132  11:43:51.553        6
    X.X.X.X          X.X.X.X          layer7 facebook                             443          52321  Gi0/0/0               Gi0/0/1                   112313         130  11:43:27.969  11:43:52.749        6
    X.X.X.X          X.X.X.X          layer7 skype                              51200            443  Gi0/0/1               Gi0/0/0                      793           3  11:43:27.383  11:43:31.048        6
    X.X.X.X          X.X.X.X          layer7 ssl                                  443          51467  Gi0/0/0               Gi0/0/1                    15644          12  11:43:33.639  11:43:33.789        6
    X.X.X.X          X.X.X.X          port telnet                                  23          52400  Gi0/0/0               Gi0/0/1                     8269          11  11:43:36.925  11:43:55.947        6
    X.X.X.X          X.X.X.X          layer7 google-services                      443          52469  Gi0/0/0               Gi0/0/1                      712           9  11:43:49.134  11:43:49.351        6
    
    #show flow exporter exporter-avc-monitoring templates
    Flow Exporter exporter-avc-monitoring:
    Client: Flow Monitor monitor-avc-monitoring
    Exporter Format: NetFlow Version 9
    Template ID    : 274
    Source ID      : 256
    Record Size    : 41
    Template layout
    _____________________________________________________________________
    |                 Field                   |  Type | Offset |  Size  |
    ---------------------------------------------------------------------
    | ipv4 source address                     |     8 |     0  |     4  |
    | ipv4 destination address                |    12 |     4  |     4  |
    | ip protocol                             |     4 |     8  |     1  |
    | transport source-port                   |     7 |     9  |     2  |
    | transport destination-port              |    11 |    11  |     2  |
    | interface input snmp                    |    10 |    13  |     4  |
    | application id                          |    95 |    17  |     4  |
    | interface output snmp                   |    14 |    21  |     4  |
    | counter bytes                           |     1 |    25  |     4  |
    | counter packets                         |     2 |    29  |     4  |
    | timestamp sys-uptime first              |    22 |    33  |     4  |
    | timestamp sys-uptime last               |    21 |    37  |     4  |
    ---------------------------------------------------------------------
    

    NetFlow 수집기 (가시화 도구) 준비, 구축



    DockerHub의 이미지를 사용하여 Fluentd와 InfluxDB, Grafana를 준비합니다.

    사용한 OS, 도구는 다음과 같습니다.
  • 우분투 16.04.1 LTS
  • Docker 1.10.3
  • Docker Image
  • fluent/fluentd 0.12.28 (latest)
  • influxdb 0.13.0 (latest)
  • grafana/grafana 3.1.1 (latest)

  • Fluentd Plugin
  • fluent-plugin-influxdb (0.2.8)
  • fluent-plugin-netflow (0.2.4)


  • Ubuntu/Docker 준비



    Docker를 설치합니다. Ubuntu atp docker.io 패키지를 설치합니다.
    $ sudo apt install docker.io
    

    Fluentd 준비



    라우터에서 NetFlow 데이터를 수신하고 InfluxDB에 저장하는 Fluentd를 설치합니다.
    fluent-plugin-influxdb, fluent-plugin-netflow 양쪽 플러그인에 대응한 Docker Image가 없었기 때문에, fluent project의 Fluentd Docker Image (fluent/fluentd)를 clone 해 커스터마이즈 해 build 했습니다.
    $ git clone https://github.com/fluent/fluentd-docker-image.git
    $ cd fluentd-docker-image/
    

    Dockerfile.
    $ diff -uw Dockerfile.orig Dockerfile
    --- Dockerfile.orig     2016-08-25 11:03:39.264019589 +0900
    +++ Dockerfile  2016-08-25 11:02:59.523127344 +0900
    @@ -14,6 +14,8 @@
         echo 'gem: --no-document' >> /etc/gemrc && \
         gem install oj && \
         gem install fluentd -v 0.12.28 && \
    +    gem install fluent-plugin-influxdb && \
    +    gem install fluent-plugin-netflow && \
         apk del build-base ruby-dev && \
         rm -rf /tmp/* /var/tmp/* /var/cache/apk/* /usr/lib/ruby/gems/*/cache/*.gem
    

    fluent.conf
    <source>
      type netflow
      tag netflow
      bind 172.17.0.3
      port 9996
    </source>
    <match netflow>
      type influxdb
      host influxdb
      port 8086
      dbname netflow9
      time_precision s
      tag_keys ["app_id", "first_switched", "last_switched", "flowset_id", "host", "input_snmp", "output_snmp", "ipv4_src_addr", "ipv4_dst_addr", "l4_src_port", "l4_dst_port", "protocol", "version", "ip_dscp", "ip_frag_offset", "ip_frag_flags", "icmp_ipv4_type", "icmp_ipv4_code", "tcp_ack_num", "tcp_header_len", "tcp_flags" ]
    </match>
    <match **>
     type stdout
    </match>
    
    $ cd ..
    $ sudo docker build -t fluentd-netflow:fluentd fluentd-docker-image
    

    InfluxDB 준비


    $ sudo docker pull influxdb
    

    Grafana 준비


    $ sudo docker pull grafana/grafana
    

    Docker 이미지 시작



    InfluxDB 시작, InfluxDB 설치, Fluentd, Grafana 시작을 차례로 수행합니다.
    $ sudo docker run -d --name=influxdb -p 8083:8083 -p 8086:8086 -v $HOME/influxdb:/var/lib/influxdb influxdb
    
    $ influx
    > create database netflow9
    > create retention policy netflow on netflow9 duration 8w replication 1 default
    
    $ sudo docker run -d --name=fluentd --link influxdb:influxdb -p 24224:24224 -p 9996:9996/udp -v $HOME/fluentd/:/var/lib/fluentd fluentd-netflow:fluentd
    
    $ sudo docker run -d --name=grafana --link influxdb:influxdb -p 3000:3000 -v $HOME/grafana/:/var/lib/grafana grafana/grafana
    

    데이터 확인



    다음과 같은 명령으로 레코드가 출력되면 NetFlow 레코드의 DB 쓰기가 성공하고 있습니다.
    $ influx
    > use netflow9
    > select * from netflow where time > now() - 3m
    

    Grafana 설정



    Grafana의 설정은 Grafana와 InfluxDB에서 네트워크 리소스 시각화 의 기사가 참고가 됩니다.
    Grafana의 Graph 설정의 Metrics 항목에 설정하는 내용은 다음을 참고하십시오.
    インターフェースから入ってくるトラフィック
    SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND  $timeFilter GROUP BY time(30s) fill(0)
    
    インターフェースから入ってくるTCPトラフィック
    SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND "protocol" = '6' AND  $timeFilter GROUP BY time(30s) fill(0)
    
    インターフェースから入ってくるトラフィックのうちCisco AVCでTwitterと識別されるトラフィック
    SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND "app_id" = '218104325' AND $timeFilter GROUP BY time(30s) fill(0)
    

    완성



    여러 가지 시도해보십시오.
    코멘트 등 환영합니다.

    참고 자료


  • Freeware NetFlow Software - Cisco IOS NetFlow
  • NetOpsCoding #3
  • Grafana와 InfluxDB에서 네트워크 리소스 시각화
  • ELK에 의한 구축 기사 - Step-by-Step Setup of ELK for NetFlow Analytics
  • 좋은 웹페이지 즐겨찾기