패킷 데이터가 많은 경우에는 텍스트 형태로만 확인하는 것이 어려워진다. 이럴 때 유용하게 사용될 수 있는 것이 비주얼한 방법을 사용하는 것이다. 가장 일반적인 것이 그래프 기능이며, 많이 사용되는 와이어샤크에도 간단한 그래프 기능이 있다. 이미 블로그에서도 와이어샤크에서 데이터를 CSV 로 추출하여 엑셀을 이용하여 만드는 방법을 소개하기도 하였다.
앞으로 다양하게 그래프를 만들어보기 위한 방법을 소개해 볼 것인데 그 중에 하나로, Gnuplot 을 살펴보려고 한다. Gnuplot 은 많은 플랫폼에서 이미 사용가능하도록 포팅되어 있으며 크게 2가지 모드로 사용이 가능하다. gnuplot 커맨드 프롬프트를 통해서 인터렉티브하게 그래프를 생성할 수 있는 방법과 파일에서 커맨드를 읽어들여 사용할 수 있는 배치모드가 있다.
우선, 패킷 데이터를 수집한다.
$ tcpdump -i eth0 -w output.pcap
수집된 패킷데이터에서 80 번포트를 대상으로 필터링하여 아래와 같은 출력형태로 tcp_80.txt 파일로 저장한다. (-tttt 옵션으로 날짜 출력을 조정하였다)
$ tcpdump -r output.pcap -nq -tttt 'tcp port 80' > tcp_80.txt
2012-04-02 09:46:04.382760 IP 192.168.10.53.80 > 192.168.10.40.39026: tcp 0
2012-04-02 09:46:07.361469 IP 192.168.10.40.59746 > 211.115.x.x.80: tcp 0
2012-04-02 09:46:07.370499 IP 211.115.x.x.80 > 192.168.10.40.59746: tcp 0
2012-04-02 09:46:07.489464 IP 192.168.10.40.42280 > x.x.206.100.80: tcp 0
2012-04-02 09:46:17.953463 IP 192.168.10.40.45101 > 199.7.x.x.80: tcp 0
이 데이터에서 cut 명령어를 통해 날짜 부분만을 잘라내고 정렬을 하여 uniq 명령어를 통해 카운트를 계산한다. 그리고 출력된 데이터에서 awk 를 통해 두번째 값과 첫번째 값을 출력하여 pps.txt 파일에 저장한다.
$ cut -c 12-21 tcp_80.txt | sort | uniq -c | awk '{print $2 " " $1}' > pps.txt
09:39:25.9 1
09:39:26.5 1
09:39:26.6 1
09:39:26.7 13
09:39:26.8 48
09:39:26.9 20
09:39:27.0 8
09:39:27.1 1
09:39:27.2 2
09:39:27.3 69
09:39:27.4 10
09:39:27.5 39
09:39:27.6 66
09:39:27.7 68
09:39:27.8 46
09:39:27.9 23
09:39:28.0 4
09:39:28.2 4
09:39:28.4 1
09:39:28.6 2
위와 같은 형태로 시간과 카운트 값이 저장된다. 바로 이 데이터가 gnuplot 으로 이용되는 것이다. 여기서는 간단한 예제로 초당 패킷카운트를 얻기 위해 사용된 것이고, 만들어내고자 하는 그래프 형태에 따라 다양하게 만들 수 있다.
gnuplot 을 실행하면 명령어를 입력하여 사용할 수 있으며, 아래 예제를 보는 것만으로도 대략적인 사용방법이 이해될 것이다.
$gnuplot
gnuplot> set title "TCP Port 80 packets/sec"
gnuplot> set xdata time
gnuplot> set xlabel "Time"
gnuplot> set ylabel "per Second"
gnuplot> set timefmt "%H:%M:%S"
gnuplot> set format x "%H:%M:%S"
gnuplot> set datafile separator " "
gnuplot> set style line 2 linecolor rgb "#00ff00" lw 1
gnuplot> plot 'pps.txt' using 1:2 title "packets" with line ls 1
그래프의 타이틀을 정해주고 x, y 축에 각각 사용할 레이블 정보를 지정해 준다. x 축은 시간이 사용되는데 시간 포맷을 지정해 주었다. 데이터파일은 공백으로 구분되어 있고, 라인스타일은 2번으로 정의하였다. 그리고 plot 명령어로 앞서 만든 pps.txt 데이터의 첫번째 두번째 데이터를 사용한다고 지정하였다. plot 명령어를 실행하면 바로 아래와 같은 그래프 정보를 얻을수 가 있다.
그래프를 통해 큰 변화가 보이는 부분을 쉽게 볼 수가 있다. 여기서는 간단히 PPS 기준으로 출력하였지만, 여러분들이 얻고자 하는 데이터 형태에 따라서 만들어 내는 기본 데이터가 달라진다. 내가 만들어내는 그래프를 통해서 무엇을 얻고자 하는가에 따라서 앞서 만들어내는 기본 데이터도 그것에 맞게 만들어내야 하는 것이다.
앞서 Gnuplot 은 두가지 모드가 있다고 하였는데, 나머지 하나는 배치모드로 사용되는 명령어는 동일하며 다만 파일로 만들어 연속적으로 배치작업 형태와 같이 실행되도록 하는 것이 있다.
에를 들어, graph_pps.plot 이라는 파일에 다음과 같은 내용을 정의한다.
set title "TCP Port 80 packets/sec"
set terminal png
set xdata time
set xlabel "Time"
set ylabel "per Second"
set timefmt "%H:%M:%S"
set format x "%H:%M:%S"
set datafile separator " "
set style line 1 linecolor rgb "#000000" lw 1
plot 'pps.txt' using 1:2 title "packets" with line ls 1
set output "packets_count.png"
그리고 gnuplot 에서 이 파일을 지정해 주기만 하면된다.
$ gnuplot graph_pps.plot
실행하게 되면 packets_count.png 파일이 만들어져 있을 것이다. 앞선 것과의 차이점은 output 으로 만들어질 것을 정의했다는 것이 다르다.
어떻게 보면 CSV 형태로 데이터를 뽑아내서 GUI 환경을 통해 만들어내는 것이 더 쉬울수도 있지만 그것은 여러분의 선택에 달려있다. 한가지 방법보다는 여러가지의 방법을 알고서 사용하는 것이 때에 따라서는 유용하기 때문이다.
이번에는 기본적인 그래프 형태만을 출력해 보았지만, 필자가 더 다양한 형태로 만들어 보게되면 다시 한번 공유해 보도록 하겠다. Gnuplot 이 익숙하지는 않다보니 더 공부가 필요할 것 같다.
:-)
그래프는 단지 이쁘게 만들어내기 위한 것이 아니라, 수 많은 데이터에서 어떻게 하면 빠르고 그리고 의미있는 데이터를 찾아낼 수 있는 가에 뜻을 두어야 한다. 패킷분석에서 비주얼을 이용하는 것도 바로 이런 이유가 있기 때문이다.