JangBaGeum.gif

[Linux] iptables 의 구조 및 사용 방법 본문

Backend/OS

[Linux] iptables 의 구조 및 사용 방법

장바금 2025. 6. 4. 01:41

홈서버를 구축하면서 가장 고민이 많았던 부분 중 하나는 네트워크 구성이었다.

현재 거주하고 있는 건물은 개별 공인 IP를 제공하지 않는 구조였기 때문에, 홈서버를 외부에 직접 노출시키는 것이 사실상 불가능했다. 따라서 외부에서 홈서버에 접근하려면 네트워크를 우회할 수 있는 방법이 필요했다.

이 문제를 해결하기 위해 클라우드 컴퓨팅 서비스의 VM을 중간에 두고 네트워크 터널링을 구성했다. 홈서버와 클라우드 VM 사이에 WireGuard 기반의 VPN 터널을 구축한 뒤, 외부 요청은 VM이 받고 이를 홈서버로 전달하는 방식으로 설계했다.

이 과정에서 중요한 역할을 한 것이 바로 iptables를 이용한 포트포워딩 규칙 설정 있다. 클라우드 VM에서 특정 포트로 들어오는 트래픽을 VPN을 통해 홈서버의 내부 IP로 전달하도록 설정함으로써, 공인 IP 없이도 외부에서 안전하게 홈서버로 접근할 수 있었다.

이번 포스팅에서는 이 iptables 기반 포트포워딩 설정에 대해 간단히 소개하려고 한다.

 


 

https://ko.wikipedia.org/wiki/%EB%B0%A9%ED%99%94%EB%B2%BD_%28%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9%29

 

 iptables란? 

 iptables는 리눅스에서 패킷 필터링과 네트워크 트래픽제어를 담당하는 명령어 도구이다.

방화벽 기능을 제공하며, 들어오는(incoming), 나가는(outgoing), 포워딩(forwarding)되는 패킷을 원하는 데로 필터링할 수 있도록 도와준다.

 리눅스 서버를 운영하다 보면 보안이 중요한 시점이 필수적으로 올 수 있다 생각된다. 웹 서버는 외부 HTTP만 받고 DB는 내부 통신만 허용하고 싶다거나, 특정 IP에서만 SSH 접속을 허용하고 싶을 때 iptables를 사용하면 유연한 설정을 할 수 있다.

 

 iptables 사용되는 경우 

서버 운영 시 iptables를 사용하는 주요 목적은 다음과 같다.

- 접근 체어: 특정 포트/프로토콜에 대한 접근 허용/차단

- 보안 강화: SSH brute force 공격 차단, 포트 스캐닝 탐지

- 트래픽 제한: Dos 방지를 위한 rate limiting

- 네트워크 주소 변환(NAT): 내부망에서 외부망으로 접속 시 IP 변경

 

 iptables의 구조 

iptables는 체인(chain), 테이블(table), 규칙(rule)으로 구성된다.

테이블 (Table)

iptables에는 여러 가지 테이블이 있지만 일반적으로 아래 3가지를 많이 사용한다.

- filter: 기본 테이블, 패킷 필터링 용도

- nat: 주소 변환(Network Address Translation) 용도

- mangle: 패킷을 수정할 때 사용

 

체인 (Chain)

테이블 안에는 여러 체인이 존재하며, 흐름에 따라 패킷이 체인을 통과한다.

- INPUT: 로컬 시스템으로 들어오는 패킷

- OUTPUT: 로컬 시스템에서 나가는 패킷

- FORWARD: 라우팅 되는 패킷 (로컬에서 처리하지 않고 통과하는 경우)

 

정책과 규칙 (Policy & Rules)

각 체인에는 기본 정책이 있으며, 사용자 정의 규칙을 추가해서 동작을 변경할 수 있다.

 

 기본 사용법 

1. 현재 설정 보기

$ sudo iptables -L -n -v

"-L": 규 리스트 출력

"-n": IP를 숫자로 출력 (DNS 조회 방지)

"-v": 상세 정보 출

 

출력 예시

Chain INPUT (policy DROP 123 packets, 10456 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   10   800 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
  100 8500 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
   20  1600 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 200 packets, 15000 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT: 들어오는 패킷에 대한 설정

- 기본 정책: DROP (허용되지 않은 패킷은 차단)

- lo 인터페이스(루프백)는 모두 용

- TCP 22번 포트(SSH)는 모두 허용

- TCP 80번 포트(HTTP)는 모두 허용

 

Chain FORWARD: 라우팅 되는 패킷에 대한 설정 (예시에는 없음)

 

Chain OUTPUT: 나가는 패킷에 대한 설정

- 기본 정책: ACCEPT (모두 허용)

 

기타 참고 내용

- pkts, bytes: 각 룰에 의해 처리된 패킷 수와 바이트 수를 나타냄. 실시간 트래픽 확인에 유용

- policy: 각 체인의 기본 동작을 보여줌 (e.g. DROP, ACCEPT 등)

- target: 해당 룰의 동작 (e.g. DROP, ACCEPT 등)

- dpt: destination port (목적지 포트)

 

2. 규칙 추가

특정 포트를 허용 (e.g. 80번 HTTP 포트)

$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

 

특정 IP만 SSH 접속 허용

$ sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.10 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 22 -j DROP

 

3. 기본 정책 설정 (디폴트 정책 거부)

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

 

4. 규칙 삭제

$ sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT

 

5. 모든 규칙 초기화

$ sudo iptables -F

 

 규칙 저장 및 복원 

리눅스는 재부팅하면 iptables 설정이 초기화된다.

Ubuntu 기반 시스템용 ufw 등의 iptables 프런트 엔드는 자동으로 규칙을 저장하며 재부팅 후에도 설정이 유지된다.

그러나 iptables는 초기화되기 때문에 저장 및 복구를 위한 별도의 세팅을 해줘야 한다.

 

Ubuntu (iptables-persistent 패키지 사용)

수동으로 설정파일 백업 후 부팅 시 로드하는 방식으로 설정이 가능하나 가장 흔하게 iptables-persistent 패키지를 이용하여 저장 및 복구를 하는 듯하다.

$ sudo apt install iptables-persistent
$ sudo netfilter-persistent save
$ sudo netfilter-persistent reload

 

 


 

iptables는 처음 보면 다소 어렵게 느껴질 수 있지만, 원리를 이해하고 자주 쓰이는 패턴만 익혀두면 강력하고 유연한 네트워크 제어 도구가 될 것 같다. 간단한 방화벽 설정은 firewalld, 혹은 ufw와 같이 편리한 툴을 사용하면 되지만 좀 더 유연한 네트워크 세팅이 필요하다면 iptables는 무조건 접할 일이 있을 것 같다. 이러하여 리눅스 서버를 운영한다면 반드시 알아두어야 하는 부분이지 않을까 싶다.

 

참고

https://ko.wikipedia.org/wiki/Iptables

'Backend > OS' 카테고리의 다른 글

[Linux] Supervisor log rotation  (2) 2022.11.21
[Linux] vi(vim) 에디터 단축키  (0) 2022.11.21