https://github.com/kyeongjun-dev/network
쉬어가는 느낌으로 시리즈 1의 상황을 직접 패킷분석해보려고 한다.
먼저 wireshark가 설치되어 있어야 하고, tcpdump 명령어 사용이 가능해야 한다.
로컬에서 해도 되지만, 구분되는게 편할 거 같아서 docker compose로 컨테이너 2개를 띄운다. (소스코드 : 레포 03 디렉토리)
먼저 03 디렉토리로 이동한 뒤, 아래 명령어로 컨테이너 2개를 실행한다. 컨테이너는 네트워크 관련 패키지들이 설치된 파이썬 컨테이너다.
docker-compose up --build
아래와 같이 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.py랑 01-server.py는 연결 주소를 127.0.0.1에서 server로 변경했다. (docker compose로 실행될 때 호스트네임이 각각 client, server로 변경된다.)
아래와 같이 정상 연결이 확인되면

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

이제 컨테이너랑 마운트 된 경로에 아래처럼 파일 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 주소 확인이 가능하다.
분석해보자면
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 같은 컴포넌트가 끼게되면 더욱 복잡해진다.
힘들지만 해보자...