libpcap/tcpdump 를 이용한 네트워크 패킷 수집

반응형

장치에서 전송하거나 수신하는 네트워크 패킷을 수집하여 내용을 확인하려면 어떻게 해야 할까.

많은 사람들이 알고 있듯이 WireShark 라는 프로그램이 이러한 기능을 지원한다.

 

일반 컴퓨터에서는 WireShark 를 인터넷에서 다운로드하고 설치하여 사용할 수 있지만, 임베디드 환경에서는 어떻게 해야 할까.

사실 네트워크 패킷을 수집하는 기능은 pcap 이라는 라이브러리에서 지원한다. WireShark 역시 pcap 라이브러리를 기반으로 네트워크 패킷 수집 기능을 제공하고 있다.

 

본 글에서는 임베디드 리눅스 플랫폼 상에서 pcap 라이브러리(libpcap, 네트워크 패킷 수집 라이브러리)와 tcpdump 유틸리티(libpcap 을 이용하여 패킷을 수집하는 프로그램)를 이용하여 네트워크 패킷을 수집하는 기능을 소개한다.

버전

글 작성 시점(2019.04) 기준으로 최신 버전은 libpcap-1.9.0 과 tcpdump-4.9.2 이지만, libpcap-1.9.0 버전 빌드 시 기본적으로는 공유 라이브러리 파일(libpcap.so)이 생성되지 않는다.  tcpdump 는 실행 시점에 해당 라이브러리 파일을 필요로 하기 때문에, 해당 파일이 없으면 tcpdump 를 실행하지 못한다 → 이는 임베디드 플랫폼 상에서의 테스트를 위한 결과이다. 일반 리눅스 PC 플랫폼에서는 추가 확인이 필요하다.

당연히 빌드 명령을 직접 적절하게 수정하면 생성이 가능하겠지만, 시간이 별로 없었던 관계로 일단 공유 라이브러리 파일이 기본적으로 생성되는 과거 버전을 사용하였다.

따라서 본 글에서 사용된 버전은 libpcap-1.8.1 과 tcpdump-4.9.0 버전이다.

해당 파일들은 https://www.tcpdump.org/#old-releases 에서 다운로드할 수 있다.

빌드

libpcap 과 tcpdump 는 빌드하는 방법이 동일하다.
아래와 같이 configure 명령어에서 크로스컴파일러와 커널버전을 명시해 준다.

$ CC=<Cross compiler gcc> ac_cv_linux_vers=<kernel version> ./configure --host=arm-linux --with-pcap=linux
  • CC 의 예 : powerpc-linux-gnu-gcc, arm-linux-gnueabihf-gcc
  • ac_cv_linux_vers 의 예 : 4
  • --host=arm-linux, --with-pcap=linux 는 삭제해도 될 것으로 보임.

빌드 예 : powerpc 플랫폼 용으로 빌드

$ tar zxf libpcap-1.8.1.tgz
$ cd libpcap-1.8.1
$ CC=powerpc-linux-gnu-gcc ac_cv_linux_vers=2 ./configure --host=arm-linux --with-pcap=linux
$ make
$ file libpcap.so.1.8.1
libpcap.so.1.8.1: ELF 32-bit MSB  shared object, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked, BuildID[sha1]=6a049adbc0fb77978d446f910fff778d9dcfdf2a, not stripped
$
...
$ tar zxf tcpdump-4.9.0.tgz
$ cd tcpdump-4.9.0
$ CC=powerpc-linux-gnu-gcc ac_cv_linux_vers=2 ./configure --host=arm-linux --with-pcap=linux
$ make
$ file tcpdump
tcpdump: ELF 32-bit MSB  executable, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=773718a84d07034a17bd64435e3ed4b4f7a5009d, not stripped

빌드 예 : arm 플랫폼 용으로 빌드

$ tar zxf libpcap-1.8.1.tgz
$ cd libpcap-1.8.1
$ CC=arm-linux-gnueabihf-gcc ac_cv_linux_vers=4 ./configure --host=arm-linux --with-pcap=linux
$ make
$ file libpcap.so.1.8.1
libpcap.so.1.8.1: ...
$
...
$ tar zxf tcpdump-4.9.0.tgz
$ cd tcpdump-4.9.0
$ CC=arm-linux-gnueabihf-gcc ac_cv_linux_vers=4 ./configure --host=arm-linux --with-pcap=linux
$ make
$ file tcpdump
tcpdump: ...

참고 : 리눅스 PC 플랫폼에서 빌드

$ tar zxf libpcap-1.8.1.tgz
$ cd libpcap-1.8.1
$ ./configure
$ make
$ sudo make install
$ file
libpcap.so.1.8.1: ...
$
...
$ tar zxf tcpdump-4.9.0.tgz
$ cd tcpdump-4.9.0
$ ./configure
$ make
$ sudo make install
$ file tcpdump
tcpdump: ...

네트워크 패킷 수집 및 확인

임베디드 플랫폼 상에서 네트워크 패킷 수집

생성된 libpcap.so 파일과 tcpdump 파일을 임베디드 플랫폼으로 다운로드하여 네트워크 패킷을 수집한다.

  • libpcap.so : /lib 디렉터리에 복사
  • tcpdump : /usr/bin 디렉터리에 복사

 

다음은 eth0 네트워크 인터페이스로 교환되는 네트워크 패킷을 수집하여 test.pcap 파일에 저장하는 명령이다.

$ tcpdump -i eth0 -w test.pcap

위와 같이 실행된 상태에서 eth0 네트워크 인터페이스를 통해 네트워크 패킷이 교환되면, 해당 패킷들이 pcap 형식으로 test.pcap 파일에 저장된다.

수집 패킷  파일 업로드 및 내용 확인

수집 패킷 파일(test.pcap)을 컴퓨터로 업로드한 후, 컴퓨터에 설치된 WireShark 프로그램에서 해당 파일을 열면 수집된 각 패킷의 내용을 확인할 수 있다.

 

마치며

본 글은 임베디드 리눅스 플랫폼 상에서 libpcaptcpdump 를 사용하는 방법에 대해 다루고 있지만, 일반 리눅스 PC 에서 gcc 를 이용하여 빌드하면 일반 리눅스 PC 에서도 사용할 수 있다. 

 


파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

댓글

Designed by JB FACTORY