#!/bin/bash
# 실습 #10 ① — tshark / tcpdump 캡처 (-i / -c / -w / BPF 필터)
# Wireshark GUI 없이도 SSH 환경에서 캡처·분석 가능.
set -e

echo "=== 0) 도구 설치 ==="
sudo apt update
sudo apt install -y tcpdump tshark wireshark-common curl

# wireshark 그룹에 사용자 추가 (비특권 캡처용) — 재로그인 후 적용
if getent group wireshark >/dev/null; then
    sudo usermod -aG wireshark "$USER"
    echo "→ '$USER' 를 wireshark 그룹에 추가. 재로그인 후 sudo 없이 캡처 가능."
fi

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

# ────────────────────────────────────────────────────────────────
# 1) 인터페이스 확인
# ────────────────────────────────────────────────────────────────
echo
echo "▶ [1] 인터페이스 목록"
ip -br link show
echo "---"
echo "tcpdump 인터페이스 번호:"
sudo tcpdump -D 2>&1 | head -10
echo "---"
echo "tshark 인터페이스 번호:"
sudo tshark -D 2>&1 | head -10 || true

# ────────────────────────────────────────────────────────────────
# 2) 가장 기본 — 모든 인터페이스, 20 패킷만
#    -i any : 모든 인터페이스
#    -c N   : N개만 받고 종료
#    -n     : DNS 풀이 안 함 (캡처 중 멈춤 방지)
# ────────────────────────────────────────────────────────────────
echo
echo "▶ [2] sudo tcpdump -i any -c 20 -n  (백그라운드)"
sudo tcpdump -i any -c 20 -n 2>&1 &
TCPDUMP_PID=$!
sleep 1
# 트래픽 발생
curl -s -o /dev/null https://www.google.com/ || true
wait $TCPDUMP_PID 2>/dev/null || true

# ────────────────────────────────────────────────────────────────
# 3) 파일로 저장 (-w) + BPF 필터로 미리 거름
#    BPF (Berkeley Packet Filter) — 커널에서 필터링하므로 빠름
# ────────────────────────────────────────────────────────────────
PCAP="$WORK/cap_$(date +%H%M%S).pcap"
echo
echo "▶ [3] tcp port 80 만 캡처 → $PCAP  (50 패킷 또는 8초)"
sudo timeout 8 tcpdump -i any -w "$PCAP" 'tcp port 80' -c 50 2>&1 &
DUMP=$!
sleep 1
curl -s -o /dev/null http://example.com/ || true
curl -s -o /dev/null http://example.com/ || true
wait $DUMP 2>/dev/null || true

ls -lh "$PCAP" 2>/dev/null

# ────────────────────────────────────────────────────────────────
# 4) tshark 로 캡처 + Display filter (-Y) 동시
# ────────────────────────────────────────────────────────────────
echo
echo "▶ [4] tshark -i any -c 30 -Y 'http'  (HTTP 만 추리기)"
sudo timeout 8 tshark -i any -c 30 -n -Y 'http' 2>&1 &
TS=$!
sleep 1
curl -s -o /dev/null http://example.com/ || true
wait $TS 2>/dev/null || true

# ────────────────────────────────────────────────────────────────
# 5) 캡처 파일 분석 — Display filter 적용
# ────────────────────────────────────────────────────────────────
echo
echo "▶ [5-a] tshark -r FILE -Y 'tcp.flags.syn==1'  (SYN 패킷만)"
tshark -r "$PCAP" -Y 'tcp.flags.syn==1' 2>/dev/null | head -10 || true

echo
echo "▶ [5-b] tshark -r FILE -q -z conv,tcp  (TCP 대화 통계)"
tshark -r "$PCAP" -q -z conv,tcp 2>/dev/null | head -15 || true

echo
echo "▶ [5-c] tshark -r FILE -q -z io,stat,1  (초당 패킷)"
tshark -r "$PCAP" -q -z io,stat,1 2>/dev/null | head -15 || true

# ────────────────────────────────────────────────────────────────
# 6) 자주 쓰는 옵션 정리
# ────────────────────────────────────────────────────────────────
cat <<'OPT'

  ▶ tcpdump 자주 쓰는 옵션
    -i any            모든 인터페이스
    -c N              N 패킷 받고 종료
    -w FILE           pcap 저장
    -r FILE           pcap 읽기
    -n                DNS 풀이 안 함
    -nn               DNS + 포트 풀이 안 함
    -tttt             절대시각 (microsec)
    -s 96             snaplen 96B (헤더만)
    -p                promiscuous 끄기 (자기 트래픽만)
    -A                ASCII 페이로드
    -X                HEX + ASCII
    -G 300 -W 12      5분 회전, 12개 보관 (= 1시간)
    -C 100 -W 10      100MB × 10 파일 회전

  ▶ tshark 만의 옵션
    -Y FILTER         Display filter (Wireshark 구문)
    -f FILTER         Capture filter (BPF 구문)
    -q -z TYPE        통계 모드 (conv,tcp / io,stat / http,tree …)
    -T fields -e ip.src -e ip.dst   필드만 추출 (CSV 비슷)

OPT

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