일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- HashMap
- 이직
- 스프링
- 주니어
- 해시맵
- bfs
- Java
- spring boot
- 문자열
- 구름LEVEL
- 배열
- 백엔드
- 자료구조
- 개발자
- docker
- 스프링부트
- 스타트업
- 도커
- 해결
- 인텔리제이
- IntelliJ
- dfs
- Linux
- 구현
- 코딩테스트
- spring
- 명령어
- 프로그래머스
- HTTP
- 스프링 부트
- Today
- Total
마이의 개발 블로그
[Linux] tcpdump로 로컬 서버에서 외부로 나가는 모든 요청(request) 확인하기 본문
배경
솔루션 설치 중 특정 구간에서 모든 요청에 대한 쿼리스트링이 사라지는 현상이 관찰되었습니다. 서버 A(웹 서버) -> 서버 B(솔루션서버) 로의 요청 시 A의 로그에는 쿼리스트링이 정상적으로 찍히는 반면 서버 B의 로그에서는 쿼리스트링만 사라진 채로 HTTP 요청이 들어오는 것을 확인할 수 있었는데 이상한 건 쿼리스트링만 사라진다는 점이었습니다. 예를 들어,
- https://www.example.com/solution/user?id=11 호출
- A (www.example.com에 해당하는 웹서버)-> B(/solution 경로에 리버스 프록시로 맵핑된 솔루션 서버) 호출
- 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 <문자열>: 원하는 문자열이 포함된 요청만 보는 명령어
결과
폐쇄망 작업이다보니 결과를 캡처할 수는 없었지만 예상한대로 웹서버를 거칠 때에만 쿼리스트링이 사라지는 문제를 보다 명확하게 확인할 수 있었습니다. 결국 이 문제는 웹서버의 버그이기에 웹서버 공급업체(국내 솔루션)측의 웹서버 버전 변경 이후 정상동작을 확인할 수 있었습니다.
'개발지식 > 인프라' 카테고리의 다른 글
[Network] Docker Compose와 Nginx를 이용한 수평 스케일(scale-out)과 로드 밸런싱(Load Balancing) (0) | 2024.12.10 |
---|---|
[Docker] 도커(Docker) 삭제 후 도커 네트워크 인터페이스를 삭제해야하는 경우 명령어(RHEL 8.8) (0) | 2024.11.22 |
[Linux] 도커(Docker) 동작 중 firewalld를 켜면 서비스가 동작하지 않는 현상(RHEL 8.8) (0) | 2024.11.22 |
[Docker] 자주 사용하는 도커 명령어 모음 (0) | 2024.06.13 |
[Linux] 하나의 서버에서 터미널로 다른 서버에 접속하는 방법(ssh, sftp) (0) | 2024.03.23 |