리눅스 iptables 방화벽 설정 완벽 가이드
리눅스 서버 운영에서 방화벽 설정은 보안의 첫 번째 관문입니다. iptables는 리눅스 커널에 내장된 강력한 패킷 필터링 도구로, 세밀한 네트워크 트래픽 제어가 가능합니다. 이 글에서는 iptables의 기본 구조부터 실무 설정까지 단계별로 살펴보겠습니다.
iptables 기본 구조 이해
iptables는 테이블(Table), 체인(Chain), 규칙(Rule)의 세 가지 계층 구조로 이루어져 있습니다.
주요 테이블
| 테이블 | 설명 |
|---|---|
filter |
패킷 허용/차단 (기본 테이블) |
nat |
주소 변환(NAT) 처리 |
mangle |
패킷 헤더 수정 |
raw |
연결 추적 제외 설정 |
기본 체인
- INPUT: 서버로 들어오는 패킷
- OUTPUT: 서버에서 나가는 패킷
- FORWARD: 서버를 경유하는 패킷
현재 규칙 확인
# 현재 iptables 규칙 확인
iptables -L -v -n
# 줄 번호와 함께 확인
iptables -L -v -n --line-numbers
# 특정 체인만 확인
iptables -L INPUT -v -n
기본 정책 설정
서버 보안의 기본 원칙은 모든 것을 차단하고 필요한 것만 허용하는 것입니다.
# 기본 정책을 DROP으로 설정
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 루프백 인터페이스 허용 (필수)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 기존 연결 및 관련 패킷 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
⚠️ 주의: 기본 정책을 DROP으로 변경하기 전에 반드시 SSH 포트를 허용해야 합니다. 그렇지 않으면 서버 접근이 차단됩니다.
서비스별 포트 허용
SSH 접속 허용
# 기본 SSH 포트(22) 허용
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 특정 IP에서만 SSH 허용 (보안 강화)
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
# 변경된 SSH 포트 허용 (예: 22022)
iptables -A INPUT -p tcp --dport 22022 -j ACCEPT
웹 서버 포트 허용
# HTTP (80) 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS (443) 허용
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# HTTP/HTTPS 동시 허용 (multiport 모듈 사용)
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
ICMP (Ping) 설정
# Ping 허용 (서버 모니터링에 필요)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Ping 차단 (스텔스 모드)
iptables -A INPUT -p icmp -j DROP
브루트포스 공격 방어
SSH 등의 서비스에 대한 무차별 대입 공격을 iptables로 1차 방어할 수 있습니다.
# 분당 SSH 연결 시도를 5회로 제한
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP
# 초당 새 연결을 3개로 제한 (limit 모듈)
iptables -A INPUT -p tcp --dport 22 -m limit \
--limit 3/min --limit-burst 5 -j ACCEPT
IP 및 대역 차단
# 특정 IP 차단
iptables -A INPUT -s 203.0.113.10 -j DROP
# IP 대역 차단 (CIDR 표기)
iptables -A INPUT -s 203.0.113.0/24 -j DROP
# 차단 목록에서 제거
iptables -D INPUT -s 203.0.113.10 -j DROP
포트 포워딩 설정
# IP 포워딩 활성화
echo 1 > /proc/sys/net/ipv4/ip_forward
# 외부 포트 8080을 내부 서버의 80으로 포워딩
iptables -t nat -A PREROUTING -p tcp --dport 8080 \
-j DNAT --to-destination 192.168.1.10:80
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 \
-m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
규칙 저장과 복원
iptables 규칙은 서버 재부팅 시 초기화됩니다. 규칙을 영구적으로 유지하려면 저장이 필요합니다.
RHEL / CentOS / Rocky Linux 계열
# iptables-services 설치
dnf install iptables-services -y
# 서비스 활성화 및 시작
systemctl enable iptables
systemctl start iptables
# 현재 규칙 저장
service iptables save
# 또는
iptables-save > /etc/sysconfig/iptables
Debian / Ubuntu 계열
# iptables-persistent 설치
apt install iptables-persistent -y
# 현재 규칙 저장
netfilter-persistent save
# 재부팅 후 자동 로드 확인
systemctl enable netfilter-persistent
자주 사용하는 관리 명령어
# 모든 규칙 초기화 (주의!)
iptables -F
iptables -X
iptables -Z
# 특정 체인의 규칙 삭제
iptables -F INPUT
# 규칙 파일로 내보내기
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules
# 규칙 파일에서 복원
iptables-restore < /root/iptables-backup-20251115.rules
실무 권장 설정 스크립트
#!/bin/bash
# iptables 기본 보안 설정 스크립트
# 기존 규칙 초기화
iptables -F
iptables -X
# 기본 정책 설정
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 루프백 허용
iptables -A INPUT -i lo -j ACCEPT
# 기존 연결 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH 허용 (필요에 따라 IP 제한 추가)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m limit --limit 3/min --limit-burst 5 -j ACCEPT
# HTTP, HTTPS 허용
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# Ping 허용
iptables -A INPUT -p icmp --icmp-type echo-request \
-m limit --limit 1/s -j ACCEPT
# 나머지 모두 차단 및 로그 기록
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
iptables -A INPUT -j DROP
echo "iptables 설정이 완료되었습니다."
iptables -L -v -n
iptables는 강력하지만 잘못 설정하면 서버 접근이 차단될 수 있습니다. 원격 서버에서 작업할 때는 반드시 SSH 접속을 먼저 허용한 후 기본 정책을 변경하고, 변경 사항을 저장하기 전에 충분히 테스트하는 것을 권장합니다. 또한 firewalld나 ufw 같은 프론트엔드 도구를 함께 사용하면 더 직관적인 관리가 가능합니다.
댓글남기기