📄 2025.11.28 (Day 25) - TCP/IP 네트워크 보안: IPv4 프로토콜 & Wireshark 패킷 분석
1. 핵심 개념 정리
| # | 핵심 개념 | 간결한 설명 | 실무/보안 관점에서의 중요성 |
|---|---|---|---|
| 1 | OSI 7계층 vs TCP/IP 모델 | OSI는 7계층(물리, 데이터링크, 네트워크, 전송, 세션, 표현, 응용)으로 이론적 모델이며, TCP/IP는 4계층(네트워크 접근, 인터넷, 전송, 응용)으로 실제 인터넷 프로토콜 스택입니다. 각 계층은 **캡슐화(Encapsulation)**를 통해 상위 계층 데이터를 하위 계층 헤더로 감쌉니다. | 공격 벡터 분석의 기초입니다. 계층별로 서로 다른 공격이 존재합니다: L2(ARP Spoofing), L3(IP Spoofing), L4(SYN Flooding, Port Scanning), L7(SQL Injection, XSS). 계층별 이해는 방어 전략 수립의 출발점입니다. |
| 2 | IPv4 주소 체계 | 32비트 주소(8비트씩 4개 옥텟)로 구성되며, 네트워크부와 호스트부로 나뉩니다. 클래스(A, B, C, D, E)와 서브넷 마스크를 통해 네트워크를 구분합니다. 사설 IP(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)는 NAT를 통해 공인 IP로 변환됩니다. | 네트워크 세분화와 접근 제어의 기반입니다. 서브넷을 통해 네트워크를 논리적으로 분리하여 측면 이동(Lateral Movement) 공격을 차단하고, 방화벽 정책을 효과적으로 적용할 수 있습니다. |
| 3 | IPv4 헤더 구조 | Version(4bit), Header Length(4bit), TOS(8bit), Total Length(16bit), Identification(16bit), Flags(3bit), Fragment Offset(13bit), TTL(8bit), Protocol(8bit), Header Checksum(16bit), Source IP(32bit), Destination IP(32bit), Options(가변) 필드로 구성됩니다. | 패킷 분석과 위협 탐지의 핵심입니다. TTL 값으로 라우팅 루프나 패킷 변조 탐지, Flags/Fragment Offset으로 Fragmentation 공격 탐지, Protocol 필드로 터널링 우회 탐지가 가능합니다. |
| 4 | Wireshark 패킷 분석 | Wireshark는 네트워크 패킷을 실시간으로 캡처하고 분석하는 도구입니다. 캡처 필터(BPF 문법)로 원하는 패킷만 수집하고, 디스플레이 필터로 캡처된 패킷에서 특정 조건을 검색합니다. 각 계층별 헤더를 시각적으로 확인할 수 있습니다. | 포렌식 분석과 이상 트래픽 탐지의 필수 도구입니다. 공격 패킷의 특성(비정상 플래그 조합, 악성 페이로드, C&C 통신 패턴)을 식별하고, 베이스라인 트래픽과 비교하여 이상 징후를 발견합니다. |
2. 실습 내용
(A) IPv4 주소 계산 실습
예제 1 : 192.168.10.130/25 네트워크 분석
- IP 주소 : 192.168.10.130
- 서브넷 마스크 : 255.255.255.128 (/25)
이진수 변환:
- IP : 11000000.10101000.00001010.10000010
- Mask : 11111111.11111111.11111111.10000000
계산 결과:
- 네트워크 주소 : 192.168.10.128 (호스트부를 0으로)
- 브로드캐스트 : 192.168.10.255 (호스트부를 1로)
- 사용 가능 호스트 : 192.168.10.129 ~ 192.168.10.254 (126개)
예제 2 : CIDR 표기법 정리
| CIDR | 서브넷 마스크 | 주소 수 | 호스트 수 |
|---|---|---|---|
| /24 | 255.255.255.0 | 256 | 254 |
| /25 | 255.255.255.128 | 128 | 126 |
| /26 | 255.255.255.192 | 64 | 62 |
| /27 | 255.255.255.224 | 32 | 30 |
| /28 | 255.255.255.240 | 16 | 14 |
| /30 | 255.255.255.252 | 4 | 2 (P2P 링크용) |
(B) Wireshark 캡처 필터 (BPF 문법)
호스트/네트워크 기반 필터:
- host 192.168.1.100 : 특정 호스트의 모든 트래픽
- net 192.168.1.0/24 : 특정 네트워크의 모든 트래픽
- src host 192.168.1.100 : 출발지 IP 필터
- dst host 192.168.1.200 : 목적지 IP 필터
포트 기반 필터:
- port 80 : 특정 포트의 트래픽
- port 443 : HTTPS 트래픽
- portrange 1000-2000 : 포트 범위
프로토콜 필터:
- tcp : TCP 트래픽만
- udp : UDP 트래픽만
조합 예시:
- tcp and src host 192.168.1.100 and dst port 80 : 192.168.1.100에서 80포트로 가는 TCP 트래픽
(C) Wireshark 디스플레이 필터
IP 주소 필터:
- ip.addr == 192.168.1.100 : 출발지 또는 목적지
- ip.src == 192.168.1.100 : 출발지만
- ip.dst == 192.168.1.200 : 목적지만
프로토콜 필터:
- tcp, udp, icmp, arp, http, dns, ssh
TCP 플래그 필터:
- tcp.flags.syn == 1 : SYN 플래그
- tcp.flags.ack == 1 : ACK 플래그
- tcp.flags.reset == 1 : RST 플래그
- tcp.flags.syn == 1 and tcp.flags.ack == 0 : SYN 패킷 (3-way handshake 시작)
포트 필터:
- tcp.port == 80
- tcp.dstport == 443
- tcp.srcport == 22
HTTP 필터:
- http.request : HTTP 요청만
- http.response : HTTP 응답만
- http.request.method == “POST” : POST 요청
- http.request.uri contains “login” : URI에 login 포함
DNS 필터:
- dns.qry.name contains “google” : DNS 쿼리에 google 포함
패킷 크기 필터:
- frame.len > 1000 : 1000바이트 초과
- ip.len < 100 : IP 패킷 길이 100바이트 미만
조합 예시:
- tcp.flags.syn == 1 and ip.src == 192.168.1.100 and tcp.dstport == 22 : 특정 IP에서 SSH로 연결 시도하는 SYN 패킷
- http.request.method == “POST” and http.request.uri contains “admin” : admin 경로로 가는 POST 요청
(D) 리눅스 네트워크 명령어
네트워크 인터페이스 및 라우팅 확인:
- ip addr show / ifconfig : 네트워크 인터페이스 확인
- ip route show / route -n : 라우팅 테이블 확인
- ip neigh show / arp -a : ARP 테이블 확인
연결 상태 확인:
- netstat -tunap : 모든 TCP/UDP 연결
- ss -tunap : 최신 명령어 (동일 기능)
- netstat -tunlp | grep :80 : 특정 포트 리스닝 확인
연결성 테스트:
- ping 192.168.1.1 : ICMP 테스트
- ping -c 4 google.com : 4개 패킷만 전송
- traceroute google.com : 경로 추적
- mtr google.com : 실시간 경로 추적
DNS 조회:
- dig google.com
- nslookup google.com
- host google.com
패킷 캡처 (tcpdump):
- tcpdump -i eth0 : eth0 인터페이스 모니터링
- tcpdump -i eth0 port 80 : 80번 포트만
- tcpdump -i eth0 -w capture.pcap : 파일로 저장
- tcpdump -r capture.pcap : 캡처 파일 읽기
- tcpdump -i eth0 ’tcp[tcpflags] & (tcp-syn) != 0’ : SYN 패킷만
(E) 실습 결과 및 분석
IPv4 헤더 분석 (Wireshark에서 확인한 주요 내용):
- 버전 : 4 (IPv4)
- 헤더 길이 : 20 bytes (5 * 4)
- Total Length : 60
- Identification : 0x1a2b
- Flags : 0x4000 (Don’t Fragment 설정됨)
- Fragment Offset : 0
- Time to Live : 64
- Protocol : TCP (6)
- 출발지 : 192.168.1.100
- 목적지 : 192.168.1.200
주요 필드 분석:
- TTL (Time to Live) : 64 -> 일반적으로 Linux/Unix는 64, Windows는 128로 설정. 패킷이 라우터를 거칠 때마다 1씩 감소하며, 0이 되면 폐기됩니다. 비정상적으로 낮은 TTL 값은 루프나 변조를 의심할 수 있습니다.
- Flags - Don’t Fragment : 설정 시 패킷이 MTU보다 크면 ICMP “Fragmentation Needed” 메시지를 받습니다. Path MTU Discovery에 사용됩니다.
- Protocol : 6 = TCP, 17 = UDP, 1 = ICMP. 상위 계층 프로토콜을 식별합니다.
- Identification : 패킷 단편화 시 동일한 원본 패킷을 식별하는 데 사용됩니다.
Wireshark로 3-Way Handshake 분석:
패킷 1 (SYN) : 클라이언트 -> 서버 연결 요청
- Flags : SYN / Seq : 0 / Ack : 0
패킷 2 (SYN-ACK) : 서버 -> 클라이언트 연결 수락
- Flags : SYN, ACK / Seq : 0 / Ack : 1
패킷 3 (ACK) : 클라이언트 -> 서버 연결 확립
- Flags : ACK / Seq : 1 / Ack : 1
-> 정상적인 TCP 연결 수립 과정
비정상 패킷 탐지 예시:
SYN Flood 공격 탐지:
- 대량의 SYN 패킷이 다양한 출발지 IP에서 발생
- SYN-ACK에 대한 ACK 응답이 없음
- Wireshark 필터 : tcp.flags.syn == 1 and tcp.flags.ack == 0
IP Spoofing 탐지:
- TTL 값이 비정상적으로 낮거나 일관성 없음
- 내부 네트워크 IP가 외부에서 유입
- 출발지 IP가 브로드캐스트/멀티캐스트 주소
Port Scanning 탐지:
- 짧은 시간에 동일 출발지에서 다양한 포트로 연결 시도
- 대량의 RST 패킷 (포트가 닫혀있음)
- Wireshark 필터 : tcp.flags.reset == 1
3. 실무/보안 관점 분석
| 분야 | 적용 시나리오 |
|---|---|
| SOC / 관제 | 실시간 트래픽 모니터링 : IDS/IPS에서 Wireshark와 유사한 패킷 분석 엔진(Suricata, Snort)을 사용하여 비정상 패턴을 탐지합니다. 베이스라인 트래픽을 설정하고, 통계적 이상(급증하는 SYN 패킷, 비정상 TTL, 알려지지 않은 프로토콜)을 자동 알림합니다. Snort 룰 예시: alert tcp any any -> $HOME_NET any (flags:S; threshold: type both, track by_src, count 100, seconds 10; msg:“Possible SYN Flood”;) Wireshark를 통해 알림의 실제 패킷을 확인하여 오탐(False Positive) 여부를 판단합니다. |
| CERT / 사고 대응 | 포렌식 패킷 분석 : 침해 사고 시 네트워크 탭(SPAN/Mirror Port)이나 방화벽에서 수집한 PCAP 파일을 Wireshark로 분석합니다. 공격 타임라인 재구성 : (1) 초기 침투 패킷 식별 -> (2) C&C 통신 추적 (특정 IP/도메인으로의 주기적 통신) -> (3) 데이터 유출 탐지 (대용량 파일 전송). tcp.stream eq 123 으로 특정 TCP 세션의 모든 패킷을 추적하여 공격자의 명령어와 데이터 유출 내용을 복원. dns.qry.name 으로 DGA(Domain Generation Algorithm) 기반 멀웨어 탐지. |
| 네트워크 운영 | 성능 최적화 및 문제 해결 : Wireshark로 패킷 손실, 재전송, 레이턴시 문제를 진단합니다. tcp.analysis.retransmission 필터로 재전송 패킷을 찾아 네트워크 품질 문제를 식별하고, tcp.analysis.zero_window 로 수신 버퍼 고갈 상태를 확인합니다. 서브넷 설계 : 부서별/보안 등급별로 서브넷을 분리하여 VLAN과 결합, 방화벽 규칙으로 Micro-Segmentation 구현. |
4. 개인 인사이트 및 다음 단계
-
배운 점/느낀 점:
- 네트워크는 보안의 기초 중 기초입니다. 모든 통신은 네트워크를 통해 이루어지므로, IP 헤더와 TCP/UDP 헤더를 읽을 수 있는 능력은 공격과 방어 모두의 필수 역량입니다.
- Wireshark의 강력함 : 교재에서 배운 이론적 개념(OSI 7계층, IPv4 헤더)을 실제 패킷으로 직접 확인하니 훨씬 명확하게 이해되었습니다. 특히 3-Way Handshake를 패킷 단위로 보면서 TCP의 연결 지향적 특성을 체감했습니다.
- 서브넷의 중요성 : 단순히 IP 주소를 나누는 것이 아니라, 보안 경계를 만드는 것임을 깨달았습니다. 잘못된 서브넷 설계는 공격자에게 전체 네트워크를 노출시킬 수 있습니다.
- 패킷 분석의 예술 : Wireshark 필터를 잘 활용하면 수만 개의 패킷 속에서 핵심 정보만 추출할 수 있습니다. 필터 문법을 익히는 것이 효율적인 분석의 핵심입니다.
-
심화 방향:
- TCP/UDP 심화 : TCP의 흐름 제어, 혼잡 제어, UDP의 특성과 활용 사례 학습
- 고급 Wireshark 기법 : Follow TCP Stream, Statistics 메뉴 활용, Lua 스크립트를 통한 커스텀 분석, PCAP 파일 자동 분석 스크립트 작성
- 공격 시나리오 재현 : 실습 환경에서 SYN Flood, ARP Spoofing, DNS Spoofing 등의 공격을 직접 재현하고 Wireshark로 패킷을 분석하여 탐지 시그니처 개발
- IDS/IPS 룰 작성 : Suricata나 Snort 룰을 작성하여 특정 공격 패턴을 자동 탐지하는 시스템 구축
- IPv6 학습 : IPv4 고갈과 IPv6 전환에 대비하여 IPv6 주소 체계, 헤더 구조, 보안 고려사항 학습
5. 빠른 참고 (Quick Reference)
IPv4 주소 클래스
| 클래스 | 범위 | 서브넷 | 특이사항 |
|---|---|---|---|
| A | 0.0.0.0 ~ 127.255.255.255 | /8 | 네트워크 126개, 호스트 16,777,214개 |
| B | 128.0.0.0 ~ 191.255.255.255 | /16 | 네트워크 16,384개, 호스트 65,534개 |
| C | 192.0.0.0 ~ 223.255.255.255 | /24 | 네트워크 2,097,152개, 호스트 254개 |
| D | 224.0.0.0 ~ 239.255.255.255 | - | 멀티캐스트 |
| E | 240.0.0.0 ~ 255.255.255.255 | - | 실험용/예약 |
사설 IP (RFC 1918):
- 10.0.0.0 ~ 10.255.255.255 (10.0.0.0/8)
- 172.16.0.0 ~ 172.31.255.255 (172.16.0.0/12)
- 192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16)
특수 주소:
- 127.0.0.0/8 : 루프백 (localhost)
- 0.0.0.0/8 : 현재 네트워크
- 255.255.255.255 : 제한된 브로드캐스트
- 169.254.0.0/16 : Link-local (APIPA)
IPv4 헤더 필드 요약
| 필드 | 크기 | 설명 |
|---|---|---|
| Version | 4bit | IP 버전 (4) |
| IHL | 4bit | 헤더 길이 (5 = 20바이트, 옵션 없음) |
| DSCP | 6bit | 서비스 품질 (QoS) |
| ECN | 2bit | 명시적 혼잡 알림 |
| Total Length | 16bit | 전체 패킷 크기 (헤더 + 데이터) |
| Identification | 16bit | 단편화 시 원본 패킷 식별 |
| Flags | 3bit | Reserved, DF (Don’t Fragment), MF (More Fragments) |
| Fragment Offset | 13bit | 단편화된 데이터의 오프셋 |
| TTL | 8bit | 패킷 생존 시간 (라우터마다 -1) |
| Protocol | 8bit | 상위 프로토콜 (1=ICMP, 6=TCP, 17=UDP) |
| Header Checksum | 16bit | 헤더 무결성 검증 |
| Source IP | 32bit | 출발지 주소 |
| Destination IP | 32bit | 목적지 주소 |
| Options | 가변 | 추가 옵션 (선택 사항) |
주요 프로토콜 번호
| 번호 | 프로토콜 |
|---|---|
| 1 | ICMP (Internet Control Message Protocol) |
| 2 | IGMP (Internet Group Management Protocol) |
| 6 | TCP (Transmission Control Protocol) |
| 17 | UDP (User Datagram Protocol) |
| 41 | IPv6 (IPv6 encapsulation) |
| 47 | GRE (Generic Routing Encapsulation) |
| 50 | ESP (Encap Security Payload - IPsec) |
| 51 | AH (Authentication Header - IPsec) |
| 89 | OSPF (Open Shortest Path First) |
Wireshark 단축키
| 단축키 | 기능 |
|---|---|
| Ctrl + K | 캡처 시작 |
| Ctrl + E | 캡처 중지 |
| Ctrl + F | 패킷 찾기 |
| Ctrl + G | 특정 패킷 번호로 이동 |
| Ctrl + N | 다음 패킷 |
| Ctrl + B | 이전 패킷 |
| Ctrl + -> | 다음 대화 (conversation) |
| Ctrl + <- | 이전 대화 |
| Ctrl + Alt + Shift + T | TCP Stream 따라가기 |
tcpdump 주요 옵션
| 옵션 | 설명 |
|---|---|
| -i <interface> | 캡처할 인터페이스 지정 |
| -c <count> | 지정된 개수만큼만 캡처 |
| -w <file> | PCAP 파일로 저장 |
| -r <file> | PCAP 파일 읽기 |
| -n | DNS 이름 해석 안 함 (빠름) |
| -v / -vv / -vvv | 상세 출력 (레벨 증가) |
| -A | ASCII로 패킷 내용 출력 |
| -X | 16진수 + ASCII로 출력 |
| -s <snaplen> | 캡처할 패킷 크기 (0 = 전체) |
tcpdump 사용 예시:
- tcpdump -i eth0 -w capture.pcap ’tcp port 80’ : HTTP 트래픽 저장
- tcpdump -i any -c 100 -n ‘src host 192.168.1.100’ : 특정 IP 100개 캡처
- tcpdump -i eth0 -A ’tcp port 80 and (tcp[13] & 2 != 0)’ : SYN 플래그 패킷