요약
iptables는 리눅스 커널의 패킷 필터링 프레임워크인 netfilter를 제어하는 사용자 공간 도구로, 네트워크 트래픽을 효과적으로 관리하고 서버를 보호합니다. 프로덕션 환경에서는 기본적으로 "기본 거부(Default Deny)" 정책을 적용하고 필요한 서비스만 명시적으로 허용하는 것이 권장됩니다. 현대 리눅스 시스템에서는 nftables나 firewalld와 같은 대안이 등장했지만, iptables는 여전히 널리 사용되며 안정성과 풍부한 문서화로 인해 많은 프로덕션 환경에서 선호됩니다.
iptables란 무엇인가요? 🤔
여러분이 집에 문, 창문, 그리고 특별한 경비원을 두고 있다고 상상해보세요.
- 이 경비원은 모든 방문자를 검사하고
- 누구를 들어오게 할지, 누구를 내보낼지 결정합니다
- 심지어 특정 방문자가 어떤 방에 갈 수 있는지까지 제어합니다
iptables가 바로 이런 역할을 합니다!
- 서버로 들어오고 나가는 모든 네트워크 패킷을 검사하고
- 어떤 트래픽을 허용하고, 차단하고, 수정할지 결정하는 리눅스 방화벽 도구입니다 ✨
iptables의 기본 구조 🏗️
1. 테이블(Tables)
iptables는 목적에 따라 구분된 여러 테이블로 구성되어 있습니다:
filter: 기본 패킷 필터링 (방화벽의 핵심 기능)
nat: 네트워크 주소 변환 담당
mangle: 패킷 헤더 수정
raw: 연결 추적 시스템 구성
security: 강제적 접근 제어 규칙
2. 체인(Chains)
각 테이블은 여러 체인으로 구성되며, 이는 패킷이 처리되는 시점을 정의합니다:
INPUT: 서버로 들어오는 패킷
OUTPUT: 서버에서 나가는 패킷
FORWARD: 서버를 통과하는 패킷
PREROUTING: 라우팅 결정 전 패킷 처리
POSTROUTING: 라우팅 결정 후 패킷 처리
3. 규칙(Rules)
각 체인은 여러 규칙으로 구성되며, 이는 실제 필터링 작업을 수행합니다:
매치 조건: 패킷을 식별하는 기준 (포트, IP, 프로토콜 등)
타겟/점프: 조건 충족 시 취할 행동 (ACCEPT, DROP, REJECT 등)
프로덕션 서버 기본 설정 방법 🎬
1. 기본 정책 설정 - "Default Deny" 접근법
# 기본적으로 모든 트래픽 차단
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 로컬호스트 트래픽 허용
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# 이미 연결된 세션 허용
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
2. 필수 서비스 허용
# SSH 접속 허용 (포트 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 웹 서버 트래픽 허용 (HTTP/HTTPS)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNS 요청 허용
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 53 -j ACCEPT
3. 특정 IP 주소에서만 접근 허용 (관리자 전용)
# 특정 IP에서만 SSH 접속 허용
sudo iptables -A INPUT -p tcp --dport 22 -s 123.123.123.123 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
# 데이터베이스 서버 접근 제한
sudo iptables -A INPUT -p tcp --dport 3306 -s 10.0.0.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
4. 보안 강화 규칙
# 무효한 패킷 차단
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# ICMP 플러드 보호 (핑 공격 방어)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 포트 스캔 감지 및 차단
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
주의사항과 안전 조치 ⚠️
1. 원격 서버에서 작업 시 주의점
원격 서버에서 SSH를 통해 iptables 규칙을 변경할 때는 특히 주의해야 합니다. 잘못된 설정으로 인해 서버 접속이 차단될 수 있습니다.
# 안전한 규칙 적용을 위한 타이머 설정
sudo bash -c "sleep 30 && iptables -F && iptables -P INPUT ACCEPT" &
이 명령어는 30초 후에 모든 규칙을 초기화하는 백그라운드 프로세스를 생성합니다. 만약 실수로 자신을 차단했다면, 30초 후에 접속이 복구됩니다.
2. 규칙 영구 저장하기
iptables 규칙은 재부팅 시 초기화됩니다. 영구적으로 저장하려면:
# Debian/Ubuntu
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
# CentOS/RHEL
sudo service iptables save
실제 사용 예시 📱
1. 웹 서버 설정
#!/bin/bash
# 기존 규칙 초기화
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 conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 웹 서비스 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 관리자 IP에서만 SSH 허용
iptables -A INPUT -p tcp --dport 22 -s 관리자_IP -j ACCEPT
# 기본 ICMP (ping) 제한적 허용
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
# 규칙 저장
service iptables save
2. 데이터베이스 서버 설정
#!/bin/bash
# 기존 규칙 초기화
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 conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH는 특정 IP에서만 허용
iptables -A INPUT -p tcp --dport 22 -s 관리자_IP -j ACCEPT
# 데이터베이스 포트는 웹 서버 IP에서만 접속 가능
iptables -A INPUT -p tcp --dport 3306 -s 웹서버_IP_1 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -s 웹서버_IP_2 -j ACCEPT
# 규칙 저장
service iptables save
iptables vs 최신 대안 🔄
최근 리눅스에서는 iptables를 대체하는 새로운 도구들이 등장했습니다:
1. nftables
- iptables의 후속작으로 개발됨
- 성능이 더 좋고 문법이 간결함
- 메모리 사용량이 적고 규칙 처리가 효율적
- 최신 리눅스 배포판에서는 기본으로 채택되는 추세
# nftables 예시
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input tcp dport 22 accept
2. firewalld
- 동적 방화벽 관리 도구
- 서비스 중단 없이 규칙 변경 가능
- 구역(zone) 기반 설정으로 네트워크 환경별 관리 용이
- CentOS/RHEL 계열에서 주로 사용됨
# firewalld 예시
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
어떤 것을 선택해야 할까요?
- iptables: 안정성, 풍부한 문서화, 레거시 시스템 호환성
- nftables: 성능, 유연성, 현대적 기능 (새 시스템에 권장)
- firewalld: 사용 편의성, 동적 관리 (데스크톱 또는 변경이 잦은 환경에 적합)
문제 해결 및 디버깅 🔍
1. 로그 확인
iptables 로그를 활성화하여 어떤 패킷이 차단되고 있는지 확인할 수 있습니다:
# 로깅 규칙 추가 (DROP 전에 배치)
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
# 로그 확인
sudo tail -f /var/log/syslog | grep IPTables-Dropped
2. 현재 규칙 확인
# 모든 규칙 조회
sudo iptables -L -v -n
# 특정 체인의 규칙만 조회
sudo iptables -L INPUT -v -n
# 패킷 카운터 포함 조회
sudo iptables -L -v -n --line-numbers
3. 연결 추적 상태 확인
# 연결 추적 테이블 확인
sudo cat /proc/net/nf_conntrack
마치며 🎁
iptables는 리눅스 서버 보안의 핵심 도구로, 올바르게 설정할 경우 강력한 방화벽 기능을 제공합니다. 프로덕션 환경에서는 항상 "기본 거부" 정책을 적용하고, 필요한 서비스만 명시적으로 허용하는 것이 좋습니다.
신중한 설정과 정기적인 검토를 통해 서버를 안전하게 보호하세요. 최신 대안인 nftables와 firewalld도 각자의 장점이 있으니, 환경에 맞게 선택하는 것이 중요합니다.
참고 자료 📚
- Linux man pages - iptables(8). https://linux.die.net/man/8/iptables
- 리눅스 운영체제 iptables에 기반한 방화벽 설정 방법 | 가비아 라이브러리. https://library.gabia.com/contents/infrahosting/2214/
- Securing Your Web Server with IPTables Best Practices. https://www.coherentmarketinsights.com/blog/securing-your-web-server-with-iptables-best-practices-264
- Best practices: iptables - Major Hayden. https://major.io/p/best-practices-iptables/
- iptables vs. nftables vs. firewalld: A Comprehensive Comparison for Linux Firewalls - DEV Community. https://dev.to/chatgptnexus/2025021407-53-50-article-4695
- Controlling Network Traffic with iptables - A Tutorial | Linode Docs. https://www.linode.com/docs/guides/control-network-traffic-with-iptables/
'100===Dev Ops > Iptables' 카테고리의 다른 글
라우팅(Routing): 네트워크의 길찾기 내비게이션 🗺️ (0) | 2024.11.18 |
---|---|
리눅스 방화벽의 핵심, iptables 완벽 가이드 🛡️ (0) | 2024.11.18 |