1. iptables 룰의 기본 특징
1️⃣ iptables 룰은 왜 저장이 필요한가
iptables 룰은 커널 메모리에 적재된다.
직접 iptables -A 나 iptables -I로 추가한 룰은 현재 실행 중인 시스템에서는 작동하지만, 재부팅하면 전부 사라진다.
영구적으로 유지하려면 룰을 파일로 덤프하고, 부팅 시 복원하는 별도 프로세스가 필요하다.
| 상태 | 저장 위치 | 재부팅 후 |
| iptables -A 직후 | 커널 메모리 | ❌ 사라짐 |
| iptables-save > 이후 | 파일(/etc/sysconfig/iptables) | ✅ 복구 가능 |
2️⃣ 핵심 명령어 3개 (root 사용자 기준)
🔵 iptables-save
iptables-save > /etc/sysconfig/iptables
현재 커널 메모리에 적재된 모든 테이블(filter, nat, mangle 등)의 룰을 텍스트 형식으로 stdout에 덤프한다.
> 리디렉션으로 파일에 저장하는 것이 일반적이다.
출력 형식은 iptables-restore가 그대로 파싱할 수 있는 전용 포맷이다.
# Generated by iptables-save v1.8.x
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp --dport 22 -j ACCEPT
COMMIT
🔵 iptables -F (Flush)
iptables -F
현재 테이블(-t 옵션 생략 시 filter 테이블)의 모든 룰을 삭제한다.
체인 자체는 남아있으나 룰이 비워진다. -F INPUT처럼 특정 체인만 비울 수도 있다.
⚠️ 주의: -F는 기본 정책(policy)은 변경하지 않는다. INPUT 체인 policy가 DROP인 상태에서 -F를 실행하면 SSH 접속이 끊길 수 있다.
🔵 iptables-restore
iptables-restore < /etc/sysconfig/iptables
# 또는
iptables-restore /etc/sysconfig/iptables
iptables-save가 생성한 파일을 읽어 커널 메모리에 원자적(atomic)으로 룰을 복원한다.
기존 룰을 먼저 비운 뒤 파일 내용을 통째로 적용한다.
트랜잭션처럼 동작하기 때문에 중간에 실패해도 절반만 적용되는 일은 없다.
2. 실습 시나리오
전체 흐름: 룰 생성 → 저장 → 삭제 → 복구 → 검증
1️⃣ 실습 환경 확인
# 현재 룰 상태 확인 (초기 상태)
iptables -nvL --line
# 변수 설정 (편의를 위해)
IPTABLES_CONFIG="/etc/sysconfig/iptables"
예상 출력 (초기 상태):

2️⃣ 테스트용 룰 생성
# 1) SSH (포트 22) 허용
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 2) HTTP (포트 80) 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 3) HTTPS (포트 443) 허용
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 4) 루프백 인터페이스 허용
iptables -A INPUT -i lo -j ACCEPT
# 5) 기존 연결(established/related) 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 6) 나머지 INPUT 차단
iptables -A INPUT -j DROP
# 적용된 룰 확인
iptables -nvL --line
예상 출력:

3️⃣ 현재 룰을 파일로 저장
# 저장 디렉토리 존재 여부 확인 (없으면 생성)
mkdir -p /etc/sysconfig
# 현재 룰 저장
iptables-save > $IPTABLES_CONFIG
# 저장 내용 확인
cat $IPTABLES_CONFIG
예상 출력:

4️⃣ 룰 삭제 (Flush)
# 전체 룰 삭제
iptables -F
# 삭제 확인
iptables -nvL INPUT --line
예상 출력 (룰이 모두 비워진 상태):

# 파일이 여전히 존재하는지 확인
cat $IPTABLES_CONFIG
💡 iptables -F는 커널 메모리의 룰만 삭제한다. 디스크의 파일(/etc/sysconfig/iptables)은 그대로 남아 있다.
5️⃣ 저장된 룰 복구
# 파일에서 룰 복구
iptables-restore $IPTABLES_CONFIG
# 복구 결과 확인
iptables -nvL INPUT --line
예상 출력 (룰이 복구된 상태):

6️⃣ 복구 검증 — 저장 시점과 동일한지 비교
# 현재 메모리 룰을 다시 덤프
iptables-save > /tmp/iptables_current.txt
# 원본 파일과 diff 비교
diff $IPTABLES_CONFIG /tmp/iptables_current.txt
diff 출력이 없다면(타임스탬프 주석 제외) 완전히 동일하게 복구된 것이다.
# 타임스탬프 주석 제거 후 정확하게 비교
grep -v '^#' $IPTABLES_CONFIG > /tmp/orig_noremark.txt
iptables-save | grep -v '^#' > /tmp/curr_noremark.txt
diff /tmp/orig_noremark.txt /tmp/curr_noremark.txt && echo "✅ 복구 성공: 완전히 일치"
3. 재부팅 후 자동 복구 설정
1️⃣ systemd 서비스 방식 (권장)
RHEL/CentOS 계열에서는 iptables 서비스를 활성화하면 저장된 파일이 자동으로 복구된다.
# iptables-services 패키지 설치 (없는 경우)
yum install -y iptables-services # RHEL/CentOS 7
dnf install -y iptables-services # RHEL/CentOS 8+
# 서비스 활성화 및 시작
systemctl enable iptables
systemctl start iptables
# 서비스 상태 확인
systemctl status iptables
2️⃣ rc.local 방식 (간단한 대안)
# /etc/rc.local 에 복구 명령 추가
echo "iptables-restore /etc/sysconfig/iptables" >> /etc/rc.local
chmod +x /etc/rc.local
4. 발생할 수 있는 문제와 디버깅 방법
| 상황 | 문제 | 해결 방법 |
| INPUT policy가 DROP인 상태에서 -F 실행 | 모든 패킷 차단 → SSH 접속 불가 | -F 전 policy를 ACCEPT로 변경하거나 원격 접속 룰 유지 확인 |
| iptables-save를 sudo 없이 실행 | 파일 쓰기 실패 | sudo 또는 root로 실행 |
| iptables-restore 파일 경로 오타 | 복구 실패 | ls -lh $IPTABLES_CONFIG로 파일 존재 확인 |
| IPv6 룰 누락 | IPv6 트래픽 별도 관리 필요 | ip6tables-save / ip6tables-restore 별도 실행 |
'Journey to Security > 리눅스' 카테고리의 다른 글
| [방화벽] iptables Conntrack (1) 상태 기반 룰 설정 (0) | 2026.06.03 |
|---|---|
| [방화벽] iptables - DNS 룰 설정 (0) | 2026.06.03 |
| [방화벽] 리눅스 호스트 방화벽 iptables에 대해 알아보자 (0) | 2026.05.30 |
| Kali 리눅스 IP주소 설정 방법 (0) | 2026.05.13 |
| 파이썬으로 소켓 통신 연결 구현하기 (0) | 2026.05.02 |