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를 적용하면 서버 내부에서 발생하는 이상 트래픽까지 가시화할 수 있다.
'Journey to Security > 리눅스' 카테고리의 다른 글
| [방화벽] iptables Conntrack (2) INVALID 패킷 탐지 (0) | 2026.06.03 |
|---|---|
| [방화벽] iptables Conntrack (1) 상태 기반 룰 설정 (0) | 2026.06.03 |
| [방화벽] iptables - DNS 룰 설정 (0) | 2026.06.03 |
| [방화벽] iptables 저장/복구 방법 (0) | 2026.06.02 |
| [방화벽] 리눅스 호스트 방화벽 iptables에 대해 알아보자 (0) | 2026.05.30 |