iBetter Books
수정

tcpdump와 Wireshark 깊이 보기

ping이나 curl로 원인을 어느 정도 좁혔지만, "정확히 어떤 패킷이 오가는지" 알고 싶을 때가 있습니다. 그때 꺼내는 도구가 tcpdump와 Wireshark입니다. 두 도구는 네트워크 인터페이스를 지나는 패킷을 있는 그대로 캡처합니다. 앞 절에서 현미경이라고 불렀던 이유입니다.

tcpdump 기본 사용법

tcpdump는 터미널에서 바로 쓸 수 있는 명령줄 도구입니다. 루트 권한이 필요합니다.

# 파일: 터미널sudo tcpdump -i en0 -n

-i en0은 캡처할 인터페이스를 지정합니다. macOS에서 인터페이스 이름은 하드웨어 구성에 따라 달라지므로, ifconfignetworksetup -listallhardwareports로 실제 이름을 먼저 확인하는 것이 안전합니다. Wi-Fi는 흔히 en0이지만 기기에 따라 다를 수 있습니다. Linux에서는 eth0, ens3 등으로 다릅니다. -n은 IP와 포트를 이름으로 변환하지 않고 숫자 그대로 보여주는 옵션입니다. 변환에 걸리는 DNS 조회를 막아 출력 속도가 빨라집니다.

특정 호스트나 포트만 보고 싶을 때는 필터를 씁니다.

# 파일: 터미널sudo tcpdump -i en0 -n host 93.184.216.34sudo tcpdump -i en0 -n port 80sudo tcpdump -i en0 -n tcp and port 443

출력 한 줄을 읽는 방법은 이렇습니다.

23:10:02.123456 IP 192.168.0.10.52341 > 93.184.216.34.80: Flags [S], seq 0, win 65535

시각, 출발지 IP와 포트, 목적지 IP와 포트, TCP 플래그([S]는 SYN), 시퀀스 번호, 윈도우 크기 순서로 읽습니다. [S]가 SYN, [S.]가 SYN-ACK, [.]가 ACK, [F.]가 FIN-ACK입니다. 3-way handshake가 눈에 보입니다.

파일로 저장해서 Wireshark로 분석하기

터미널에서 직접 읽는 것에 한계가 있을 때는 -w 옵션으로 파일에 저장하고, Wireshark에서 열면 됩니다.

# 파일: 터미널sudo tcpdump -i en0 -n -w capture.pcap

Ctrl+C로 캡처를 중단하면 capture.pcap 파일이 생깁니다. Wireshark에서 파일을 열면 각 패킷을 클릭해서 계층별로 분해한 내용을 볼 수 있습니다. 이더넷 헤더, IP 헤더, TCP 헤더, HTTP 본문이 트리 구조로 펼쳐집니다.

Wireshark 필터

Wireshark의 표시 필터는 tcpdump 문법과 다릅니다. 자주 쓰는 필터 몇 가지입니다.

http
tcp.port == 443
ip.addr == 192.168.0.10
tcp.flags.syn == 1 and tcp.flags.ack == 0

Follow TCP Stream 기능을 쓰면 하나의 TCP 연결에서 오간 데이터 전체를 하나의 텍스트로 보여줍니다. HTTP 요청과 응답이 실제로 어떻게 생겼는지 한눈에 확인할 수 있습니다.

언제 꺼내야 하는가

tcpdump와 Wireshark는 강력하지만 모든 트래픽이 쏟아지기 때문에 처음부터 쓰면 정보의 홍수에 빠집니다. 앞 절의 6단계 순서로 계층을 좁힌 뒤, "이 구간에서 패킷이 실제로 어떻게 오가는지 눈으로 확인하고 싶다"는 단계에서 꺼내는 것이 적절합니다. 도구를 아는 것과 언제 쓰는지 아는 것은 다른 기술입니다.

다음 장에서는 여기서 배운 도구들을 들고 실제 장애 시나리오 현장으로 들어갑니다.

03. tcpdump와 Wireshark 깊이 보기 — 소설처럼 읽는 데이터통신과 컴퓨터 네트워크 | iBetter Books