4 분 소요

리눅스 서버 운영에서 방화벽 설정은 보안의 첫 번째 관문입니다. 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

서버 터미널 화면

iptables 설정을 적용하는 서버 터미널

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 접속을 먼저 허용한 후 기본 정책을 변경하고, 변경 사항을 저장하기 전에 충분히 테스트하는 것을 권장합니다. 또한 firewalldufw 같은 프론트엔드 도구를 함께 사용하면 더 직관적인 관리가 가능합니다.

댓글남기기