📦 iptables 완전 정복 가이드
📖 개요
iptables
는 리눅스 커널에서 제공하는 패킷 필터링 및 방화벽 기능을 제어하는 명령어입니다. 이는 네트워크 트래픽을 제어하고 시스템 보안을 강화하는 데 매우 유용합니다.
- 작동 계층: OSI 4계층 (전송 계층, TCP/UDP)
- 주요 기능:
- 패킷 허용/거부/드롭
- NAT(Network Address Translation)
- 포트 포워딩
🔗 기본 용어
용어 | 설명 |
---|---|
패킷(Packet) | 네트워크를 통해 전송되는 데이터의 단위 |
테이블(Table) | 규칙들의 집합이며, 서로 다른 목적에 따라 나뉨 |
체인(Chain) | 테이블 안에 정의된 규칙들의 목록 |
규칙(Rule) | 특정 조건의 패킷에 대한 행동(ACCEPT, DROP 등)을 정의 |
🧱 테이블 구조
iptables는 4가지 주요 테이블을 제공합니다.
테이블 이름 | 설명 |
---|---|
filter | 기본 테이블, 패킷 필터링에 사용 |
nat | NAT(Network Address Translation) 관련 |
mangle | 패킷 수정에 사용 (TTL 변경 등) |
raw | 연결 추적 전 필터링에 사용 |
📂 주요 체인(Chains)
체인 이름 | 동작 시점 | 설명 |
---|---|---|
INPUT | 로컬로 들어오는 패킷 | |
OUTPUT | 로컬에서 나가는 패킷 | |
FORWARD | 라우팅되는 패킷 (호스트를 거쳐 가는 패킷) | |
PREROUTING | 라우팅 결정 전에 처리 | |
POSTROUTING | 라우팅 결정 후 처리 |
⚙️ 기본 명령어
모든 규칙 보기
iptables -L -n -v
규칙 추가 (예: 80 포트를 허용)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
규칙 삭제 (위 규칙 제거)
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
기본 정책 변경 (모든 입력 차단)
iptables -P INPUT DROP
설정 초기화
iptables -F
📌 규칙 작성 예시
21번 포트 (FTP) 차단
iptables -A INPUT -p tcp --dport 21 -j DROP
443번 포트 (HTTPS) 허용
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
모든 UDP 포트 차단
iptables -A INPUT -p udp -j DROP
🌐 IP 및 대역 필터링
특정 IP 허용
iptables -A INPUT -s 203.0.113.50 -j ACCEPT
특정 IP 차단
iptables -A INPUT -s 203.0.113.51 -j DROP
특정 IP 대역 허용 (예: 사내 네트워크)
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
🧱 제한 정책 및 보호
Ping flood 방지 (초당 1개 ICMP 패킷 허용)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
SSH 접속 시도 3회 초과시 차단 (fail2ban 없이 간단한 제한)
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --update --seconds 60 --hitcount 4 -j DROP
💾 설정 저장 및 복원
iptables는 기본적으로 재부팅 시 설정이 유지되지 않으므로, 설정을 저장해야 합니다.
Ubuntu/Debian
sudo apt install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload
🔐 보안 팁
기본 정책은 DROP, 필요한 트래픽만 ACCEPT 하도록 구성
불필요한 포트는 반드시 차단
관리 포트(예: SSH)는 IP 제한 또는 VPN과 함께 사용
로그 기록 추가로 감시 가능
sudo iptables -A INPUT -j LOG --log-prefix "iptables-dropped:"
📚 참고 자료
공식문서
https://netfilter.org/documentation/