종종 회사에서 와이어샤크나 tcpdump 명령어를 통해 네트워크 패킷을 분석해야되는 경우가 있는데, 이 글을 통해 tcpdump를 어떻게 사용사용 + 분석하는 방법에 대해 이야기하고자 한다.
tcpdump 명령어나 와이어샤크를 통해 패킷 분석할때 네트워크 인터페이스 카드를 선택해야한다. 현재 내가 통신하는 호스트의 네트워크 인터페이스를 알기 위해서는 netstat 명령어와 ifconfig 명령어를 알아야 한다.
netstat 명령어은 networkstate의 약자로 말 그대로 네트워크 상태를 알려주는 리눅스 명령어이다. 해당 명령어를 통해 내 로컬 PC의 네트워크 연결 상태를 가르쳐 준다. 터미널에서 netstat -ant
명령어를 치면 아래와 같은 결과가 나온다.
플래그 | 의미 |
---|---|
-a | 모든 네트워크 커넥션 정보를 보여준다 |
-t | TCP 연결만 표시 |
-n | dns resovling을 해서 local address와 foregin address에 IP + 포트번호만 표시 |
-u | UDP 연결만 표시 |
-p | 프로세스 ID 표시(OS마다 지원 유무가 다름) |
FIN
패킷을 받으면 close_wait
상태가 되고 서버는 ACK 패킷을 보내면 last_wait
상태가 되는데, close_wait은 서버에서 클라이언트로 ACK을 보내지 못한 상태(정상적으로 소켓 연결을 못끊었음)naver.com
의 IP(223.130.192.247
)은 현재 로컬 IP(192.168.0.2
)의 59062포트에 연결된것을 확인할 수 있다. 이제 ifconfig 명령어를 통해 로컬 IP가 어느 네트워크 인터페이스를 사용하는지 확인해보자
만약 현재 내가 chrome 혹은 어플리케이션에서 naver.com
을 호출하고 있다면 naver.com
에 대한 IP 주소는 어떻게 가져올까? 커멘드라인 명령어로 도메인에 대한 IP 주소를 얻어올 수 있는데, 대표적으로 dig
와 nslookup
명령어를 통해 얻어올 수 있다. 터미널에 dig naver.com
를 쳐보자
answer section에 나온 142.250.76.142
가 google.com
에 대한 IP주소이다. 사진속 네모박스 영역에 279, A
는 레코드유효시간, 레코드 유형을 의미한다.
조금더 해석하면 142.250.76.142
IP 주소는 쿼리를 질의한 시간(When 영역
)으로부터 279초까지 유효하다는 의미
ifconfig의 inet은 로컬 네트워크의 IP주소를 의미한다. 위에서 naver.com
의 로컬 네트워크 IP는 192.168.0.2
라는 것을 확인하였고, ifconfig에서 해당 IP로 검색했을때 en0
의 inet과 매핑되는데, 이는 naver.com
은 en0
네트워크 인터페이스와 통신하는것을 의미한다.
이제 네트워크 인터페이스를 확인했으면 tcpdump
명령어를 통해 네트워크 패킷을 캡쳐해보자
$sudo tcpdump -i en0 -lA -s1500 -nn tcp and port 80
en0
만 보여준다.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
FIN
플래그위와 같은 형태로 TCPDUMP 명령어를 해석할 수 있다. 우리 회사의 경우 서버에 들어가서 sql 날라가는 쿼리나 통신 등을 살펴볼때 주로 사용했다.
tcpdump 명령어는 실시간으로 트래픽을 캡처하기 때문에 CPU, 메모리에 큰 부하를 줄 수 있기 때문에 사용할때 주의하는게 좋다.