Menu Close

Netflow / sflow visualization using open source #1 – elasticsearch

Netflow / sflow visualization using open source #1 – elasticsearch

 

이 정보는 IT 인프라 정보공유 오픈채팅 방의 후추님 주신 정보를 이용하여 문의 후 작성 합니다. ^^

 

일을 하다 보면 특정 포트에 흐르는 트래픽에 대하여 파악이 필요할 때가 있습니다.

어떤 IP에 트래픽이 많이 발생하는지, 어떤 프로토콜이 많이 발생하는지 등을 확인 및 조치를 취해야 하는 경우가 발생하게 됩니다.

트래픽이 적다면 port에 mirror를 걸고 wireshark로 보면 됩니다.

그런데 만약 초당 Gbps 단위로 트래픽이 발생된다면 mirror를 통한 wireshark로 분석하기에는 많은 어려움이 발생합니다.

이러한 경우 사용할 수 있는 방법이 cisco에서는 Netflow, 표준으로는 Sflow를 사용할 수 있습니다.

Netflow / Sflow 는 flow 정보를 특정 시간 동안 sampling 하여 정보를 보내줍니다.

이러한 정보를 보기 쉽게 오픈소스를 활용하여 시각화를 하였습니다.

 

1. 사용 오픈 소스

opennms 장비에서 보내오는 netflow/sflow 정보를 Elasticsearch에 저장
grafana 의 요청에 따라 netflow/sflow 의 정보를 전달
Elasticsearch opennms에서 받은 netflow/sflow 의 정보를 저장하는 오픈 소스
Elasticsearch Plugin ( drift ) function proportional_sum 을 사용 할 수 있게 해주는 plugin
Grafana opennms에서 받아온 netflow/sflow의 정보를 시각화 하는 오픈 소스

Elasticsearch(이하 ES) 7.1.1로 설치를 진행하려고 하였으나 아직 opennms에서 ES 7에 대하여 지원이 제대로 되지 않아 ES 6.8.1로 설치했습니다.

추후 ES 7에 대하여 지원이 된다면 변경 부분에 대해서만 내용을 추가하도록 하겠습니다.

 

2. 동작 방식

net_sflow_flow

참조 : https://wiki.opennms.org/wiki/DevProjects/Drift

 

3. 설치 환경

CentOS 7.6.1810 minimal

Elasticsearch 6.8.1

Elasticsearch 3대 ( Cluster 구조 ), Opennms 1대, Grafana 1대

 

4. 의존성 파일들 설치

[root@localhost]# yum -y install java maven unzip

java는 elasticsearch 설치에 필요하며, 1.8.0 버전 이상을 설치해야 합니다.

maven은 elasticsearch plugin인 drift의 컴파일에 필요합니다.

 

5. Elasticsearch 설치

Elasticsearch는 아파치 루씬(Apache Lucene) 기반의 오픈소스 분산 검색 엔진입니다.

Elasticsearch는 총 3대의 장비로 구성하며, Master node 1대와 Data node 2대로 구성하겠습니다.

Elasticsearch의 경우 Plugin 의존성 때문에 특정 버전을 선택해서 설치해야 합니다.

이 설치 문서에서는 6.8.1 버전을 설치하겠습니다.

1) ElasticSearch 설치

[root@localhost]# mkdir -p /usr/local/Server/elasticsearch-6.8.1
[root@localhost]# cd /usr/local/Server/elasticsearch-6.8.1
[root@localhost]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.1.rpm
[root@localhost]# yum install elasticsearch-6.8.1.rpm

 

elasticsearch를 실행하기 전에 설정 변경이 필요합니다. (2 ~ 4)

참조 : https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html

2) limit.conf 수정

[root@localhost]# cat << EOF >> /etc/security/limits.conf
elasticsearch - nofile 65535
elasticsearch - nproc 4096
elasticsearch - memlock unlimited
EOF

메모리락, 프로세스 스레드, 파일 디스크립터의 제한을 변경합니다.

 

3) sysctl.conf 수정

[root@localhost]# cat << EOF >> /etc/sysctl.conf
vm.max_map_count = 262144
EOF

하나의 프로세스가 사용할 수 있는 메모리 맵 영역의 최대 수를 증가시켜 줍니다.

 

4) elasticsearch.service 수정

[root@localhost]# vi /usr/lib/systemd/system/elasticsearch.service
LimitMEMLOCK=infinity

LimitMEMLOCK=infinity 값이 없으면 추가를 해주고, #이라면 주석을 제거해 주시면 됩니다.

 

5) 각 node hostname  변경

Master node

[root@localhost]# hostnamectl set-hostname es-master-node
[root@localhost]# cat << EOF >> /etc/hosts
> 10.0.0.101 es-master-node
> 10.0.0.102 es-data-node1
> 10.0.0.103 es-data-node2
> EOF

 

Data node1

[root@localhost]# hostnamectl set-hostname es-data-node1
[root@localhost]# cat << EOF >> /etc/hosts
> 10.0.0.101 es-master-node
> 10.0.0.102 es-data-node1
> 10.0.0.103 es-data-node2
> EOF

 

Data node2

[root@localhost]# hostnamectl set-hostname es-data-node2
[root@localhost]# cat << EOF >> /etc/hosts
> 10.0.0.101 es-master-node
> 10.0.0.102 es-data-node1
> 10.0.0.103 es-data-node2
> EOF

 

6) Elasticsearch Cluster 설정

공통 설정

[root@localhost]# vi /etc/elasticsearch/elasticsearch.yml

cluster.name: umount-es-cluster
node.name: ${HOSTNAME}

network.host: 0.0.0.0
transport.tcp.port: 9300
transport.tcp.compress: true

http.port: 9200
http.cors.enabled: true
discovery.zen.minimum_master_nodes: 1
discovery.zen.ping_timeout: 10s
discovery.zen.ping.unicast.hosts: ["es-master-node:9300", "es-data-node1:9300", "es-data-node2:9300"]

 

Master node

node.master: true
node.data: false

 

Data node

node.master: false
node.data: true

 

7) elasticsearch 시작

[root@localhost]# systemctl enable elasticsearch
[root@localhost]# systemctl start elasticsearch
[root@localhost]# curl localhost:9200
{
  "name" : "es-master-node",
  "cluster_name" : "umount-es-cluster",
  "cluster_uuid" : "z-T6PEFLR-uwpF7F1ZB-ag",
  "version" : {
    "number" : "6.8.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "1fad4e1",
    "build_date" : "2019-06-18T13:16:52.517138Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
[root@localhost]# curl localhost:9200/_cluster/health?pretty=true
{
  "cluster_name" : "umount-es-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

정상적으로 cluster가 된다면, cluster_uuid가 3대의 서버에서 동일한 값이 되며, number_of_nodes와 number_of_data_nodes가 위와 같이 나오게 됩니다.

 

6. Elasticsearch Plugin Drift

1) 설치

[root@localhost]# mkdir -p /usr/local/Server/elasticsearch-plugin-drift-6.8.1
[root@localhost]# cd /usr/local/Server/elasticsearch-plugin-drift-6.8.1
[root@localhost]# wget https://github.com/OpenNMS/elasticsearch-drift-plugin/archive/es-6.8.x.zip
[root@localhost]# unzip es-6.8.x.zip
[root@localhost]# cd elasticsearch-drift-plugin-es-6.8.x
[root@localhost]# vi pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.opennms.elasticsearch</groupId>
    <artifactId>elasticsearch-drift-plugin</artifactId>
    <version>6.8.1-SNAPSHOT</version>

    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
        </license>
    </licenses>

    <parent>
        <groupId>org.sonatype.oss</groupId>
        <artifactId>oss-parent</artifactId>
        <version>9</version>
    </parent>

    <properties>
        <elasticsearch.version>6.8.1</elasticsearch.version>

[root@localhost]# mvn clean package
[root@localhost]# /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///usr/local/Server/elasticsearch-plugin-drift-6.8.1/elasticsearch-drift-plugin-es-6.8.x/target/releases/elasticsearch-drift-plugin-6.8.1-SNAPSHOT.zip
[root@localhost]# systemctl restart elasticsearch

elasticsearch version을 맞추기 위해 6.8.0으로 되어 있는 값을 6.8.1로 변경합니다.

 

2) 설치 확인

[root@localhost]# /usr/share/elasticsearch/bin/elasticsearch-plugin list
opennms-drift
[root@localhost]# curl 'localhost:9200/_cat/plugins?v&s=component&h=name,component,version,description'
name           component     version        description
es-data-node2  opennms-drift 6.8.1-SNAPSHOT The Drift plugin exposes additional aggregations for analysis of Netflow data.
es-data-node1  opennms-drift 6.8.1-SNAPSHOT The Drift plugin exposes additional aggregations for analysis of Netflow data.
es-master-node opennms-drift 6.8.1-SNAPSHOT The Drift plugin exposes additional aggregations for analysis of Netflow data.

 

이로써 sflow/netflow를 정보를 저장하는 elasticsearch / plugin 설치가 완료 되었습니다.

 

다음은 opennms를 설치해 보도록 하겠습니다.

 

Netflow / slofw visualization using open source #2 – opennms

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

This site uses Akismet to reduce spam. Learn how your comment data is processed.