티스토리 뷰

0. TCPdump란?

tcpdump is a data-network packet analyzer computer program that runs under a command line interface.

(*인용 https://en.wikipedia.org/wiki/Tcpdump)

 

위키백과에 설명이 너무 잘 나와있어 그대로 인용해 보았다. 정의를 정말 딱! 잘 내린 것 같다.

 

'CLI 환경에서 동작하는 Packet analyzer이다.'

 

여기서 Packet analyzer은 의미 그대로 패킷 분석기라고도 생각해도 되고, Packet sniffer라고도 가끔 부르니 알아두면 좋을 듯하다. (packet을 sniff하는..?!)

 

위의 정의가 와닿지 않는다 하면 Linux(CLI) 버전 Wireshark라고 생각해도 충분하다.

 

Ubuntu에 기본 설치되어있어 손쉽게 사용할 수 있다(타 Linux OS는 확인 필요.).

 

1. 필요성

주로.. 트러블슈팅(문제 해결)할 때 자주 사용한다.  특히 서버에서 tcpdump를 많이 사용하는데, 네트워크 장비에서 tcpdump와 비슷한 packet sniffer를 많이 사용하기도 하지만 사용법이 조금 다른 것 같다.

 

단말(서버, 클라이언트 모두 포함)에서 통신이 안돼요...!라고 하면 여러 가지를 확인해야 하는데, 그때 이 tcpdump를 통해 많은 정보를 얻을 수 있다.

 

네트워크 엔지니어 입장에서는 서버 엔지니어 또는 사용자가 tcpdump를 사용해 패킷을 캡처한 자료를 보고 문제를 해결해야 하는 경우가 대다수이다. 그래서 tcpdump와 친숙해질 필요가 있다. 아무래도 packet과 이야기하는 게 가장 정확하기도 하다.

 

packet을 열어봐야 알 수 있는 내용을 한 가지 예를 들어 보면,

HTTP통신이 안 될 때..? 를 예로들 수 있겠다. 이게 웹서버에서 port를 안 열어서 그런지, 경로상에 있는 방화벽에서 해당 포트를 막은 것 인지 등에 대한 정보를 packet을 열어봐야 알 수 있기 때문이다. 흔히 사용하는 ICMP(Ping)에서도 많은 정보를 얻을 수 있다. 네트워크 엔지니어 입장에서는 ping request/reply만 잘 왔다 갔다 하면 큰 죄(?)는 없다고 생각해도 되기 때문에...

 

그래서, tcpdump에서 알아야 할 기초적이면서도 자주 사용하는 명령어를 위주로 살펴보고, 더 많은 정보를 확인할 수 있도록 pcap 형태로 저장한 뒤 wireshark에서 열어보는 것까지 알아보자.

 

2. 네트워크 구성

그림1. 실험 구성

랩은 위 그림 1과 같이 구성했다. ubuntu를 설치했고 네이버클라우드(ncloud) VM을 사용했다(애용 좀..😭).

 

다음과 같은 순서로 살펴보자

 

1) 특정 인터페이스의 모든 패킷 확인하기

2) 특정 인터페이스의 특정 패킷만 확인하기

  2-1) 특정 출발지 혹은 특정 도착지

  2-2) 특정 포트

  2-3) 특정 프로토콜

 

위 정도만 알아도 트러블슈팅하는데 문제 될 게 전혀 없다.

 

 

3. 본론

우선, Wireshark를 사용해보신 분이라면 아래와 같은 그림을 본 적이 있을 것이다.

그림 2. Wireshark 시작화면

Wireshark 시작화면인데, Capture filter가 아닌 그 밑에 무언가를 선택해야지 다음 캡쳐화면으로 넘어간다. 이때, 자신(wireshark)이 확인(sniff)하고자 하는 인터페이스를 선택하는 과정이다.

 

여기서 인터페이스(interface)란, (class에 interface 구현하는 게 아니고..😅)

NIC(Network Interface Card)이다.

더 간단히 해보면, 집에서 PC로 youtube를 볼 때, 랜선을 통해서 영상 데이터가 들어올 텐데, PC 본체 뒤에 그 랜선을 꼽는 그 포트(구멍)이라고 할 수 있겠다.

 

요즘 노트북에는 LAN 포트(RJ-45) 없이 WIFI만 장착되어 나오는 경우가 많은데, 집 AP(공유기)까지 접근하기 위한 L2 수단을 Wifi(전파)로 사용하는 거라고 생각하면 된다. 

랜선을 사용하는 경우는 집 공유기까지 데이터가 랜선을 통해서 가는 거라고 생각하면 되고..

 

 

이처럼,

tcpdump도 어떤 인터페이스를 살펴볼 것인지 결정하는 과정이 필요하다.

그렇다면 그림 2처럼 어떤 인터페이스가 있는지 알아내는 과정이 필요하다.

그럴 때는 

ifconfig 명령어를 입력하여 자신의 인터페이스를 살펴보자

 

그림 3. Client(ubuntu)의 ifconfig

eth0lo가 보인다. eth0은 이더넷 0번 포트이고.. mtu값, ipv4 주소 등을 확인할 수 있다.  lo는 loopback 인터페이스로, 논리적인 인터페이스이다. 자기 자신을 주로 의미한다. 이해하기 쉽게.. loopback인터페이스는 자기 자신을 의미하는데, 흔히 웹서버를 띄우고 주소창에 127.0.0.1을 입력하면 초기화면(index.html)이 출력되는 것을 볼 수 있다.

출력되는 이유는 L7에서 HTTP 요청을 L4 TCP에게 내려주면, TCP가 그걸 Encapsulation하고, L3로 내린다. L3 layer에서 목적지 주소가 127.0.0.1인 것을 확인하고 자기 자신이라고 판단하여 L2 layer로 내려보내지 않고 L4 layer로 올려보내 화면을 출력하게 되는 형태라고 이해하면 좋을 듯하다.

 

 

eth0을 통해 송수신되는 패킷들을 살펴보자

-i 옵션을 통해서 인터페이스를 지정할 수 있는데, 이러한 정보는 다른 블로그에서도 손쉽게 찾아볼 수 있는 정보이기도 하고, tcpdump -h 혹은 -help 등 명령어를 입력하면 다양한 정보들이 나온다. 그걸 참고하면 좋겠다.

 

tcpdump -i eth0

을 입력하면 eth0을 통해 송수신 되는 패킷을 출력할 수 있다.

그림 4. tcpdump -i eth0

현재 서버(192.168.10.6)에서 ssh를 통해 클라이언트1(192.168.10.7)로 접속을 했기 때문에 ssh 관련한 패킷이 엄청나게 송수신되고 있는 것을 알 수 있다. 2~3초 정도 캡처했는데 20000개가량의 패킷이 캡처되었다.

이러면 슬슬 Wireshark 처럼 display filter나 capture filter가 있으면 좋겠다는 생각이 들 것이다.

 

 

그림 5. Ping 송신

클라이언트1(192.168.10.7)에서 그림 4와 같이 ssh 패킷이 많이 오고 가는 상황에, 그림 5처럼 클라이언트2가 클라이언트1에게 ICMP(ping) 보내는 것을 캡처해보자.

tcpdump -i eth0 icmp

그림 6. eth0으로 송수신되는 icmp패킷 캡처 명령어

위 그림 6과 같이 캡처하고 싶은 프로토콜 이름을 적어주면 된다.

그림 4처럼 엄청나게 많은 패킷이 화면에 출력되지 않는다. 아까 위에서 나왔던 ssh패킷은 icmp패킷이 아니기 때문에 출력되지 않는다.

 

 

이제, 다른 VM(192.168.10.8)에서 패킷을 캡처하고 있는 클라이언트1(192.168.10.7)로 Ping을 송신해 보자.

그림 7. 클라이언트1(왼쪽)에서의 클라이언트2(오른쪽)패킷 캡처

그러면 그제서야 그림 7의 왼쪽처럼 ICMP 패킷이 캡처되는 것을 볼 수 있다. 출발지는 192.168.10.8인게 확인이 된다. 특이한 점은, 내가 수신하는 패킷(icmp request), 내가 송신하는 패킷(icmp reply)이 두개 다 캡처된다는 점이다.

 

 

이번에는 프로토콜을 필터로 사용하지 말고 주소를 필터로 사용해보자.

이번에도 클라이언트 1(192.168.10.7)에서 확인하고, VM(192.168.10.8)에서 출발하는 아무 패킷을 다 캡처해볼 것이다.

 

Client 1 (192.168.10.7)
  tcpdump -i eth0 src 192.168.10.8
  
Client 2(VM, 192.168.10.8)
  ping 192.168.10.7
  curl 192.168.10.7

위 명령어를 입력했으며, 

그림 8. 클라이언트1에서의 패킷 캡처 결과

위 그림 8과 같이 패킷이 출력되었다.

이번에도 특이사항으로는, 출발지를 특정했기 때문에, 클라이언트1(192.168.10.7)이 클라이언트2(192.168.10.8)에게 전송하는 icmp reply가 출력되지 않은 것을 볼 수 있다.

 

그리고, curl(HTTP)을 사용하여 http 통신을 한 것도 캡처가 되었다.

 

src 주소를 지정한 것처럼 목적지 주소도 지정할 수 있다. 이 두 개를 포괄하는 host 옵션도 사용 가능하다.

 

특정 프로토콜만 캡처하는 것이 아닌 특정 포트도 캡처할 수 있다.

여러 개의 필터를 함께 줘보자.

 

클라이언트 1(192.168.10.7)에서 src 주소가 클라이언트2(192.168.10.8)인 것, 그리고 포트번호 80번으로 들어오는 패킷을 캡처해보자

 

Client 1 (192.168.10.7)
  tcpdump -i eth0 src 192.168.10.8 and port 80
  
Client 2(VM, 192.168.10.8)
  ping 192.168.10.7
  curl 192.168.10.7

그림 9. 특정 출발지이면서 특정 포트로 들어오는 패킷 캡처

위 그림 9를 보면 ICMP 패킷은 캡처가 되지 않는다. 출발지 조건에는 포함되나 port 조건에 맞지 않기 때문이다.

HTTP 는 80번 포트를 사용하고 출발지도 위와 같기 때문에 두 조건에 맞아 패킷이 캡처된다.

흔히 프로그래밍 할 때 && 조건을 붙여주는 게 and로 왔다고 생각하면 쉽겠다.

 

이제 마지막으로,

해당 파일을 pcap으로 저장해보도록 하자.

아! pcap형태로 저장하기 전에 일단 파일로 저장하는 방법을 알아보자.

 

이번엔 서버(192.168.10.6)에서 클라이언트 1,2 (192.168.10.7 ,  192.168.10.8)로 부터 icmp 패킷만 캡처하여 파일로 저장해볼 것이다.

server (192.168.10.6)
  tcpdump -i eth0 -w packet.log src 192.168.10.7 or src 192.168.10.8 and icmp
  
client1 (192.168.10.7)
  ping 192.168.10.6 -c 3
  
client2 (192.168.10.8)
  ping 192.168.10.6 -c 3

그림 10. tcpdump 결과를 파일로 저장

-w 옵션을 넣으면 파일에 결과값이 출력이 된다.

현재 디렉터리의 파일 목록을 보는 명령어 'ls -al ' 를 입력하면 packet.log가 저장되어있는 것이 보인다.

여기서 중요한 점은 tcpdump로 저장한 파일은 cat, vi 등을 이용해서 읽어볼 수 없다는 점이다.

그림 11. tcpdump -r 옵션을 사용한 덤프파일 읽기

위 명령어를 응용하여 pcap으로 저장한 뒤에 scp로 내 local로 가져와서 wireshark로 읽어보자.

packet.log 를 packet.pacp으로 바꿔주면 된다.

server (192.168.10.6)
  tcpdump -i eth0 -w packet.pcap src 192.168.10.7 or src 192.168.10.8 and icmp
  
local
  scp {서버 아이디}@{서버 IP 주소}:{옮기고 싶은 파일의 경로} {파일을 다운로드할 경로}

pwd 명령어를 사용해서 server에서 파일이 어디 있는지 확인해준 뒤에,

scp root@1.2.3.4:/root/packet.pcap C:\Users\PC\Desktop\

위 명령어로 파일을 원격 서버에서 로컬 PC로 가져올 수 있다.

 

그림 12. scp를 통하여 파일을 local로 가져온 뒤 wireshark로 실행

이런 방법으로 패킷을 조금 더 자세히 열어볼 수 있다.

scp뿐만아니라 ftp 등 여러 가지 방법으로 파일을 가져오기만 하면 된다.

 

 

 

4. 마무리

tcpdump 사용법을 달달 외우고 있을 필요까지는 없다고 생각한다. 패킷을 봐야 할 때, 어떤 툴이 있고 어떻게 하면 더 자세히알 수 있는지 그런 방법론만 알아도 필요할 때 찾아보면 된다.

그런데 원활한 커뮤니케이션을 위해서, 어느 정도 알고 있는 것은 충분히 좋다고 생각한다.

실제로 사용해보면서 위에 기재한 내용들만 알아도 큰 문제가 없다고 생각하고, 또 구글에 잠깐만 찾아보면 명령어들이 쫘라락 나오니까, 모른다고 조급해하거나? 그럴 필요는 없다고 본다~!

 

댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday