레이블이 위치정보인 게시물을 표시합니다. 모든 게시물 표시
레이블이 위치정보인 게시물을 표시합니다. 모든 게시물 표시

2010년 7월 20일 화요일

IP 주소의 위치정보를 활용하여 멋진 그래프 만들기

패킷파일을 열어보면 IP 정보들이 가득하다. 필요에 따라 IP 주소를 Whois 하여 찾아보고, 어느 국가의 것인지, 어느 기관의 것인지 알아볼 수 있다. 오늘은 패킷 파일의 IP 주소의 위치정보를 좀더 쉽게 확인할 수 있는 방법을 소개해 보고자 한다. 일단 도구가 필요한데, IPLocation 이라는 것을 받아보자.


IPLocation 은 각 IP 주소를 쿼리하여 위치 정보를 리턴해주는데, 보여주는 정보의 형태가 CSV 이다. 루비로 만들어져 있는 스크립트 형태이며, 사용하기 위해서는 루비 PCAP 라이브러리가 필요하다.
루비 PCAP 라이브러리는 다음의 경로에서 받을 수 있다.


PCAP 라이브러리의 컴파일은 ruby extconf.rb 를 실행해 주면 된다.

# ruby extconf.rb
checking for socket() in -lsocket... no
checking for gethostbyname() in -lxnet... no
checking for hstrerror()... yes
checking for pcap.h... yes
checking for pcap_open_live() in -lpcap... yes
checking for pcap_compile_nopcap()... yes
creating Makefile

그러면 위와 같이 Makefile 이 만들어지고 make 명령어를 통해 컴파일을 시작한다.

# make
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c icmp_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c ip_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c Pcap.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c udp_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c tcp_packet.c
cc -shared -o pcap.so icmp_packet.o ip_packet.o packet.o Pcap.o udp_packet.o tcp_packet.o -L. -L/usr/lib -L/usr/local/lib    -lruby1.8 -lpcap  -lpthread -ldl -lcrypt -lm   -lc

컴파일이 되었다면 make install 하는 것으로 쉽게 설치가 끝난다.

# make install
/usr/bin/install -c -m 0755 pcap.so /usr/local/lib/site_ruby/1.8/i486-linux
/usr/bin/install -c -m 644 ./lib/pcaplet.rb /usr/local/lib/site_ruby/1.8
/usr/bin/install -c -m 644 ./lib/pcap_misc.rb /usr/local/lib/site_ruby/1.8

자,이제 IPLocation 을 실행해 보자. 실행하면, 바로 패킷 캡쳐모드로 발견되는 IP 주소에 대한 정보를 보여준다.
Inbound 와 Outbound 로 나뉘어 보여지게 되며, 중지는 CTRL-C 를 누르면 된다.

# ./iploc.rb
Aggregating...CTRL-C to finish (if in live capture mode).
^CInbound Addresses:
168.126.63.1,KOREA, REPUBLIC OF (KR),(Unknown city),,,27
201.76.40.2,(Unknown Country?) (XX),(Unknown City?),,,1
75.126.229.92,UNITED STATES (US),(Unknown city),,,1
174.133.246.194,UNITED STATES (US),Houston TX,29.7687,-95.3867,2
189.126.108.2,(Unknown Country?) (XX),(Unknown City?),,,1
203.119.29.1,CHINA (CN),(Unknown city),,,1
89.253.195.102,RUSSIAN FEDERATION (RU),Moscow,55.75,37.6,1
59.6.145.185,KOREA, REPUBLIC OF (KR),(Unknown city),,,86
200.219.159.10,BRAZIL (BR),(Unknown city),,,1
174.129.200.54,UNITED STATES (US),Seattle WA,47.6218,-122.35,27
213.248.61.180,RUSSIAN FEDERATION (RU),Moscow,55.75,37.6,4
192.33.14.30,UNITED STATES (US),(Unknown city),,,4

Outbound Addresses:
59.6.145.185,KOREA, REPUBLIC OF (KR),(Unknown city),,,11
200.219.159.10,BRAZIL (BR),(Unknown city),,,1
301 packets received by filter
95 packets dropped by kernel

그럼 어떤 옵션들이 있는지 살펴보자.

# ./iploc.rb -h

Usage: iploc.rb [ -dnv ] [ -i interface | -r file ]
                [ -c count ] [ -s snaplen ] [ filter ]
Options:
  -n  do not convert address to name
  -d  debug mode
  -v  verbose mode

도움말은 아주 간단하다. 대략 어떤 형태의 옵션인지 추측이 가능할 것이다. -r 은 파일을 읽어 들이고, -c 는 카운트 만큼 동작하고 중지하며 필터는 tcpdump 와 같은 필터를 걸때 사용하는 것이다. 저장되어 있는 패킷파일이 있다면 -r 옵션을 통해 기록되어 있는 IP 주소의 위치 정보를 알 수 있다.

# ./iploc.rb -v -r fake.pcap
Aggregating...CTRL-C to finish (if in live capture mode).
Inbound Addresses:
93.186.124.94,(Unknown Country?) (XX),(Unknown City?),,,31
91.207.192.25,UNITED KINGDOM (GB),(Unknown city),,,10
125.56.214.113,(Unknown Country?) (XX),(Unknown City?),,,4
72.14.203.100,UNITED STATES (US),Mountain View CA,37.402,-122.078,3
188.124.7.155,TURKEY (TR),Bursa,40.1833,29.0667,5
66.249.89.104,UNITED STATES (US),Mountain View CA,37.402,-122.078,61
188.124.7.156,TURKEY (TR),Bursa,40.1833,29.0667,5
209.190.85.9,INDONESIA (ID),Gombong,-6.1167,107.117,12
[생략]

너무 많은 경우에는 -c 옵션을 통해 제한하면 카운트 만큼만 보여준다.

# ./iploc.rb -v -r fake.pcap -c 100

이렇게 얻은 정보는 유용하게 사용될 수 있는데, 결과로 나온 형태가 CSV 라는 점에 주목해야 한다.
CSV 로 얻었으니, 내가 원하는 형태로 가공하여 사용할 수 있다. 보고서에 이용하는 것이라면 그래프등으로
변환하면 더욱 유용할 것이다.  필자는 이렇게 얻어진 CSV 데이터를 오픈오피스(OpenOffice)를 통해 가공해 보았다. CSV 파일을 로드하고, 구분자 옵션으로 콤마를 선택한다. 그러면 아래 그림과 같이 이쁘게 분리가 된다.


이후, 데이터가 로드되었으니 자기 입맛에 맞게 만들어 사용하면 된다. 아래 예제는 데이터를 나라별로 정렬하여 통계를 내 본것이다.

텍스트 파일 보다는 훨씬 깔끔하고, 분포를 쉽게 볼 수 있다.  IPLocation 을 통해 나온 그 데이터의 결과만 보지 말고 다양하게 활용할 수 있는 방법을 생각해 보면 무궁무진하다. 비싼 도구 없이도 오픈소스만으로도 멋진 보고서를 만들어 보도록 하자.

참고로, 위 내용과 관련한 이전 포스팅을 참고하면 도움이 될 것이다.

2010년 3월 23일 화요일

와이어샤크에서 위치정보 이용하기 - 접속국가를 쉽게 알 수 있다면...

패킷 분석은 IP 와 IP 간의 통신으로 가득차 있다. 근데 해당 IP 만 보고서 이게 도대체 어디의 IP 인지
알기가 힘들다. 일일이 후이즈(Whois)를 하자니 그것도 귀챦은 일이다.
이럴때 유용하게 이용해 볼 수 있는 것이 IP 정보를 DB 화 해 놓은 데이터를 이용하는 것이다.

GeoIP 라고 무료로 사용가능한 데이터를 제공해 주는 곳이 있다. 상용버전도 있지만,
GeoLite 라고 무료로 사용할 수 있다. 주소는 다음과 같다 :

http://geolite.maxmind.com/download/geoip/database/

아래 파일들을 다운받고 적절한 위치에 넣어두자.

GeoIP.dat.gz
GeoLiteCity.dat.gz
GeoIPASNum.dat.gz

그리고 와이어샤크의 메뉴 Edit->Preferences 을 가 보면 Name Resolution 이 있다. 거기에서 GeoIP database directories 를 선택하면 다음과 같은 화면을 보게 된다. New 를 눌러 데이터베이스가 있는 위치를 지정해 주고 저장해 보자


저장후에는 와이어샤크를 재 시작해주어야 한다. 이후, 패킷 덤프를 시작하고
Statistics->End Points 를 한번 실행해 보면 국가 정보, AS Number, 도시 정보를 볼 수 있다.



또한, 패킷 세부 정보를 보면 아래와 같이 나타나기도 한다.

하지만, 기본적으로는 세부 정보 화면에는 나타나지 않는다. Edit->Preferences 에 가서 Protocols 에서
IP 를 선택하면 Enable GeoIP lookups 이라는 부분을 체크해 주어야 한다.  아무래도 상세정보에도
표시를 하려면 성능에도 영향을 주게 될 것이다. 그러므로 필요에 따라 적절하게 사용하여야 할 것이다.

그래도 GeoIP 를 이용하는 것은 상당한 매력이 있다. 일일이 IP 를 조회해 보지 않고서도 해당 IP 의
국가와 지역, 서비스 프로바이더를 대략 알아낼 수 있기 때문이다. 이렇게만 볼 수 있다면 약간 서운할 것이다.
이 정보를 이용해 필터로 사용할 수는 없는 것일까? 물론 가능하다.

아래는 한국 국가에 대해서만 필터를 적용하는 예이다.

ip.geoip.country == "Korea, Republic of"

또 지역 중에 울산만 해당하는 것을 적용해 본다면

ip.geoip.city == "Ulsan, 21"
위와 같이 사용할 수 있다. 이외에도 사용가능한 문법은 더 많이 있다. 출력필터 부분에서 ip.geoip 라고
입력해 보면 사용가능한 문법을 볼 수 있을 것이다.