iptables 기본 개념 정리

출처: http://blog.naver.com/alice_k106/221305928714


■ iptables 개념 : 테이블과 체인

iptables에는 테이블(Table)과 체인(Chain) 이라는 큰 분류가 있으며, 그 안에 규칙을 정의해 패킷의 흐름을 제어한다. 테이블은 iptables의 규칙을 정의할 수 있는 가장 광범위한 범주로, 아래의 4가지 종류가 있다. 1

filter
nat
mangle
raw

이 중에서 filter는 단어가 의미하는 뜻 그대로 패킷을 걸러내는 용도이며, Inbound(호스트로 들어오는 패킷) / Outbound(호스트에서 밖으로 나가는 패킷) 및 Forward(호스트를 거쳐가는 패킷) 총 3가지 종류의 패킷을 어떻게 처리할 것인지에 대한 규칙을 정의할 수 있다. 그렇지만 filter 테이블의 규칙은 ufw나 firewall-cmd 의 기초적인 명령어로도 아주 쉽게 설정할 수 있을 뿐만 아니라, 매우 직관적인 기능이기 때문에 굳이 다루지 않기로 했다. mangle과 raw는 자주 사용하지 않는 테이블이므로 본 포스트의 설명에서 제외하였다.

nat는 패킷의 속성인 출발 주소(source), 도착 주소(destination) 등을 변경할 수 있도록 각종 규칙을 정의하는 테이블이다. 라우터(공유기) 등에서 사용하는 주소 변환(nat)와 동일하지만, iptables의 nat는 이에 그치지 않고 다양한 상황에 범용적으로 적용해 사용할 수 있다. nat 테이블의 자세한 Use Case는 뒤에서 설명할 것이다.

iptables에는 테이블의 하위 규칙 속성으로서 체인(Chain) 이라는 것이 존재한다. nat에는 아래의 체인을 사용해 규칙을 정의할 수 있다.

PREROUTING (DNAT) : 패킷의 도착지(deatination) 주소를 변경한다. D(estination)NAT

POSTROUTING (SNAT 또는 masquerade) : 패킷의 출발지(source) 주소를 변경한다. S(ource)NAT

OUTPUT : 호스트에서 밖으로 흐르는 패킷의 도착지(destination) 주소를 변경한다. (INPUT도 있다)

간단하게 그림으로 설명하면 아래와 같다.

1.jpg





사용자는 1.2.3.4:85로 서비스 요청 패킷을 전송한다. 그런데 라우터의 역할을 하는 서버 A(1.2.3.4) 에는 1.2.3.4:85로 들어온 패킷의 목적지를 5.6.7.8:80 으로 변환하라는  PREROUTING 규칙이 있기 때문에 패킷의 실제 도착지는 서버 B(5.6.7.8)의 웹서비스인 80 포트가 된다.

2.jpg


서비스 요청을 했으니 당연히 이에 대한 응답이 전송되어야 한다. 그런데 서버 B가 전송하는 응답 패킷의 출발지(Source)는 5.6.7.8이고, 외부 사용자가 ACK를 정상적으로 받기 위해서는 Source가 다시 1.2.3.4으로 변경되어야 한다. POSTROUTING인 SNAT 룰은 응답 패킷의 Source를 변경해 사용자에게 전달할 수 있다. 3


INPUT / OUTPUT 체인도 존재하지만, 나는 OUTPUT 체인만 사용해 보았다. OUTPUT 체인은 호스트가 주체가 되어 밖으로 나가는 패킷의 목적지를 다르게 할 때 사용된다. 예를 들어, curl 5.6.7.8로 요청을 해도, 실제로는 9.10.11.12로 트래픽이 흐르도록 설정할 수 있다.


■ iptables 옵션
iptables [-t table] command [match] [target\jump]

-A(--append)            : 규칙 추가
-N(--new-chain)         : 새로운 체인 생성
-X(--delete-chain)      : 체인 제거
-P(--policy)            : 체인 기본정책 변경
-L(--list)              : 체인의 규칙상태 보기
-F(--flush)             : 체인내의 모든 규칙 제거(방화벽 초기화)
-Z(--zero)              : 체인내의 모든 규칙의 패킷과 바이트의 카운트를 0으로 초기화
-D(--delete)            : 규칙 삭제
-R(--replace)           : 새로운 규칙으로 대체
-I(--insert)            : 체인 가장 처음에 규칙 추가
-E(--rename-chain)      : 체인 이름을변경
위로 스크롤