#!/bin/bash
# 실습 #10 ③ — 자주 쓰는 필터 모음 실습 (HTTP / DNS / TCP retransmission / SYN flood)
# 운영에서 가장 빈번한 진단 패턴 5가지 + tshark 통계 모드.
set -e

echo "=== 0) 도구 설치 ==="
sudo apt install -y tcpdump tshark curl >/dev/null

WORK=/tmp/lab10_common
mkdir -p "$WORK"

# ────────────────────────────────────────────────────────────────
# 1) HTTP 요청 / 응답 필터
# ────────────────────────────────────────────────────────────────
echo
echo "════════════════════════════════════════════════════"
echo "  Case 1: HTTP — POST / GET / 특정 URL / 호스트"
echo "════════════════════════════════════════════════════"
cat <<'F1'
  http                            모든 HTTP
  http.request                    요청만
  http.response                   응답만
  http.request.method == "POST"   POST 만
  http.request.method == "GET"    GET 만
  http.request.uri contains "/login"
  http.host == "example.com"
  http.response.code == 500       500 만
  http.user_agent contains "curl"
F1

PCAP="$WORK/http.pcap"
sudo timeout 6 tcpdump -i any -n -w "$PCAP" 'tcp port 80' 2>&1 &
DUMP=$!
sleep 1
curl -s -o /dev/null http://example.com/        || true
curl -s -o /dev/null -X POST http://httpbin.org/post -d 'a=1' || true
wait $DUMP 2>/dev/null || true

echo "→ POST 요청 추출:"
tshark -r "$PCAP" -Y 'http.request.method == "POST"' -n 2>/dev/null | head -5 || true

# ────────────────────────────────────────────────────────────────
# 2) DNS 질의 / 응답
# ────────────────────────────────────────────────────────────────
echo
echo "════════════════════════════════════════════════════"
echo "  Case 2: DNS"
echo "════════════════════════════════════════════════════"
cat <<'F2'
  dns                             모든 DNS
  dns.qry.name == "google.com"    특정 질의명
  dns.qry.type == 1               A 레코드만 (1=A, 28=AAAA, 15=MX, 16=TXT)
  dns.flags.response == 0         질의만
  dns.flags.response == 1         응답만
  dns.flags.rcode != 0            응답 코드 에러 (NXDOMAIN 등)
F2

PCAP="$WORK/dns.pcap"
sudo timeout 4 tcpdump -i any -n -w "$PCAP" 'udp port 53' 2>&1 &
DUMP=$!
sleep 1
dig +short google.com >/dev/null || true
dig +short 도메인없음xxx.com >/dev/null || true
wait $DUMP 2>/dev/null || true

echo "→ 응답 추출:"
tshark -r "$PCAP" -Y 'dns.flags.response == 1' -n 2>/dev/null | head -5 || true

# ────────────────────────────────────────────────────────────────
# 3) TCP 재전송 / 비정상 (운영 1순위)
# ────────────────────────────────────────────────────────────────
echo
echo "════════════════════════════════════════════════════"
echo "  Case 3: TCP 비정상 — 운영 진단 핵심"
echo "════════════════════════════════════════════════════"
cat <<'F3'
  tcp.analysis.retransmission     재전송
  tcp.analysis.duplicate_ack      중복 ACK (혼잡 신호)
  tcp.analysis.zero_window        Zero Window (수신 버퍼 풀)
  tcp.analysis.out_of_order       순서 어긋남
  tcp.analysis.lost_segment       세그먼트 손실
  tcp.window_size < 1000          윈도우 작아짐
  tcp.flags.reset == 1            RST (비정상 종료)
  tcp.time_delta > 1              1초 이상 지연
F3

# ────────────────────────────────────────────────────────────────
# 4) SYN flood / 포트 스캔 탐지
# ────────────────────────────────────────────────────────────────
echo
echo "════════════════════════════════════════════════════"
echo "  Case 4: SYN flood / 포트 스캔 탐지"
echo "════════════════════════════════════════════════════"
cat <<'F4'
  tcp.flags.syn == 1 && tcp.flags.ack == 0   첫 SYN (3-way 시작)
                                              → 짧은 시간에 동일 IP 에서 수천이면 SYN flood

  # tshark 통계로 IP 별 SYN 갯수 카운트
  tshark -r FILE -Y 'tcp.flags.syn==1 && tcp.flags.ack==0' \
         -T fields -e ip.src | sort | uniq -c | sort -rn
F4

# ────────────────────────────────────────────────────────────────
# 5) tshark 통계 모드 — 운영 보고서용
# ────────────────────────────────────────────────────────────────
echo
echo "════════════════════════════════════════════════════"
echo "  Case 5: tshark -q -z 통계 모드"
echo "════════════════════════════════════════════════════"
cat <<'F5'
  tshark -r FILE -q -z conv,tcp         TCP 대화 통계
  tshark -r FILE -q -z conv,udp         UDP 대화
  tshark -r FILE -q -z conv,ip          IP 별
  tshark -r FILE -q -z io,stat,1        초당 패킷
  tshark -r FILE -q -z io,stat,60       분당 패킷
  tshark -r FILE -q -z http,tree        HTTP 응답 코드 분포
  tshark -r FILE -q -z http_req,tree    URI 별 호출 수
  tshark -r FILE -q -z endpoints,ip     IP endpoint 별 패킷·바이트

  # 필드만 CSV
  tshark -r FILE -Y http.request -T fields -e ip.src -e http.host -e http.request.uri
F5

echo
echo "→ 더 많은 패턴은 configs/ 아래 두 파일 참고:"
echo "   configs/01_bpf_examples.txt"
echo "   configs/02_display_filter_examples.txt"

echo
echo "→ 정리: rm -rf $WORK"
