홈 › 리눅스 운영 › 07 / 13

네트워크 진단 (ss·curl·firewalld)

섹션 7진행 0 / 13

4. 응용 변형 예제

4.1 DB 연결 타임아웃 진단

앱 로그에 Connection timed out 이 찍혔을 때의 순서입니다.

bash
getent hosts db-prod                          # 이름
timeout 3 bash -c '</dev/tcp/db-prod/1521' && echo open || echo closed
ss -tn state established | grep -c :1521      # 지금 맺힌 연결 수

이름은 풀리는데 closed 면 방화벽 신청 대상입니다. open 인데 앱이 실패하면 DB 계정·리스너 문제이므로 DBA 와 봅니다.

4.2 헬스 체크 스크립트

여러 서버의 헬스를 한 번에 보는 형태입니다. 08 셸 스크립트 레슨에서 확장합니다.

bash
for h in app1 app2 app3; do
  code=$(curl -s -o /dev/null -m 3 -w '%{http_code}' "http://$h:8080/actuator/health")
  printf '%-6s %s\n' "$h" "$code"
done

-m 3 이 없으면 한 서버가 멈췄을 때 루프 전체가 멈춥니다. 000 은 연결 실패, 200 외 숫자는 앱 상태를 뜻합니다.

4.3 TIME-WAIT 폭증

ss -s 에서 TIME-WAIT 이 수만 개면 짧은 연결을 너무 많이 맺는 것입니다.

bash
ss -s | grep -i timewait
ss -tan state time-wait | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -n 3

상대 IP 별로 세면 어느 대상과의 연결이 원인인지 나옵니다. 자바 쪽은 HTTP 클라이언트의 커넥션 풀 재사용으로 해결합니다.

4.4 포트 충돌 찾기

Address already in use 로 앱이 안 뜰 때입니다.

bash
ss -ltnp | grep :8080
kill $(ss -ltnp | grep :8080 | grep -oP 'pid=\K[0-9]+')

이전 JVM 이 안 죽은 경우가 대부분입니다. 03 레슨의 원칙대로 TERM 을 먼저 보냅니다.

4.5 프록시 우회 테스트

프록시를 타는지 안 타는지 -v 로 확인합니다.

bash
curl -sv https://api.example.com 2>&1 | grep -iE 'proxy|CONNECT'
curl -s --noproxy '*' http://db-prod:8080/health      # 이번만 프록시 무시

CONNECT api.example.com:443 줄이 보이면 프록시를 탄 것입니다. 사내 서버가 프록시를 타면 no_proxy 에 추가합니다.