네트워크 공부 & 실습/네트워크 실습

[Network] iptables 설정 완전 정리

강_토발즈 2025. 11. 6. 21:13

리눅스 서버를 운영하다 보면, 불필요한 접근을 차단하고 필요한 서비스만 열어두기 위해 방화벽 설정이 필수적이다.
Ubuntu 22.04 기준으로 iptables를 이용한 방화벽 설정 전반을 정리해보았다.
이 글은 단순 명령어 나열이 아니라, 실제로 SSH 세션이 끊기지 않도록 조심스럽게 설정하는 과정을 중심으로 설명한다.

 

1. iptables 개념

iptables는 리눅스 커널의 netfilter 모듈을 제어하는 명령어 도구이다. 패킷이 시스템에 들어오고 나가는 과정에서 어떤 처리를 할지를 정의할 수 있다. 주요 체인은 다음과 같다.

체인 역할
INPUT 외부 → 서버로 들어오는 패킷
OUTPUT 서버 → 외부로 나가는 패킷
FORWARD 서버를 경유하는 패킷(라우터 역할일 때 사용)

기본 정책(policy)은 ACCEPT 또는 DROP으로 지정한다.
ACCEPT는 허용, DROP은 차단을 의미한다.

 

2. 기존 규칙 초기화

이전 설정을 모두 제거하고 처음부터 새로 시작할 때는 다음과 같이 한다.

* root 사용자로 전환하여 실시할 경우 sudo 를 매번 붙이지 않아도 된다.

sudo iptables -F 
sudo iptables -X 
sudo iptables -Z

 

이 명령은 체인을 초기화하고 카운터를 0으로 만든다.
아직 정책을 바꾸지 않았으므로 기존 연결은 유지된다.

 

 

3. SSH 세션이 끊기지 않게 기본 규칙 추가

원격으로 접속 중이라면 SSH 세션이 끊기면 복구가 어렵다.
따라서 기본적인 세 가지 규칙을 먼저 추가해야 한다.

# 루프백 허용
sudo iptables -A INPUT -i lo -j ACCEPT

# 기존 연결 유지 (ESTABLISHED, RELATED 상태)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH 포트(예: 9694) 허용
sudo iptables -A INPUT -p tcp --dport 9694 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

 

이 규칙이 있어야 기존 접속도 유지되고 새로운 SSH 접속도 허용된다.

기존 연결을 유지하지 않고 정책을 적용하게 되면 후속 작업을 못하게 되는 재앙이 발생하게 된다. 

 

4. IPv6에서도 동일하게 적용

IPv4만 설정하면, IPv6로 접속을 시도할 경우 차단될 수 있다.
Ubuntu는 기본적으로 IPv6가 활성화되어 있으므로, ip6tables에도 동일한 규칙을 넣어야 한다.

 

sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 9694 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

 

 

5. 특정 IP 또는 대역만 허용하기

SSH, ICMP, SNMP 등을 특정 장비만 접근하도록 제한하려면 -s 옵션을 사용한다.
낱개 IP는 그대로 써도 되고 /32를 붙여도 된다. 두 형태는 동일하다.

# 단일 IP 허용
sudo iptables -A INPUT -p icmp -s 192.168.10.5 -j ACCEPT

# SNMP (UDP 161,162)
sudo iptables -A INPUT -p udp --dport 161 -s 192.168.10.5 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 162 -s 192.168.10.5 -j ACCEPT

# 대역 허용
sudo iptables -A INPUT -s 192.168.20.0/24 -j ACCEPT

 

6. 나머지 트래픽 차단하기

 

모든 필요한 규칙을 추가한 뒤, 기본 정책을 DROP으로 바꾼다.

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

 

이제 명시적으로 허용하지 않은 모든 패킷은 차단된다.
기본 OUTPUT은 ACCEPT로 두면 서버에서 외부로 나가는 통신은 자유롭다.3

 

7. 왜 SNMP, ICMP가 차단되지 않았는가

 

INPUT 정책을 DROP으로 바꾼 뒤에도, 서버에서 외부 장비로 SNMP 요청을 보냈을 때 응답이 들어오는 경우가 있다.
이유는 ESTABLISHED,RELATED 규칙 덕분이다.

서버가 먼저 SNMP 요청(UDP 161)을 보내면, 장비의 응답 패킷은 연결 추적(conntrack) 모듈에 의해 “기존 연결의 응답”으로 인식된다.
따라서 INPUT 정책이 DROP이라도, 응답은 정상적으로 통과된다.
이 덕분에 보안성과 수집 기능을 동시에 유지할 수 있다.

 

8. 확인 및 점검

현재 적용된 규칙을 확인할 때는 다음 명령을 사용한다.

 

sudo iptables -L -n --line-numbers
sudo ip6tables -L -n --line-numbers