Journey to Security/리눅스

[방화벽] iptables Conntrack (2) INVALID 패킷 탐지

Cordilog 2026. 6. 3. 14:58

iptables의 상태 추적(stateful inspection) 기능은 단순히 포트를 열고 닫는 수준을 넘어, 패킷이 현재 TCP 연결 상태와 맞지 않을 때 이를 INVALID로 분류해 자동으로 차단한다.

이번에는 hping3로 비정상 패킷을 직접 만들어 INVALID 동작을 검증하고, LOG 타깃을 활용해 실시간 패킷 로깅 체계를 구축하는 방법을 알아보자.

 

1. INVALID 패킷이란?

iptables의 -m state 모듈은 각 패킷을 NEW, ESTABLISHED, RELATED, INVALID 중 하나의 상태로 분류한다.

이 중 INVALID는 기존 연결 테이블에 존재하지 않는 세션에 대해 연결 종료/리셋 신호가 들어올 때 붙는 레이블이다.

TCP 플래그와 연결 상태의 관계를 정리하면 다음과 같다.

TCP 플래그 의미 정상 조건
SYN 연결 요청 처음 연결 시도 → NEW
ACK 수신 확인 기존 세션 응답 교환에 사용 (ESTABLISHED) — 세션 없이 단독 전송 시 INVALID
FIN 정상 종료 기존 세션에서만 유효 → ESTABLISHED
RST 강제 리셋 기존 세션에서만 유효 → ESTABLISHED

세션이 없는 상태에서 FIN, ACK, RST를 보내면 커널의 conntrack 테이블에 매칭되는 항목이 없으므로 INVALID로 처리된다. 포트 스캐닝, 세션 하이재킹 시도, TCP 상태 머신 우회 공격 등이 이 방식으로 탐지된다.

 

2. hping3 실습 — SYN vs FIN 비교

1️⃣ hping3 주요 플래그

 
# -S : SYN  (정상 접속 요청)
# -A : ACK  (연결 확립 후 교환)
# -F : FIN  (정상 종료 신호)
# -R : RST  (강제 리셋)
# -p : 대상 포트 지정
# -c : 전송 패킷 수

 

2️⃣ 실습 준비 — 기본 상태 추적 룰 적용

서버에 아래 룰이 적용되어 있어야 SYN/FIN 카운트를 확인할 수 있다.

 
# 루프백 인터페이스 허용
iptables -A INPUT -i lo -j ACCEPT

# [1] INVALID 패킷 차단
iptables -A INPUT -m state --state INVALID -j DROP

# [2] ESTABLISHED,RELATED 패킷 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# [3] NEW 패킷 허용 (새 SSH 접속)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# [4] 나머지 전부 차단
iptables -A INPUT -j DROP

 

3️⃣ SYN vs FIN 패킷 전송 후 카운트 확인

Kali linux 머신에서 아래 명령을 순서대로 실행한다.

# kali 머신에서 SYN 패킷 전송 (정상 연결 요청)
hping3 -S -p 22 -c 3 [서버 IP]
# 서버에서 카운트 확인
iptables -nvL INPUT
# kali 머신에서 FIN 패킷 전송 (연결 없이 종료 신호 — 비정상)
hping3 -F -p 22 -c 3 [서버 IP]
# 서버에서 카운트 확인
iptables -nvL INPUT

 

위 두 케이스의 시퀀스 흐름을 비교하면 다음과 같다.

 

 

결과 비교:

케이스 매칭 룰 응답 패킷 손실
SYN state NEW 룰 카운트 증가 flags=SA (SYN-ACK) 수신 0%
FIN state INVALID 룰 카운트 증가 응답 없음 100%