<scshin />

Linux iptables 완벽 가이드


1.00

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

실무에서는 대부분 filternat를 사용합니다.


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 패키지를 함께 사용합니다.