TV 에 네트워크 기능이 늘어남에 따라 덩달아 이에 관련한 문제들도 많아졌다. 네트워크 통신 도중 발생하는 오류들에 대해 교통정리를 하기 위해서는 원인 분석이 필요하다.
Latch-up 시 출력되는 Segmentation Fault 메세지나 Core dump 로그를 통해 문제의 원인을 파악할 수 있듯이, 네트워크 통신 과정에서 발생하는 오류를 분석하기 위해서는 패킷 분석이 필요하다.
물론 패킷 분석이 모든 문제를 해결해줄 수는 없다. 어디까지나, 상황에 따라서 얼마든지 달라질 수 있다.
현재 TV 에서 사용하는 모든 네트워크 서비스들은 TCP/IP 를 사용한다. 이 뜻은 각 네트워크 계층마다 약속된 포맷의 패킷을 만들어 서로 주고 받는다는 뜻이다.
최종 계층의 Application 이 아닌 그 아래 계층에서의 패킷의 포맷은 동일하다. 따라서 패킷 캡쳐를 통해 분석이 가능한 것이다.
TV 에서의 패킷 캡쳐 방법
TV 에서 주고 받는 패킷들에 대해 캡쳐하기 위해서는 몇 가지 방법이 있다. 각각마다 장단점이 존재한다.
- 더미(Dummy) 허브를 사용하는 방법
- IP Forwarding 기능을 사용하는 방법
- 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
tcpdump 빌드 시, 에러(multi define)가 발생함
에러가 발생하는 소스코드에 정의되어 있는 함수 루틴을 주석처리하면 된다.