Journey to Security/리눅스

[방화벽] iptables LOG target- 패킷 모니터링

Cordilog 2026. 6. 3. 15:54

iptables로 트래픽을 차단하는 것만큼 중요한 것이 어떤 패킷이 들어오고 나가는지 기록하는 것이다.

1. LOG 타깃의 동작 원리

1️⃣ Non-terminating target

iptables의 타깃은 크게 두 종류로 나뉜다.

Target 예시 동작
Terminating target ACCEPT, DROP, REJECT 패킷을 처리하고 체인 순회를 종료
Non-terminating target LOG, MARK, CONNMARK 처리 없이 다음 룰로 계속 진행

여기서 살펴볼 LOG non-terminating target이다.

패킷을 커널 로그에 기록하고, 체인 순회를 그대로 이어간다.

즉, LOG 룰에 매칭된 패킷은 반드시 그 뒤의 룰에서 최종 처리된다.

2️⃣ LOG 단독으로는 패킷을 막을 수 없다

아래 구성은 의도와 다르게 동작한다.

# 잘못된 구성 — 로그는 찍히지만 패킷이 통과함
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "PACKET INVALID "

# DROP 룰 없음 → 기본 정책(ACCEPT)으로 흘러감

 

올바른 구성은 LOG 바로 다음에 처리 룰을 명시하는 것이다.

# 올바른 구성
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "PACKET INVALID "
iptables -A INPUT -m state --state INVALID -j DROP

 

2. --log-prefix 옵션

1️⃣ 기본 문법

iptables -A INPUT -m state --state INVALID \
    -j LOG --log-prefix "PACKET INVALID "

 

--log-prefix는 커널 로그에 기록될 줄 앞에 식별 문자열을 붙인다.

나중에 grep으로 이벤트 유형별로 필터링할 때 필요하다.

2️⃣ 작성 규칙

  • 최대 29자까지 허용
  • 마지막에 공백 한 칸을 붙여야 뒤따르는 로그 필드와 구분할 수 있다.
  • 따옴표 안에 작성, 대문자로 쓰면 grep 시 가독성이 좋아진다.
 
# 좋은 예 — 프리픽스 끝에 공백 포함
-j LOG --log-prefix "PACKET INVALID "
-j LOG --log-prefix "state NEW "
-j LOG --log-prefix "OUTPUT DROP "

# 나쁜 예 — 공백 없으면 뒤 필드와 붙어서 출력됨
-j LOG --log-prefix "PACKET_INVALID"

3️⃣ --log-level 옵션 (선택)

기본값은 warning(4)이며 대부분 그대로 사용해도 무방하다.

rsyslog 설정에 따라 특정 레벨만 파일에 기록하는 환경이라면 명시적으로 지정할 수 있다.

iptables -A INPUT -m state --state INVALID \
    -j LOG --log-prefix "PACKET INVALID " --log-level 4
 

 

레벨 값 이름 용도
3 err 오류 수준
4 warning 기본값, 경고 수준
6 info 정보 수준
7 debug 디버그 수준

 

3.  INPUT 룰 구성 예시

1️⃣ 전체 룰

iptables -F

# ── INPUT 체인 ──────────────────────────────────────────
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "INPUT_INVALID: "
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "INPUT_NEW: "
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j DROP

# ── 룰 저장 -----─────────────────────────────────────────
iptables-save > /etc/sysconfig/iptables

2️⃣ 룰 구성 원칙

🔵 LOG + DROP은 항상 쌍으로: 같은 매칭 조건에 LOG 룰과 처리 룰을 연속으로 작성한다. 사이에 다른 룰이 끼어들면 매칭 흐름이 바뀔 수 있다.

🔵 INVALID를 가장 먼저: 비정상 패킷을 초반에 걸러야 이후 허용 룰에서 의도치 않게 통과되는 것을 막는다.

 

4. 로그 모니터링 실습

1️⃣ 실시간 모니터링

# 기존 로그 초기화 (선택)
> /var/log/messages

# 실시간 확인
tail -f /var/log/messages

2️⃣ 비정상 FIN 패킷 전송 

kali 머신에서 다음과 같이 비정상 패킷을 전송한다.

hping3 -F -p 22 -c 1 192.168.100.10

3️⃣ 로그 출력 예시

INVALID 패킷 탐지 시:

 

정상 SSH 신규 연결 시:

4️⃣ 로그 필드 의미

필드 의미
IN=ens160 패킷이 들어온 인터페이스
SRC= 출발지 IP
DST= 목적지 IP
PROTO=TCP 프로토콜
SPT= / DPT= 출발지 / 목적지 포트
SYN / FIN / RST 설정된 TCP 플래그
LEN= 패킷 전체 길이 (바이트)
TTL= Time To Live

 

5️⃣ 이벤트 유형별 필터링

# INVALID 패킷만 추출
grep "INPUT_INVALID: " /var/log/messages

# 신규 연결 시도만 추출
grep "INPUT_NEW: " /var/log/messages

# OUTPUT에서 DROP된 트래픽 확인
grep "OUTPUT DROP" /var/log/messages

# 특정 소스 IP 추적
grep "SRC=192.168.10.100" /var/log/messages

# 오늘 날짜 INVALID 패킷 카운트
grep "INPUT_INVALID: " /var/log/messages | grep "$(date '+%b %e')" | wc -l

 

5. 정리

  • LOG는 non-terminating target이다. 패킷을 기록만 하고 체인 순회를 계속하므로, 반드시 뒤에 DROP 또는 ACCEPT 룰이 필요하다.
  • --log-prefix로 이벤트 유형마다 고유한 식별자를 붙이면 grep 기반 분석이 훨씬 수월해진다.
  • INPUT뿐 아니라 OUTPUT 체인에도 LOG를 적용하면 서버 내부에서 발생하는 이상 트래픽까지 가시화할 수 있다.