TV 에 네트워크 기능이 늘어남에 따라 덩달아 이에 관련한 문제들도 많아졌다. 네트워크 통신 도중 발생하는 오류들에 대해 교통정리를 하기 위해서는 원인 분석이 필요하다.
Latch-up 시 출력되는 Segmentation Fault 메세지나 Core dump 로그를 통해 문제의 원인을 파악할 수 있듯이, 네트워크 통신 과정에서 발생하는 오류를 분석하기 위해서는 패킷 분석이 필요하다.
물론 패킷 분석이 모든 문제를 해결해줄 수는 없다. 어디까지나, 상황에 따라서 얼마든지 달라질 수 있다.

현재 TV 에서 사용하는 모든 네트워크 서비스들은 TCP/IP 를 사용한다. 이 뜻은 각 네트워크 계층마다 약속된 포맷의 패킷을 만들어 서로 주고 받는다는 뜻이다.
최종 계층의 Application 이 아닌 그 아래 계층에서의 패킷의 포맷은 동일하다. 따라서 패킷 캡쳐를 통해 분석이 가능한 것이다.

TV 에서의 패킷 캡쳐 방법

TV 에서 주고 받는 패킷들에 대해 캡쳐하기 위해서는 몇 가지 방법이 있다. 각각마다 장단점이 존재한다.

  1. 더미(Dummy) 허브를 사용하는 방법
  2. IP Forwarding 기능을 사용하는 방법
  3. TV 에서 직접 캡쳐하는 방법

1번의 경우가 가장 간단한 방법이다. 하지만, 현재 나오는 허브 및 공유기들은 모두 스위칭 허브이다. 더미허브는 각 Port 마다 전송되는 패킷을 모두 Broadcast 하는 데, 반해 스위칭 허브는 요청한 Port 로만 Packet 을 전송한다. 따라서 같은 공유기에 연결되어 있다하더라도, 다른 Port 에 연결되어 있기 때문에 TV 에서 주고 받은 패킷을 캡쳐할 수 없다. 더미 허브는 구하기가 어렵고, 구하더라도 중고로 구입해야 한다. 또한 Bandwidth 가 최소 100 MBps 는 지원이 되어야 하기 때문에 사용이 어렵다.

2번의 경우, 나름 간편하게 할 수 있다. 하지만, IP Forward 를 해줄 PC 가 필요하고, PC 를 한번 거쳐서 가기 때문에 Throughput 에 영향을 줄 수 있어, Overhead 또는 Latency 가 증가될 수 있다.

3번의 경우, 별도의 장비가 없이도 패킷 캡쳐를 할 수 있다는 장점이 있다. 하지만, CPU 부하를 줄 수 있어, 기능 동작에 영향을 줄 수 있다.
이 문서에서는 3번의 방법을 설명한다.

패킷 캡쳐 라이브러리 libpcap

tcpdump 빌드 시에 필요하며, 사전에 미리 컴파일하여 라이브러리를 생성해야 한다. 여기서는 libpcap-1.1.1 을 사용한다.

패킷 캡쳐 프로그램 TCPDUMP

패킷을 캡쳐할 수 있는 여러가지 프로그램들이 있다. 그 중에서 소스 코드가 공개된 오픈소스인 TCPDUMP 를 선택했다. http://www.tcpdump.org/ 에서 다운로드 받을 수 있다.
현재 최신버전은 4.1.1 이다.

tcpdump 를 빌드하기전에 pcap 라이브러리를 컴파일해야 한다. 여기서 생성된 라이브러리는 tcpdump 빌드시 링킹된다. 크로스컴파일을 위해 Makefile 의 CC 와 RANLIB 를 툴체인에 맞게 수정한다.

#make

에러없이 빌드되었다면, libpcap.a, libpcap.so.1.1.1 이 생성되었을 것이다.
이제 tcpdump 를 빌드해보자.

#CC=mipsel-linux-gcc CXX=mipsel-linux-g++ ac_cv_linux_vers=2 ./configure --host=mipsel-linux --with-pcap=linux
#make

위의 지정된 CC, CXX, –host 의 변수값은 툴체인에 따라 각각 수정한다.
정상적으로 컴파일이 되었으면, 'tcpdump' 라는 파일이 생성될 것이다.

TCPDUMP 는 많은 옵션들을 제공하는 데, 그 중에서 자주 사용되는 것을 위주로 설명한다.

명령어 설명
-i ethX 대상 네트워크 카드를 지정
-w filename 출력을 특정 파일로 지정
-r 특정 파일을 text 포맷형식으로 변환하여 확인
-c NUM NUM 만큼 패킷의 head 를 확인
-s NUM 패킷의 길이(1500 이 패킷의 전체길이를 의미, 물론 변경될 수도 있음(ifconfig 확인)
-tcp port XX tcp XX 포트만 지정
-host IP 특정 IP 만 캡쳐
-Xqnr 저장한 데이터를 ASCII 모드로 파일 내용을 확인

다음은 위의 옵션을 사용한 예다.

사용 예 설명
#tcpdump 현재 서버의 모든 Packet 을 보여줌
#tcpdump -i eth0 특정 Ethernet(eth0) device 로 송수신 되는 데이터 패킷을 덤프하여 확인
#tcpdump -i eth0 -w Test 특정 Ethernet device 로 송수신 되는 패킷들을 파일로 저장 및 확인
#tcpdump -r Test Test 에 저장된 패킷헤드들을 확인
#tcpdump -i eth0 -c 10 Ethernet 에서 지정한 개수만큼의 네트워크 패킷 덤프하여 확인
#tcpdump -w test.log -s 1500 tcp port 22 and host 192.168.0.1서버의 특정포트로 송수신되는 모든 데이터 패킷 전체를 확인, 이 명령어의 의미는 현재 로컬서버와 192.168.0.1 서버사이의 통신 데이터 패킷 중 tcp 22번 포트의 모든 패킷을 1500 길이로 캡쳐하여 test.log 파일에 저장
#tcpdump -Xqnr test.log 캡쳐한 test.log 파일의 내용을 ASCII 모드로 확인

예를 들어 패킷된 정보를 'test.log' 라는 파일로 저장했다면, 파일이름을 'test.pcap' 로 수정한다. 그리고 이를 'wireshark' 로 열어보면, 패킷 정보를 볼 수 있다.

FAQ

에러가 발생하는 소스코드에 정의되어 있는 함수 루틴을 주석처리하면 된다.

  • computer/lg/tcpdump_사용하기.txt
  • Last modified: 3 years ago
  • by likewind