tcpdump는 어떻게 뜰까?

김재연·2024년 11월 25일
1

배경

종종 회사에서 와이어샤크나 tcpdump 명령어를 통해 네트워크 패킷을 분석해야되는 경우가 있는데, 이 글을 통해 tcpdump를 어떻게 사용사용 + 분석하는 방법에 대해 이야기하고자 한다.

netstat와 ifconfig 명령어

tcpdump 명령어나 와이어샤크를 통해 패킷 분석할때 네트워크 인터페이스 카드를 선택해야한다. 현재 내가 통신하는 호스트의 네트워크 인터페이스를 알기 위해서는 netstat 명령어와 ifconfig 명령어를 알아야 한다.

netstat

netstat 명령어은 networkstate의 약자로 말 그대로 네트워크 상태를 알려주는 리눅스 명령어이다. 해당 명령어를 통해 내 로컬 PC의 네트워크 연결 상태를 가르쳐 준다. 터미널에서 netstat -ant 명령어를 치면 아래와 같은 결과가 나온다.

플래그의미
-a모든 네트워크 커넥션 정보를 보여준다
-tTCP 연결만 표시
-ndns resovling을 해서 local address와 foregin address에 IP + 포트번호만 표시
-uUDP 연결만 표시
-p프로세스 ID 표시(OS마다 지원 유무가 다름)

image-20241124191204913

  • proto : 연결된 프로토콜 ex) tcp4, tcp6, udp4, udp6
  • local address : 내 서버의 IP주소
  • foregin address : 상대 서버의 IP주소
  • state : 현재 네트워크의 상태
    • established: 연결 된 상태
    • listen : 듣고있는 상태
    • TIME_WAIT : 연결 종료전 대기상태
    • CLOSE_WAIT : 애플리케이션이 이상하게 동작하고 있는 상태, 클라이언트로 부터 FIN 패킷을 받으면 close_wait 상태가 되고 서버는 ACK 패킷을 보내면 last_wait 상태가 되는데, close_wait은 서버에서 클라이언트로 ACK을 보내지 못한 상태(정상적으로 소켓 연결을 못끊었음)

naver.com 의 IP(223.130.192.247)은 현재 로컬 IP(192.168.0.2)의 59062포트에 연결된것을 확인할 수 있다. 이제 ifconfig 명령어를 통해 로컬 IP가 어느 네트워크 인터페이스를 사용하는지 확인해보자

IP 주소 얻어오기

만약 현재 내가 chrome 혹은 어플리케이션에서 naver.com 을 호출하고 있다면 naver.com 에 대한 IP 주소는 어떻게 가져올까? 커멘드라인 명령어로 도메인에 대한 IP 주소를 얻어올 수 있는데, 대표적으로 dignslookup 명령어를 통해 얻어올 수 있다. 터미널에 dig naver.com 를 쳐보자

image-20241124192016247

answer section에 나온 142.250.76.142google.com 에 대한 IP주소이다. 사진속 네모박스 영역에 279, A 는 레코드유효시간, 레코드 유형을 의미한다.

조금더 해석하면 142.250.76.142 IP 주소는 쿼리를 질의한 시간(When 영역)으로부터 279초까지 유효하다는 의미

ifconfig

image-20241124192422617

ifconfig의 inet은 로컬 네트워크의 IP주소를 의미한다. 위에서 naver.com 의 로컬 네트워크 IP는 192.168.0.2 라는 것을 확인하였고, ifconfig에서 해당 IP로 검색했을때 en0 의 inet과 매핑되는데, 이는 naver.comen0 네트워크 인터페이스와 통신하는것을 의미한다.

tcpdump

이제 네트워크 인터페이스를 확인했으면 tcpdump 명령어를 통해 네트워크 패킷을 캡쳐해보자

$sudo tcpdump -i en0 -lA -s1500 -nn tcp and port 80
  • -i : 네트워크 인터페이스 선택 => en0 만 보여준다.
  • -l : 라인단위로 버퍼링을 해서 더 빠르게 출력하고 실시간으로 볼 수 있다.
  • -A : 패킷의 내용도 표현, ASCII 텍스트 형태로 표현
  • -nn : 프로토콜과 포트번호를 숫자로 표현
  • tcp and port 80 : tcp 프로토콜이고 80 포트만 필터링
  • -vvv : 출력 결과에 더 많은 정보를 담는다.

image-20241125223328959

tcpdump 명령어를 입력하면 사진과 같이 네트워크 패킷들이 돌아다니는걸 확인할 수 있다. naver.com 의 경우 HTTPS로 통신되서 HTTP 사이트를 접속해서 패킷을 확인해보았다.

HTTP 페이로드가 나온건 -A 옵션을 통해 출력 형태를 아스키로 했기 읽을 수 있는 형태로 출력되었다.

22:34:16.452188 IP 192.168.0.6.60593 > 146.190.62.39.80: Flags [F.], seq 567, ack 751, win 2048, options [nop,nop,TS val 1192920859 ecr 4112259127], length 0
E..4..@.@..0......>'...P.N...nh.....Q,.....
G......7
  • 146.190.62.39.80 > 192.168.0.6.60600 : 출발지 -> 목적지를 의미
  • flag[F.] : tcp 플래그 의미, 위 출력결과에서는 FIN 플래그
  • seq : tcp 시퀀스 번호
  • win : 윈도우 크기
  • length : 페이로드 길이

위와 같은 형태로 TCPDUMP 명령어를 해석할 수 있다. 우리 회사의 경우 서버에 들어가서 sql 날라가는 쿼리나 통신 등을 살펴볼때 주로 사용했다.

tcpdump 명령어는 실시간으로 트래픽을 캡처하기 때문에 CPU, 메모리에 큰 부하를 줄 수 있기 때문에 사용할때 주의하는게 좋다.

정리

  • dig, netstat, ifconfig 명령어들을 활용해서 tcpdump 명렁어 사용법에 대해서 알아보았다. 서버에서 직접 dump를 수행해야되면 tcpdump 명령어를 사용할 수 있지만 그렇지 않으면 wireshark tool을 이용해서 네트워크 패킷을 분석할 수 있다. wireshark에서도 netstat, ifconfig를 통해 분석하고자 하는 호스트의 네트워크 인터페이스를 선택하면 손쉽게 패킷을 분석할 수 있다.
profile
이제 블로그 좀 쓰자

0개의 댓글