마이의 개발 블로그

[Linux] tcpdump로 로컬 서버에서 외부로 나가는 모든 요청(request) 확인하기 본문

개발지식/인프라

[Linux] tcpdump로 로컬 서버에서 외부로 나가는 모든 요청(request) 확인하기

개발자마이 2024. 9. 24. 12:47
반응형

배경

솔루션 설치 중 특정 구간에서 모든 요청에 대한 쿼리스트링이 사라지는 현상이 관찰되었습니다. 서버 A(웹 서버) -> 서버 B(솔루션서버) 로의 요청 시 A의 로그에는 쿼리스트링이 정상적으로 찍히는 반면 서버 B의 로그에서는 쿼리스트링만 사라진 채로 HTTP 요청이 들어오는 것을 확인할 수 있었는데 이상한 건 쿼리스트링만 사라진다는 점이었습니다. 예를 들어,

 

  1. https://www.example.com/solution/user?id=11 호출
  2. A (www.example.com에 해당하는 웹서버)-> B(/solution 경로에 리버스 프록시로 맵핑된 솔루션 서버) 호출
  3. B에는 www.example.com/solution/user 만 전달됨

이런식으로 쿼리스트링이 없어지는 경우 소프트웨어의 정상적인 동작을 기대하기가 어렵습니다.

 

A -> B로 웹서버를 거치지 않고 직접 curl 요청을 보내는 경우 쿼리스트링이 없어지지 않음을 확인했기에 웹서버 소프트웨어가 의심되는 상황이었습니다. 문제 구간을 좁히기 위해서는 A서버의 웹서버로 들어온 요청이 어떻게 변환되어 나가는지를 체크해볼 필요가 있었는데, 폐쇄망에서의 모니터링이 필요하다보니 와이어샤크 등을 별도로 설치하긴 어려워 패키지로 설치되어 있던 tcpdump를 활용하는 방법을 택했습니다.

방법

인터페이스 리스트업

ip addr show | grep ': '

- 리스트업된 모든 인터페이스에 대해 아래 작업 수행

 

tcpdump로 파일 캡처

tcpdump -i <인터페이스명> ‘outbound’ -A -s 0 -w capture.pcap

- 'outbound': 나가는 요청만 캡처하는 키워드(필요 시 inbound로 변경하거나 키워드 없이 사용)

- A: ASCII 출력

- s 0: 패킷 전체 길이 캡처(0 이외의 숫자를 지정할 경우 캡처 길이 제한)

- w <파일명>: 파일로 저장, 여기서는 capture.pcap

 

캡처 파일 읽기

tcpdump -r capture.pcap | grep <찾고자하는 요청과 관계된 문자열>

- capture.pcap로 저장된 패킷 데이터를 tcpdump로 다시 읽어들임

- grep <문자열>: 원하는 문자열이 포함된 요청만 보는 명령어

결과

폐쇄망 작업이다보니 결과를 캡처할 수는 없었지만 예상한대로 웹서버를 거칠 때에만 쿼리스트링이 사라지는 문제를 보다 명확하게 확인할 수 있었습니다. 결국 이 문제는 웹서버의 버그이기에 웹서버 공급업체(국내 솔루션)측의 웹서버 버전 변경 이후 정상동작을 확인할 수 있었습니다.

반응형
Comments