Posting

Machbase의 최신 소식을 지금 만나보세요

[MACHBASE 활용] NETFLOW 데이터 조회

1.개요

최근 급변하는 IT 환경때문에 네트워크 트래픽 분석 기술이 중요시 되어지고 있다. 사용자는 모바일로 급속히 옮겨가고 서버에는 가상화와 클라우드가 도입되면서, 어떤 애플리케이션이 얼마만큼의 트래픽을 발생하는지 분석할 필요성이 생겼다. 또한 전통적인 데이터에 영상과 음성이 통합되면서 통신 품질을 보장하기 위해 더 높은 네트워크 효율에 대한 요구가 증가하고 있다. 이러한 효율성은 당연히 비용에 대한 절감과 수익향상으로 연결된다.
그래서 요즘 각광받고 있는 NetFlow를 이용하여 위의 문제를 해결하고자 한다. 그렇다면 NetFlow Data란 무엇인가? NetFlow는 Cisco Systems가 개발한 네트워크 프로토콜로, 누가 언제 어디서 무엇을 어떻게 하는 데에 네트워크를 사용하는지에 관한 정보를 제공한다.
그럼 마크베이스는 무엇을 해야하나? Machbase는 빅데이터에 적격인 데이터베이스로써 Sensor Data 뿐만 아니라 네트워크를 통해 쏟아져 나오는 엄청난 데이터를 조회하는데 적합한 데이터베이스라고 볼 수 있다. 따라서 Machbase의 Log Table을 활용하여 네트워크 데이터에 대한 Data loading과 조회 성능을 측정하려 한다. Machbase의 Log Table은 Log성 시계열 data를 저장하는 데 큰 강점들이 있으며 그들 중 하나는 IPv4, IPv6를 Column type으로 지원하는 것이다. 그 데이터로 Cisco Systems가 개발한 네트워크 프로토콜인 Netflow Data를 저장하고 조회하며 성능에 대한 측정을 통해 Machbase의 강력함을 소개하고 진행 과정과 결과를 공유하고자 한다.

들어가기 앞서 페이지에 사용된 예제 데이터 및 스키마는 링크를 통해 다운받을 수 있다. https://github.com/MACHBASE/NetFlow_example

2.환경

CPU : Intel(R) Xeon(R) CPU E3-1231 v3 @ 3.40GHz / 8 core

MEM: 32GB

Disk: SSD 256GB

OS : CentOS release 6.6 (Final)

3. NetFlow

3-1 NetFlow Data

전통적으로 IP 흐름 분석은 IP 패킷 속성 중 5개에서 많게는 7개의 속성을 기반으로 한다. NetFlow가 사용하는 IP 패킷의 속성은 다음과 같다.

  • 출발지 IP 주소
  • 목적지 IP 주소
  • 출발지 포트
  • 목적지 포트
  • 레이어 3 프로토콜
  • CoS(Class of Service)
  • 라우터 또는 스위치 인터페이스

출발지/도착지 IP 주소, 포트, 프로토콜 인터페이스, CoS가 같은 패킷은 하나의 흐름으로 묶인다. 그리고 하나로 묶은 흐름의 패킷과 바이트는 더한다. 이렇게 수집된 대용량의 네트워크 정보는 NetFlow 캐시라고 불리는 NetFlow 데이터베이스에 저장되므로 추후에 쉽게 확장 가능하다.

Wikipedia에서 확인 가능한 Data Format은 다음과 같다.

Date flow start Duration Proto Src IP Addr:Port Dst IP Addr:Port Packets Bytes Flows
2010-09-01 00:00:00.459 0.000 UDP 127.0.0.1:24920 -> 192.168.0.1:22126 1 46 1
2010-09-01 00:00:00.363 0.000 UDP 192.168.0.1:22126 -> 127.0.0.1:24920 1 80 1
3- 2 Generator

Netflow Data를 생성하기 위해 서 이미 많은 생성기가 존재한다. 다음의 사이트를 참조하여 원하는 생성기를 다운받아 실행시키면 된다.
링크 :https://www.pcwdld.com/netflow-generators
생성기를 이용하여 Data를 생성하면 Generator collector로 NetFlow 형식의 webpacket이 전달되는데 Wireshark 등을 통해서 확인 할 수 있다.
아래의 그림의 빨간 테두리 부분에서 NetFlow에 대한 정보를 받을 IP와 Port, Speed를 설정하고 Start 버튼을 누르면 된다.

4. Data Set

위의 일련한 과정을 바탕으로 Data Set을 생성하여 Machbase에 저장한다. Data Set은 다음과 같다.

StartTime,Dur,Protocol,SAddr,Sport,Dir,DAddr,Dport,State,sTos,dTos,TotPkts,TotBytes,SrcBytes,label
2011/08/01 09:46:53.047277,3550.182373,udp,212.50.71.179,39678, <->,147.32.84.229,13363,CON,0,0,12,875,413,flow=Background-UDP-Established
2011/08/01 09:46:53.048843,0.000883,udp,84.13.246.132,28431, <->,147.32.84.229,13363,CON,0,0,2,135,75,flow=Background-UDP-Established
2011/08/01 09:46:53.049895,0.000326,tcp,217.163.21.35,80, ,147.32.86.194,2063,FA_A,0,0,2,120,60,flow=Background
2011/08/01 09:46:53.053771,0.056966,tcp,83.3.77.74,32882, ,147.32.85.5,21857,FA_FA,0,0,3,180,120,flow=Background
2011/08/01 09:46:53.053937,3427.768066,udp,74.89.223.204,21278, <->,147.32.84.229,13363,CON,0,0,42,2856,1596,flow=Background-UDP-Established
2011/08/01 09:46:53.056921,3086.547363,tcp,66.169.184.207,49372, ,147.32.84.229,13363,PA_PA,0,0,591,45931,26480,flow=Background
2011/08/01 09:46:53.058746,3589.631348,udp,182.239.167.121,49649, <->,147.32.84.229,13363,CON,0,0,12,1494,1122,flow=Background-UDP-Established

5. Table 생성 및 데이터 입력

5-1 Table 생성

이번 프로젝트에서 Data set에있는 Dir, Label Column을 입력하지 않을 것이다. Machbase에서 제공하는 Utility Tool인 Machloader를 이용하여 Data를 입력할 때 Data Format에서 ignore option을 추가하여 해당 컬럼들을 제외하고 데이터를 입력 할 수 있다. 실제 생성되는 Table Schema는 아래와 같으며 Dir, Label Column이 제외된 것을 확인할 수 있다.

create table netflow_data
(
 StartTime datetime property (MINMAX_CACHE_SIZE=20971520),
 Dur double,
 Protocol varchar(7),
 SAddr ipv4,
 Sport integer,
 DAddr ipv4,
 Dport integer,
 State Varchar(15),
 sTos int,
 dTos int,
 TotPkts int,
 TotBytes int,
 SrcBytes int
);
create index idx_src_port on netflow_data(Sport);
create index idx_dst_port on netflow_data(Dport);
create index idx_src_ip on netflow_data(SAddr);
create index idx_dst_ip on netflow_data(DAddr);

Machloader를 통해 Data set의 csv 형식의 파일을 DataFormat 지정을 통해 원하는 Column에 대해서만 값을 저장 할 수 있다. Schema는 다음과 같다.

table netflow_data
{
StartTime datetime;
Dur double;
Protocol varchar(7);
SAddr ipv4;
Sport integer;
Dir varchar(20) ignore;
DAddr ipv4;
Dport integer;
State Varchar(15);
sTos integer;
dTos integer;
TotPkts integer;
TotBytes integer;
SrcBytes integer;
label varchar(512) ignore;
}
5-2 데이터 로딩

Table 구성을 끝마쳤으니 데이터를 입력할 차례이다. Machbase에서 제공하는 Utility Tool인 Machloader 를 사용하여 아래의 명령어를 통해 실행 시킬 수 있다.

machloader -i -f flowfmt.fmt -d data.csv -H -F"starttime YYYY/MM/DD HH24:MI:SS.mmmuuu"

Machloader를 실행하여 진행한 결과는 아래와 같다.

-----------------------------------------------------------------
 Machbase Data Import/Export Utility.
 Release Version 5.5.3.official
 Copyright 2014, MACHBASE Corporation or its subsidiaries.
 All Rights Reserved.
-----------------------------------------------------------------
NLS          : US7ASCII      EXECUTE MODE : IMPORT
SCHMEA FILE  : flowfmt.fmt  DATA FILE    : ./bulk/data.csv
IMPORT MODE  : APPEND        FIELD TERM   : ,
ROW TERM     : \n            ENCLOSURE    : "
ESCAPE       : \             ARRIVAL_TIME : FALSE
ENCODING     : NONE          HEADER       : TRUE
CREATE TABLE : FALSE
 Progress bar               Imported records Error records
                                     2784843             0
Import time        : 0 hour 0 min 10.37 sec
Load success count : 2784843
Load fail count    : 0

결과를 보면 2,700,000건이 10.37초 만에 입력되었다. 이에 멈추지 않고 Data를 주기적으로 넣을 수 있는 프로그램을 하나 만든다. 해당 프로그램은 기존의 Data를 날짜만 바꾸어 입력한다.( 해당 프로그램은 개요에있는 GITHUB 사이트 Netflow_exmaple repository에 append_n 으로 등록되어 다운 받고 sh append.sh를 입력하면 된다.) 이렇게 입력한 데이터는 다음과 같다.

ItemValue
Total Count1,322,725,332
Time (Sec)4,890
EPS270,495

결과적으로 초당 270,495건의 데이터가 입력되었다. 해당 프로젝트의 입력방식은 Machbase에서 제공하는 API에서 Append 방식이 아닌 CSV 파일을 읽어 들여 값을 넣는 방식으로 입력 속도가 현저히 떨어져 아쉬운 점이 있다. 그럼에도 불구하고 초당 27만이라는 결과를 보여준다.

6.조회 및 성능 측정

이제 약 13억건의 NetFlow의 데이터를 가지고 실제로 확인 할 법한 Query문을 조회해보자.

6-1. 총갯수
Mach> select count(*) from netflow_data;
count(*)
-----------------------
1322725332
[1] row(s) selected.
Elapsed time: 0.001

6-2. 저장된 값의 시간 범위

Mach> select min(starttime),max(starttime) from netflow_data;
min(starttime)                  max(starttime)
-------------------------------------------------------------------
2018-06-01 09:46:53 047:277:000 2019-06-17 15:14:09 721:920:000
[1] row(s) selected.
Elapsed time: 1.054
6-2. 저장된 값의 시간 범위
Mach> select min(starttime),max(starttime) from netflow_data;
min(starttime)                  max(starttime)
-------------------------------------------------------------------
2018-06-01 09:46:53 047:277:000 2019-06-17 15:14:09 721:920:000
[1] row(s) selected.
Elapsed time: 1.054
6-3. 10분동안 가장 접속이 많았던 연결의 Port
Mach> SELECT saddr, daddr, dport, COUNT(dport)
  FROM netflow_data
  WHERE starttime between to_date('2018-09-08 15:30:00') AND to_date('2018-09-08 15:40:00')
  GROUP BY saddr, daddr, dport
  ORDER BY 4 desc limit 20;

saddr          daddr          dport COUNT(dport)
----------------------------------------------------------------------
147.32.84.138  147.32.80.9    53    14122
147.32.84.59   147.32.80.9    53    3037
147.32.85.25   147.32.80.9    53    1289
147.32.85.34   147.32.80.9    53    868
147.32.84.165  147.32.80.9    53    603
147.32.86.20   147.32.80.9    53    414
147.32.85.119  147.32.80.9    53    353
147.32.84.170  147.32.80.9    53    293
147.32.84.171  147.32.80.9    53    290
147.32.84.181  147.32.80.9    53    274
147.32.86.182  147.32.80.9    53    252
147.32.86.208  147.32.80.9    53    246
147.32.85.5    147.32.80.9    53    241
147.32.85.7    147.32.80.9    53    222
147.32.85.84   147.32.80.9    53    204
147.32.86.187  147.32.80.9    53    203
147.32.86.20   188.138.84.239 80    190
147.32.84.131  147.32.80.9    53    151
147.32.85.124  147.32.80.9    53    130
147.32.85.89   147.32.80.9    53    127
[20] row(s) selected.
Elapsed time: 0.219
6-4.가장 많이 Bytes를 보낸 IP 순위
Mach> SELECT saddr, daddr, dport, SUM(totbytes)
  FROM netflow_data
  WHERE starttime between to_date('2018-09-08 15:30:00') AND to_date('2018-09-08 15:40:00')
  GROUP BY saddr, daddr, dport
  ORDER BY 4 desc limit 20;
saddr           daddr          dport SUM(totbytes)
----------------------------------------------------------------------
147.32.85.112   147.32.80.13   80    155078219
147.32.84.59    173.194.1.25   80    82752563
147.32.84.131   74.125.108.248 80    81180401
147.32.84.59    147.32.114.134 22    75670338
147.32.84.59    74.125.108.144 80    53892235
147.32.84.59    173.194.1.22   80    42451697
67.195.115.177  147.32.87.27   80    39724808
193.86.30.69    147.32.84.2    80    32292306
147.32.84.131   74.125.108.173 80    28064265
147.32.84.59    74.125.232.197 80    25726018
147.32.84.170   74.125.108.179 80    25528619
147.32.84.59    74.125.43.108  587   22811118
147.32.84.3     147.32.80.13   80    20147253
147.32.84.59    8.19.240.70    80    19408268
147.32.84.59    173.194.1.20   80    18322725
62.90.164.14    147.32.84.2    80    16639478
147.32.86.11    91.103.160.143 1935  15743433
147.32.86.110   188.95.61.42   53389 11663421
85.161.91.161   147.32.84.242  22    11373115
67.195.111.228  147.32.84.2    80    8539669
[20] row(s) selected.
Elapsed time: 0.228
6-5.특정 sub-net host 연결순위
Mach> SELECT saddr, daddr, dport, SUM(srcbytes)
  FROM netflow_data
  WHERE saddr contained '147.32.86.0/24' AND daddr not contained '147.32.86.0/24' AND
  starttime between to_date('2019-03-11') AND to_date('2019-03-12')
  GROUP BY saddr, daddr, dport
  ORDER BY 3 desc
  LIMIT 10;
saddr          daddr           dport  SUM(srcbytes)
----------------------------------------------------------------------
147.32.86.194  90.204.39.143   65535  1015
147.32.86.194  41.72.212.199   65534  145
147.32.86.194  188.36.61.58    65530  145
147.32.86.186  182.170.209.168 65526  152
147.32.86.140  188.237.53.30   65501  13709
147.32.86.208  121.219.129.230 65499  145
147.32.86.194  41.71.137.130   65498  145
147.32.86.179  218.168.26.54   65496  234
147.32.86.179  81.191.145.111  65480  304
147.32.86.58   213.240.207.145 65476  475
[10] row(s) selected.
Elapsed time: 0.972
6-6. 포트가 80인 (HTTP) 접속 현황 (1일)
Mach> SELECT saddr, dport, SUM(totbytes), COUNT(dport)
  From netflow_data
  WHERE dport = 80 and starttime between to_date('2019-01-11') AND to_date('2019-01-12')
  GROUP BY saddr,dport
  ORDER BY 3 desc limit 10;
saddr          dport SUM(totbytes) COUNT(dport)
---------------------------------------------------------------------------
147.32.84.59   80    10569917420   80152
147.32.85.112  80    3086336959    2328
147.32.86.186  80    1987977686    2167
147.32.85.60   80    910781333     3270
147.32.86.20   80    697819873     15280
147.32.84.118  80    667326036     2122
147.32.84.164  80    511667803     1712
147.32.86.99   80    446249223     3945
147.32.84.131  80    293217047     3380
147.32.86.194  80    274455247     5402
[10] row(s) selected.
Elapsed time: 0.837

위의 결과를 간단하게 표로 만들어서 정리하면 다음과 같다.

목록소요시간(초)
1. Total count0.001
2. Time Range1.054
3. 10분동안 가장 접속이 많았던 연결의 Port0.219
4. 가장 많이 Bytes를 보낸 IP 순위0.228
5. 특정 sub-net host 연결 순위0.972
6. 포트가 80인 (HTTP) 접속 현황 (1일)0.837

7.마치며

Log Table을 활용하여 NetFlow 데이터의 저장과 조회를 진행하여 보았다. 13억건의 데이터를 조회하는데 전체적으로 1초 미만의 결과로 엄청난 성능을 자랑한 것을 볼 수 있었다. 이 결과로 Machbase를 사용하여 Firewall이나 Web Log 성 데이터에 활용이 가능하며 무궁무진한 데이터베이스란 것을 확인 할 수 있었다.

연관 포스트

C언어로 Binary data를 Machbase에 넣기

1.개요 Data를 다루다 보면 numeric, varchar 형 데이터뿐만 아니라 JPG, PNG, MP3와 같은 Binary data도 database에 저장해야 할 때가 존재한다. 그러나 일반 data들과는 달리 Binary

[MACHBASE 연동] Android studio에서 JDBC 연결하기

마크베이스 기술지원본부 이현민 1. 개요 수많은 데이터들이 많은 환경에서 생성되고 있는 오늘날, 우리 현대인들의 동반자인 스마트폰 또한 데이터생성의 주체로써 또는 전달자로서 알게 모르게 그 구실을