
Linux iptables 완벽 가이드
리눅스 서버를 운영하다 보면 가장 많이 접하게 되는 보안 기능 중 하나가 iptables입니다.
iptables는 서버로 들어오고 나가는 네트워크 패킷을 제어하여 허용하거나 차단하는 리눅스 방화벽(Firewall) 입니다.
이번 글에서는 iptables의 기본 개념부터 체인(Chain), NAT, 사용자 정의 체인, 실무 예제까지 한 번에 정리해보겠습니다.
iptables란?
iptables는 Linux Kernel의 Netfilter 프레임워크를 제어하는 사용자 공간(User Space) 프로그램입니다.
쉽게 말하면
-
특정 IP만 접속 허용
-
특정 포트 차단
-
NAT(Network Address Translation)
-
포트포워딩
-
패킷 필터링
등을 수행할 수 있습니다.
대표적인 활용 예시는 다음과 같습니다.
-
SSH(22)만 허용
-
HTTP(80), HTTPS(443) 허용
-
FTP(21) 차단
-
특정 국가 또는 IP 차단
-
Docker, KVM NAT 구성
iptables 동작 구조
패킷은 서버에 도착하면 다음과 같은 순서로 처리됩니다.
인터넷
│
▼
PREROUTING
│
┌─-────-───┴───-─────-──┐
▼ ▼
INPUT FORWARD
│ │
▼ ▼
Local Host 다른 서버 전달
│
▼
OUTPUT
│
▼
POSTROUTING
│
▼
인터넷
Table과 Chain
iptables는 여러 개의 Table과 Chain으로 구성됩니다.
Table
실무에서는 대부분 filter와 nat를 사용합니다.
Chain
filter 테이블에는 기본적으로 3개의 Chain이 존재합니다.
INPUT
인터넷
│
▼
내 서버
OUTPUT
내 서버
│
▼
인터넷
FORWARD
인터넷
│
▼
내 서버
│
▼
다른 서버
기본 정책(Default Policy)
현재 정책 확인
iptables -L
또는
iptables -L -n
모든 INPUT 허용
iptables -P INPUT ACCEPT
모든 INPUT 차단
iptables -P INPUT DROP
규칙(Rule)
iptables는 위에서 아래 순서대로 규칙을 검사합니다.
예를 들어
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
의 의미는
-
INPUT 체인
-
TCP 프로토콜
-
22번 포트
-
허용
입니다.
자주 사용하는 옵션
자주 사용하는 명령어
SSH 허용
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
HTTP 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
HTTPS 허용
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Ping 허용
iptables -A INPUT -p icmp -j ACCEPT
특정 IP 차단
iptables -A INPUT -s 192.168.0.100 -j DROP
특정 IP만 SSH 허용
iptables -A INPUT \
-p tcp \
-s 192.168.0.100 \
--dport 22 \
-j ACCEPT
FTP 차단
iptables -A INPUT -p tcp --dport 21 -j DROP
Telnet 차단
iptables -A INPUT -p tcp --dport 23 -j DROP
Stateful Firewall
대부분의 서버에서는 이미 연결된 세션은 자동으로 허용합니다.
iptables -A INPUT \
-m conntrack \
--ctstate ESTABLISHED,RELATED \
-j ACCEPT
이 규칙이 없으면
내 서버 → 인터넷
으로 요청을 보내도
응답 패킷이 차단될 수 있습니다.
NAT
KVM, Docker에서 가장 많이 사용하는 기능입니다.
iptables -t nat \
-A POSTROUTING \
-o eth0 \
-j MASQUERADE
인터넷 공유기의 NAT 기능과 동일한 역할을 수행합니다.
포트포워딩
80포트를 8080으로 변경
iptables -t nat \
-A PREROUTING \
-p tcp \
--dport 80 \
-j REDIRECT \
--to-port 8080
사용자 정의 체인(User Defined Chain)
iptables는 직접 체인을 만들어 관리할 수 있습니다.
실무에서는 서비스별로 체인을 분리하여 관리하는 경우가 많습니다.
예)
-
SSH_CHAIN
-
WEB_CHAIN
-
DB_CHAIN
-
LOG_DROP
체인 생성
WEB 체인 생성
iptables -N WEB
확인
iptables -L
Chain WEB (0 references)
체인에 규칙 추가
iptables -A WEB -p tcp --dport 80 -j ACCEPT
iptables -A WEB -p tcp --dport 443 -j ACCEPT
조회
iptables -L WEB -n
INPUT에 연결(Jump)
체인을 생성했다고 자동 실행되지는 않습니다.
INPUT에서 호출해야 합니다.
iptables -A INPUT -j WEB
동작 순서
인터넷
↓
INPUT
↓
WEB
↓
80 → 허용
443 → 허용
그 외 → INPUT으로 복귀
RETURN
조건이 맞지 않으면 원래 체인으로 복귀합니다.
iptables -A WEB \
-p tcp \
--dport 80 \
-j ACCEPT
iptables -A WEB -j RETURN
흐름
INPUT
↓
WEB
↓
80?
YES → ACCEPT
NO
↓
RETURN
↓
INPUT 다음 규칙
체인 삭제
체인 비우기
iptables -F WEB
INPUT에서 제거
iptables -D INPUT -j WEB
체인 삭제
iptables -X WEB
규칙 조회
패킷 수까지 보기
iptables -L -n -v
규칙 번호 보기
iptables -L --line-numbers
규칙 삭제
번호로 삭제
iptables -D INPUT 3
규칙으로 삭제
iptables -D INPUT \
-p tcp \
--dport 23 \
-j DROP
전체 삭제
iptables -F
NAT 삭제
iptables -t nat -F
설정 저장
Rocky / CentOS
iptables-save > /etc/sysconfig/iptables
또는
service iptables save
Ubuntu
iptables-save > /etc/iptables/rules.v4
일반적으로 iptables-persistent 패키지를 함께 사용합니다.