네트워크 보안 · 7 min read · Feb 13, 2026

기본 Iptables - Debian/RedHat

요약

더 읽기 쉬운 버전은 여기에서 찾을 수 있습니다: 5dollarwhitebox.org

많은 사람들이 IPTables에 겁을 먹고 이해하기 어렵다고 생각합니다. 그러나 일단 기본을 이해하면 쉽습니다. 이 문서는 iptables 사용에 대한 기본적인 방법을 제공할 것입니다. 저는 iptables 전문가가 아니지만, 꽤 오랫동안 이렇게 사용해왔습니다. 제가 실수를 했다면 주저하지 말고 이메일을 보내주세요.

시스템

Debian Sarge 3.1 Vanilla 2.6.12.4 커널 from mirrors.kernel.org iptables 관리 유틸리티 버전 1.2.11-10

준비

이 How-To는 Debian Sarge 3.1 박스에서 수행되지만, 명령어와 구문은 모든 리눅스 배포판에서 작동해야 합니다. iptables를 구성하기 전에, 먼저 커널에 컴파일되었는지와 적절한 사용자 공간 유틸리티가 설치되어 있는지 확인해야 합니다.

커널이 컴파일될 때의 구성 파일이 있어야 합니다. “CONFIG_IP_NF”를 grep하면 대부분의 줄/옵션에 대해 ‘=y’ 또는 ‘=m’이 나와야 합니다. 여기에서 “CONFIG_IP_NF_IPTABLES”가 커널 모듈로 컴파일되었음을 볼 수 있습니다.

# cat /boot/config-2.4.30 | grep -i “CONFIG_IP_NF”

  • CONFIG_IP_NF_CONNTRACK=m
    CONFIG_IP_NF_FTP=m
    CONFIG_IP_NF_AMANDA=m
    CONFIG_IP_NF_TFTP=m
    CONFIG_IP_NF_IRC=m
    CONFIG_IP_NF_QUEUE=m
    CONFIG_IP_NF_IPTABLES=m
    CONFIG_IP_NF_MATCH_LIMIT=m
    CONFIG_IP_NF_MATCH_MAC=m
    CONFIG_IP_NF_MATCH_PKTTYPE=m
    CONFIG_IP_NF_MATCH_MARK=m
    CONFIG_IP_NF_MATCH_MULTIPORT=m
    CONFIG_IP_NF_MATCH_TOS=m
    CONFIG_IP_NF_MATCH_RECENT=m
    CONFIG_IP_NF_MATCH_ECN=m
    CONFIG_IP_NF_MATCH_DSCP=m
    CONFIG_IP_NF_MATCH_AH_ESP=m
    CONFIG_IP_NF_MATCH_LENGTH=m
    CONFIG_IP_NF_MATCH_TTL=m
    CONFIG_IP_NF_MATCH_TCPMSS=m
    CONFIG_IP_NF_MATCH_HELPER=m
    CONFIG_IP_NF_MATCH_STATE=m
    CONFIG_IP_NF_MATCH_CONNTRACK=m
    CONFIG_IP_NF_MATCH_UNCLEAN=m
    CONFIG_IP_NF_MATCH_OWNER=m
    CONFIG_IP_NF_FILTER=m
    CONFIG_IP_NF_TARGET_REJECT=m
    CONFIG_IP_NF_TARGET_MIRROR=m
    CONFIG_IP_NF_NAT=m
    CONFIG_IP_NF_NAT_NEEDED=y
    CONFIG_IP_NF_TARGET_MASQUERADE=m
    CONFIG_IP_NF_TARGET_REDIRECT=m
    CONFIG_IP_NF_NAT_AMANDA=m
    CONFIG_IP_NF_NAT_SNMP_BASIC=m
    CONFIG_IP_NF_NAT_IRC=m
    CONFIG_IP_NF_NAT_FTP=m
    CONFIG_IP_NF_NAT_TFTP=m
    CONFIG_IP_NF_MANGLE=m
    CONFIG_IP_NF_TARGET_TOS=m
    CONFIG_IP_NF_TARGET_ECN=m
    CONFIG_IP_NF_TARGET_DSCP=m
    CONFIG_IP_NF_TARGET_MARK=m
    CONFIG_IP_NF_TARGET_LOG=m
    CONFIG_IP_NF_TARGET_ULOG=m
    CONFIG_IP_NF_TARGET_TCPMSS=m
    CONFIG_IP_NF_ARPTABLES=m
    CONFIG_IP_NF_ARPFILTER=m
    CONFIG_IP_NF_ARP_MANGLE=m
    CONFIG_IP_NF_COMPAT_IPCHAINS=m
    CONFIG_IP_NF_NAT_NEEDED=y
    CONFIG_IP_NF_COMPAT_IPFWADM=m
    CONFIG_IP_NF_NAT_NEEDED=y*

이것은 그리 필요하지 않습니다. 왜냐하면 규칙을 추가해보면 iptables가 작동하는지 빠르게 알 수 있기 때문입니다.

iptables 관리 유틸리티가 설치되어 있는지 확인하려면 다음을 실행하십시오:

# dpkg -l iptables

  • iptables 1.2.11-10 Linux kernel 2.4+ iptables 관리용*

…또는 rpm 기반 배포판의 경우:

# rpm -qa | grep iptables

iptables-xxxxx


…또는 바이너리가 있는지 확인할 수 있습니다!

# which iptables

/sbin/iptables

유틸리티가 누락된 경우 다음과 같이 설치할 수 있습니다:

APT

# apt-get update && apt-get install iptables


RPM

# rpm -Uvh iptables-xxxx.rpm

준비 중 ################################# [100%]

주요 파일

Debian

  • /etc/init.d/iptables – 서비스 시작|중지|재시작 및 규칙 세트 저장을 위한 INIT 스크립트. 이 파일은 Sarge부터 기본값이 아니지만 여전히 얻을 수 있습니다 (제가 보여드리겠습니다).

  • /var/lib/iptables – Debian의 ‘활성’ 및 ‘비활성’ iptables-save 카운터 파일의 홈 (즉, 저장된 규칙 세트). RedHat에서는 ‘/etc/sysconfig/iptables’에서 저장된 규칙을 찾을 수 있습니다.

  • /var/lib/iptables/active – 활성 카운터 (자세한 내용은 나중에)

  • /var/lib/iptables/inactive – 비활성 카운터

  • /sbin/iptables – 관리 유틸리티/바이너리.

RedHat

  • /etc/init.d/iptables – 서비스 시작|중지|재시작 및 규칙 세트 저장을 위한 INIT 스크립트.

  • /etc/sysconfig/iptables – RedHat의 iptables-save 카운터 파일을 위한 파일 (즉, 저장된 규칙 세트).

  • /sbin/iptables – 관리 유틸리티/바이너리.

IPTables에 대한 간단한 설명

현재 어떤 규칙 세트가 있는지 보려면 다음을 실행하십시오:

# iptables –list

*Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination*

규칙 세트가 없을 때 보게 될 내용입니다. 이를 통해 3개의 ‘체인’을 볼 수 있습니다.

  • INPUT - 이 서버로 향하는 트래픽에 대한 규칙을 보유합니다.

  • FORWARD – 이 서버 뒤에 있는 IP로 전달될 트래픽에 대한 규칙을 보유합니다 (즉, 이 박스가 다른 서버의 방화벽 역할을 하는 경우).

  • OUTPUT – 이 서버에서 인터넷으로 나가는 트래픽에 대한 규칙을 보유합니다.

주로 우리는 이 서버로 향하는 트래픽을 다루게 되며, INPUT 체인에 대한 규칙을 발행할 것입니다. 트래픽이 커널을 통과할 때, 패킷이 규칙과 일치하는지 여부에 따라 “대상”을 결정합니다. 일반적인 대상은:

  • ACCEPT – 트래픽이 배달을 위해 수락됩니다.

  • REJECT – 트래픽이 거부되며, 패킷이 발신 호스트로 되돌아갑니다.

  • DROP - 트래픽이 드롭됩니다. 발신 호스트로 아무것도 되돌아가지 않습니다.

규칙 세트 구성

자, 이제 본론으로 들어갑시다. 규칙이 추가되는 순서가 매우 중요하다는 점을 주목해야 합니다. 예를 들어, 첫 번째 규칙이 모든 것을 거부하는 것이라면… 그 후에 특정적으로 허용하는 것이 무엇이든 간에 거부될 것입니다.

또한, 당신이 하는 모든 것은 ‘iptables-save’를 실행하기 전까지 디스크에 저장되지 않는다는 점도 주목해야 합니다 (또는 init 스크립트를 사용하여 저장). 모든 카운터/규칙 세트는 메모리에 있습니다. 서버가 재부팅되거나 ‘iptables –flush’를 실행하면 당신이 작업한 모든 것이 사라집니다. 개인적으로 저는 ‘iptables-rules.sh’라는 bash 스크립트 파일에서 작업하는데, 이는 모든 것을 정리하고 주석을 달 수 있게 해줍니다. 실수를 하면, 모든 규칙을 플러시하고 싶다면 걱정할 필요 없이 bash 스크립트로 돌아가서 다시 편집하고 저장한 후 스크립트를 실행하면 됩니다 (그러나 이는 시작 시 실행되지 않습니다… 이는 다음 섹션에서 다룰 것입니다).

이 서버에 원격으로 ssh를 통해 작업하고 있다면, 자신을 잠그지 않도록 모든 노력을 기울이는 것이 매우 중요합니다. 따라서 우리의 첫 번째 규칙은 어떤 경우에도 제 IP 주소에서 ssh에 여전히 접근할 수 있도록 하는 것입니다.

# iptables -A INPUT -s 192.168.1.10 -d 10.1.15.1 -p tcp –dport 22 -j ACCEPT

이제 이를 분해해 보겠습니다:

  • -A => iptables에 이 규칙을 INPUT 체인에 ‘추가‘하라고 지시합니다.

  • -s => 출발지 주소. 이 규칙은 이 IP에서 오는 트래픽에만 해당합니다. SSH를 사용하는 IP 주소로 대체하십시오.

  • -d => 목적지 주소. 이 규칙은 이 IP로 가는 트래픽에만 해당합니다. 이 서버의 IP로 대체하십시오.

  • -p => 프로토콜. TCP 트래픽을 지정합니다.

  • –dport => 목적지 포트. TCP 포트 22 (SSH)에 대한 트래픽을 지정합니다.

  • -j => 점프. 이 규칙의 모든 것이 일치하면 ‘ACCEPT’로 점프합니다.

다음으로, 일반 네트워크 트래픽에 대한 표준 규칙을 사용하고 싶습니다. 이는 기본적인 내용을 넘어서는 것이지만, iptables는 패킷이 있는 ‘상태‘를 결정할 수 있습니다. 이는 표준 TCP 통신과 관련이 있습니다. 예를 들어, 두 호스트 간의 데이터 전송 시 3방향 핸드셰이크입니다.

  • NEW => Server1이 Server2에 SYN (Synchronize) 패킷을 발송합니다.

  • RELATED => Server 2가 SYN 패킷을 수신하고, SYN-ACK (Synchronize Acknowledgment) 패킷으로 응답합니다.

  • ESTABLISHED => Server 1이 SYN-ACK 패킷을 수신하고, 마지막 ACK (Acknowledgment) 패킷으로 응답합니다.

이 3방향 핸드셰이크가 완료되면, 트래픽은 이제 ESTABLISHED 상태가 됩니다. 이 유형의 TCP 통신을 위해서는 다음과 같은 세 가지 규칙이 필요합니다:

# iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

마지막 규칙은 서버를 떠나는 모든 트래픽을 허용합니다.

이제 기본 설정이 완료되었으니, iptables가 우리의 규칙 세트를 어떻게 나열하는지 봅시다:

# iptables –list

*Chain INPUT (policy ACCEPT)
target prot opt source destination

ACCEPT tcp – 192.168.1.10 10.1.15.1 tcp dpt:ssh
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all – anywhere anywhere state NEW,RELATED,ESTABLISHED*

여기에서 원하는 규칙을 추가할 수 있습니다. 기본 웹 서버를 실행 중이라면, 아마도 다음과 비슷한 것이 필요할 것입니다:

개별 거부 규칙 먼저:


나쁜 사람들 (소스 IP 주소 차단):

# iptables -A INPUT -s 172.34.5.8 -j DROP

스팸 발송자 차단 (FQDN 사용에 주목):

# iptables -A INPUT -s mail.spammer.org -d 10.1.15.1 -p tcp –dport 25 -j REJECT


그런 다음 열어줍니다: ———————————————————————–
MYSQL (특정 IP에 대한 원격 접근 허용):

SSH:

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 22 -j ACCEPT

Sendmail/Postfix:

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 25 -j ACCEPT

FTP: (20-21 포트 범위를 지정할 수 있는 방법에 주목):

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 20:21 -j ACCEPT

수동 FTP 포트일 수 있음: (하나의 규칙에서 50000에서 50050까지의 포트를 지정):

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 50000:50050 -j ACCEPT

HTTP/Apache

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 80 -j ACCEPT

SSL/Apache

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 443 -j ACCEPT

IMAP

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 143 -j ACCEPT

IMAPS

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 993 -j ACCEPT

POP3

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 110 -j ACCEPT

POP3S

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 995 -j ACCEPT

로컬호스트에서 오는 모든 트래픽:

# iptables -A INPUT -d 10.1.15.1 -s 127.0.0.1 -j ACCEPT

ICMP/Ping:

# iptables -A INPUT -d 10.1.15.1 -p icmp -j ACCEPT


전역 거부 규칙 마지막:

해당 IP로 오는 모든 것을 거부:

# iptables -A INPUT -d 10.1.15.1 -j REJECT

또는 모든 IP로 오는 모든 것을 거부:

# iptables -A INPUT -j REJECT


전역 REJECT 규칙을 마지막에 두는 것을 주목하세요! 이들은 마지막이어야 합니다.

규칙 세트 저장

init 스크립트를 사용하면 규칙 세트를 저장하는 것이 매우 쉽습니다. 구성에 만족하면 다음 중 하나를 수행하십시오:

Debian 방식

구식 init 스크립트는 기본적으로 Sarge에 더 이상 포함되어 있지 않지만, 레거시 사용을 위해 여전히 존재합니다. 새로운 방법은 ‘/etc/network/if-up.d’와 ‘/etc/network/if-down.d’를 iptables 스크립트에 사용하는 것이라고 생각합니다 (하지만 저는 그걸 좋아하지 않습니다).

레거시 INIT 스크립트를 다음과 같이 가져올 수 있습니다:

# gunzip /usr/share/doc/iptables/examples/oldinitdscript.gz -c > /etc/init.d/iptables

이제 스크립트가 준비되었으니 필요한 작업을 수행할 수 있습니다.

활성 규칙

활성 규칙은 iptables를 시작할 때 로드되는 규칙입니다:

# /etc/init.d/iptables save active

iptables 규칙 세트 저장: 카운터와 함께 “활성” 저장.

이것은 /var/lib/iptables/active에 규칙을 저장합니다.

비활성 규칙

iptables를 중지할 때 사용할 비활성 규칙 세트를 구성할 수도 있습니다. iptables는 실제로 “중지“되지 않고, 단지 현재 있는 규칙 세트를 플러시한 다음 ‘비활성’ 규칙을 로드합니다.

# /etc/init.d/iptables stop

iptables 규칙 세트 로드: “비활성” 로드

따라서 ‘비활성’ 규칙을 설정한 다음 다음과 같이 저장할 수 있습니다:

# /etc/init.d/iptables save inactive

iptables 규칙 세트 저장: 카운터와 함께 “비활성” 저장.

RedHat 방식

RedHat INIT 스크립트는 매우 유사합니다. 이를 사용하여 iptables를 시작하고 중지할 수 있으며, 규칙 세트를 저장할 수 있습니다.

활성 규칙을 저장하려면 다음을 실행하십시오:

# /etc/init.d/iptables save

이것은 규칙을 ‘/etc/sysconfig/iptables’에 저장합니다.

iptables를 시작할 때 규칙은 ‘/etc/sysconfig/iptables’에서 읽혀집니다:

# /etc/init.d/iptables start

iptables 시작 [OK]

iptables를 중지할 때 모든 규칙이 플러시됩니다:

# /etc/init.d/iptables stop

iptables 중지 [OK]

수동 저장 및 복원

iptables-save 및 iptables-restore 유틸리티를 수동으로 사용할 수도 있습니다:

규칙을 파일에 저장

# iptables-save > /root/iptables-save.out

규칙 복원

# iptables-restore -c /root/iptables-save.out

-c는 iptables-restore에 이 파일이 iptables-save를 사용하여 생성되었음을 알려줍니다. 이는 규칙을 “카운터”로 출력합니다.

결론

이제 기본적인 iptables에 대해 알게 되었습니다. iptables의 용도는 너무 많아서 진정으로 어떻게 사용하는지에 대한 방법을 시작하기조차 어렵습니다. 그러나 기본적인 보안 및 IPTables에 대한 이해를 위해 이 문서가 도움이 되었기를 바랍니다. 추가할 내용이 있다면 언제든지 이메일을 보내주세요.


BJ Dierkes, RHCE4-LPIC1
wdierkes [at] 5dollarwhitebox [dot] org
텍사스, 미국

자료

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.