📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 123편
이전 글: 122. TCP Connection 종료 분석 · 다음 글: 124. SYN/ACK Packet 분석
SYN의 역할(연결 요청, 초기 시퀀스 번호 동기화)은 44. SYN, SYN/ACK, ACK에서 다뤘습니다. 이 글은 Wireshark에서 SYN 패킷 한 개를 펼쳤을 때 어떤 필드를 어떤 순서로 보는가에 집중합니다. SYN은 연결을 시작하는 쪽 OS나 도구의 "기본값"이 가장 많이 드러나는 패킷이어서, 출발지의 성격을 추정하는 단서가 됩니다.
| 확인 항목 | Wireshark 필드 | 정상 OS SYN에서 흔한 모습 |
|---|---|---|
| Flag | tcp.flags == 0x002 | SYN만 설정 (ECN 협상 시 0x0c2) |
| ISN | tcp.seq_raw | 무작위에 가까운 32비트 값, 상대값은 0 |
| ACK 번호 | tcp.ack_raw | 보통 0 (ACK 비트가 없어 의미 없음) |
| 데이터 | tcp.len | 0 (TCP Fast Open 사용 시 예외) |
| 헤더 길이 | tcp.hdr_len | 옵션 때문에 20보다 큼 (Linux는 흔히 40) |
| 옵션 | tcp.options.mss_val, tcp.options.wscale.shift, tcp.options.sack_perm, tcp.options.timestamp.tsval | MSS·SACK 허용·Timestamps·Window Scale 등 |
| Window | tcp.window_size_value | OS별 기본값 (SYN에는 스케일 미적용) |
| TTL | ip.ttl | 초기값 64·128·255에서 경유 홉만큼 감소 |
| 출발지 포트 | tcp.srcport | OS의 임시 포트 범위 |
SYN 한 개를 Details 창에서 읽는 순서입니다.
Internet Protocol
ip.ttl, ip.flags.df, ip.id → 출발지 OS·거리 추정
↓
Transmission Control Protocol
srcport / dstport → 임시 포트 → 서비스 포트인가
↓
Flags 0x002 [SYN] → 다른 비트가 섞이지 않았는가
↓
seq_raw, len = 0 → ISN, 데이터 없음
↓
Options (MSS, SACK_PERM, TS, NOP, WS) → 옵션 종류·순서·값
↓
[SEQ/ACK analysis], Expert Info → 재전송(retransmission)인가
SYN 재전송: 응답이 없으면 클라이언트 OS는 같은 tcp.seq_raw의 SYN을 간격을 늘려 가며 다시 보냅니다. Linux는 초기 재전송 시간 1초에서 두 배씩 늘어나는 것이 일반적이며(net.ipv4.tcp_syn_retries 기본 6), Wireshark는 두 번째 SYN부터 tcp.analysis.retransmission을 붙입니다. 간격이 두 배씩 늘어나면 OS 스택이 보낸 것이고, 재전송 없이 한 번만 보내는 SYN이 다수 포트로 흩어지면 스캔 도구의 패턴에 가깝습니다.
OS가 만든 SYN과 도구가 만든 SYN 비교 (일반적 경향)
| 항목 | 일반 OS 연결 | 스캔·패킷 생성 도구에서 자주 보이는 모습 |
|---|---|---|
| 옵션 | 4~5종, OS 고유 순서 | 없음 또는 MSS 하나 정도 |
| 헤더 길이 | 28~44바이트 | 20~24바이트 |
| Window | OS 기본값 (예: 64240, 65535) | 도구 고정값, 비정상적으로 작은 값 |
| 재전송 | 응답 없으면 간격 두고 반복 | 대개 없음 또는 도구 설정대로 |
| 출발지 포트 | 연결마다 증가·무작위 | 여러 목적지에 같은 출발지 포트 반복 가능 |
| 페이로드 | 없음 | 드물게 데이터가 실린 SYN |
SYN 관련 필터
| 목적 | Display Filter |
|---|---|
| 연결 요청만 | tcp.flags.syn == 1 && tcp.flags.ack == 0 |
| 재전송된 SYN | tcp.flags == 0x002 && tcp.analysis.retransmission |
| 옵션 없는 SYN | tcp.flags == 0x002 && tcp.hdr_len == 20 |
| 데이터가 실린 SYN | tcp.flags.syn == 1 && tcp.len > 0 |
| MSS 옵션 누락 (Expert Info) | tcp.options.mss.absent |
실습 예시 — 본인 VM에서 일반 접속 SYN의 필드를 추출합니다. 명령과 출력은 예시(값은 환경마다 다름)입니다.
sudo tshark -i ens33 -f "tcp[tcpflags] & tcp-syn != 0" -w /tmp/syn.pcapng &
curl -s -o /dev/null http://192.168.10.30/ # 응답하는 서버
timeout 8 bash -c '</dev/tcp/192.168.10.99/80' # 응답 없는(존재하지 않는) 사설 IP
sudo pkill -INT tshark
# SYN(ACK 없음)의 주요 필드
tshark -r /tmp/syn.pcapng -Y 'tcp.flags.syn == 1 && tcp.flags.ack == 0' -T fields -E header=y \
-e frame.time_relative -e ip.dst -e ip.ttl -e tcp.srcport -e tcp.seq_raw -e tcp.hdr_len \
-e tcp.window_size_value -e tcp.options.mss_val -e tcp.options.wscale.shift -e tcp.option_kind \
-e tcp.analysis.retransmission
# 임시 포트 범위 확인 (Rocky/Ubuntu 공통)
sysctl net.ipv4.ip_local_port_range
형식 예시입니다.
time ip.dst ttl srcport seq_raw hdr_len win mss ws option_kind retrans
0.000000 192.168.10.30 64 51020 2984001100 40 64240 1460 7 2,4,8,1,3
0.012300 192.168.10.99 64 51022 1188200450 40 64240 1460 7 2,4,8,1,3
1.024500 192.168.10.99 64 51022 1188200450 40 64240 1460 7 2,4,8,1,3 1
3.072800 192.168.10.99 64 51022 1188200450 40 64240 1460 7 2,4,8,1,3 1
7.232900 192.168.10.99 64 51022 1188200450 40 64240 1460 7 2,4,8,1,3 1
| 확인 포인트 | 읽는 법 |
|---|---|
option_kind 2,4,8,1,3 | MSS, SACK 허용, Timestamps, NOP, Window Scale — Linux에서 흔한 순서 |
| 192.168.10.99로 같은 seq_raw 반복 | 같은 연결의 SYN 재전송. 간격 약 1→2→4초 |
| TTL 64 | 같은 호스트에서 나간 캡처라 감소 없음 |
같은 대역의 존재하지 않는 IP는 ARP 응답이 없어 SYN 자체가 나가지 않을 수 있으므로, 결과가 다르면 ARP 패킷도 함께 확인합니다(114. ARP 패킷 필드 분석 — opcode와 Sender·Target 필드로 IP-MAC 매핑 검증하기).
📷 [실습 화면 삽입 위치] SYN 패킷 Details에서 Flags와 Options(MSS, SACK permitted, Timestamps, Window scale)를 모두 펼친 화면
📷 [실습 화면 삽입 위치] 응답 없는 대상으로의 SYN 재전송이
[TCP Retransmission]으로 표시된 Packet List와 Time 열 간격
| 관찰 | 가능한 해석 | 확인할 것 |
|---|---|---|
| 옵션 없는 짧은 SYN이 여러 포트로 | 스캔 도구 가능성 (143. SYN Scan Packet 분석) | 응답 Flag 분포 |
| 같은 ISN·같은 출발지 포트의 SYN이 여러 목적지로 | 패킷 생성 도구 | 목적지 수, 시간 간격 |
| 출발지 IP는 다양한데 TTL·옵션 구성이 모두 같음 | 출발지 위조 SYN Flood 가능성 | SYN/ACK 뒤 ACK 존재 여부 |
| 데이터가 실린 SYN | TFO 또는 조작 패킷 | TFO 쿠키 옵션(Kind 34) 유무 |
| 내부 호스트가 외부 한 IP로 SYN 재전송 반복 | 차단된 C2 접속 시도 가능성 | 목적지 평판, 반복 주기 (147. 외부 비정상 통신 분석) |
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 패킷 캡처 | 옵션·TTL·Window로 본 출발지 성격, 재전송 간격 |
| 방화벽 로그 | SYN 기준 허용·차단(drop 시 응답 없음) |
| IDS/IPS | SYN 스캔·SYN Flood 임계치 이벤트 |
| 서버 | SYN-RECV 수, SYN 쿠키 사용 카운터 |
관제자가 확인할 질문
오탐 주의: 옵션 구성은 OS 버전, 네트워크 장비(MSS 조정), VPN에 따라 바뀝니다. 옵션만으로 "도구"라고 단정하지 말고 목적지 분포·재전송·응답 패턴과 함께 판단합니다.
tcp.flags == 0x002이며 데이터 없이 ISN(tcp.seq_raw)과 옵션을 싣고 갑니다.