내 마음대로 네트워크 시리즈 - 2

김경준·2025년 11월 30일

네트워크

목록 보기
2/8

소스코드

https://github.com/kyeongjun-dev/network

개요

wireshark로 패킷 분석하기

쉬어가는 느낌으로 시리즈 1의 상황을 직접 패킷분석해보려고 한다.
먼저 wireshark가 설치되어 있어야 하고, tcpdump 명령어 사용이 가능해야 한다.

실제로 해보기

docker compose로 컨테이너 2개 실행

로컬에서 해도 되지만, 구분되는게 편할 거 같아서 docker compose로 컨테이너 2개를 띄운다. (소스코드 : 레포 03 디렉토리)

먼저 03 디렉토리로 이동한 뒤, 아래 명령어로 컨테이너 2개를 실행한다. 컨테이너는 네트워크 관련 패키지들이 설치된 파이썬 컨테이너다.

docker-compose up --build

아래와 같이 client, server 디렉토리가 생성된 것을 확인할 수 있다.

tcp dump 및 client에서 server 접속

이제 server 컨테이너로 접속해서 01-server.py를 실행시킨다.

docker exec -it server tcpdump -i any -n 'port 30000' -w /app/captures/server.pcap

client 컨테이너로도 접속해서 tcpdump를 실행한다.

docker exec -it client tcpdump -i any -n 'port 30000' -w /app/captures/client.pcap

터미널을 하나 더 열어서 server 컨테이너로 접속한 뒤, 01-server.py를 실행시킨다.

docker exec -it server python 01-server.py

터미널을 하나 더 열어서 client 컨테이너로 접속한 뒤, 01-client.py를 실행시킨다.

docker exec -it client python 01-client.py

01-client.py01-server.py는 연결 주소를 127.0.0.1에서 server로 변경했다. (docker compose로 실행될 때 호스트네임이 각각 client, server로 변경된다.)

아래와 같이 정상 연결이 확인되면

tcpdump를 실행한 터미널에서는 Ctrl + C로 종료시켜준다.

wireshark로 패킷 확인

이제 컨테이너랑 마운트 된 경로에 아래처럼 파일 2개가 생성된 것을 확인할 수 있다.

client, server 패킷을 확인해보자. mac 기준으로 wireshark 창을 여러 개 띄우려면 open -n /Applications/Wireshark.app/로 여러 개를 띄운다.

172.22.0.2는 client, 172.22.0.3은 server다 - docker inspect server, docker inspect client 에서 ip 주소 확인이 가능하다.

분석해보자면

  • TCP 3-Way Handshake(연결)
  1. client > server : SYN 전송
  2. server > client : SYN, ACK 전송
  3. client > server : ACK 전송 - tcp 연결 완료
  • 4-Way Handshake(종료)
  1. client > server : FIN, ACK 전송 - tcp 종료 시작
  2. server > client : FIN, ACK 전송
  3. client > server : ACK 전송 - tcp 연결 종료

여러 케이스 별 패킷 분석

client가 1초 간격으로 시도하는 도중, server 실행

02-client.py를 실행하고, 약 5초 후에 02-server.py를 실행했다.

패킷은 아래와 같다. docker compose를 다시 실행했는데, 이번에는 client가 172.22.0.3이고, server가 172.22.0.2 이다.

분석해보자면
1. client가 server로 연결요청(SYN)을 보냄
2. 서버는 연결할 수 없다며 RST, ACK 패킷을 client에 전송함
3. client는 1초 단위로 연결을 재시도 하므로, 위 1~2 과정을 총 5번 반복
4. 약 5초 뒤 server가 실행되고, 정상적으로 연결을 맺음
5. 연결된 직후, client가 FIN, ACK를 전송해서 tcp 연결 종료

정리 및 다음 글에서는...

이런 식으로 wireshark를 이용해 패킷을 분석할 수 있다.
지금은 단순히 client, server만 로컬에 띄워서 테스트해서 패킷 분석이 간단하지만, 중간에 load balancer나 istio 같은 컴포넌트가 끼게되면 더욱 복잡해진다.
힘들지만 해보자...

profile
DevOps로 일하고 있습니다

0개의 댓글