본문 바로가기
Server/Ubuntu

A Deep Dive into Iptables and Netfilter Architecture

by 유주원 2021. 12. 1.

Iptables과 Netfilter에 대한 이해를 위해 아래의 url을 번역했다.

 

https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture

 

A Deep Dive into Iptables and Netfilter Architecture | DigitalOcean

Firewalls are an important tool that can be configured to protect your servers and infrastructure. In the Linux ecosystem, iptables is a widely used firewall tool that interfaces with the kernel's netfilter packet filtering framework. For users and ad

www.digitalocean.com

 

A Deep Dive into Iptables and Netfilter Architecture

소개

방화벽은 server와 infrastructure를 보호할 수 있는 중요한 도구이며, 리눅스 에코시스템에서는 iptables이 커널의 netfilter packet filtering framework와 함께 방화벽 도구로 사용이 된다. 이런 구조에 대해 잘 모르는 사용자들은 신뢰할만한 방화벽 정책을 만드는 것에 대해 어려움을 느낄 수가 있다.

이 가이드에서는 우리는 iptables이 netfilter와 어떻게 상호작용하는지와 다양한 컴포넌트들이 어떻게 함께 동작되어 filtering 시스템을 만드는지를 학습할 것이다.

 

Iptables와 netFilter는 무엇인가?

리눅스에서 기본 방화벽 소프트웨어는 주로 iptables를 사용한다. iptables 방화벽은 리눅스 커널의 네트워크 스택에서의 packet filtering hooks와 함께 상호작용한다. 이 커널 훅을 netfilter framework라고 한다.

네트워크 시스템으로 패킷이 진입(incoming, outgoing)하게 되고 이러한 패킷들은 훅에 등록된 프로그램에 의해 상호작용될 것이다. iptables에서는 방화벽 룰에 의한 트래픽을 보장하기 위해 이러한 훅들을 등록한다.

 

NetFilter Hooks

5개의 netfilter 훅들이 등록될 수 있다. 패킷들은 이러한 훅들이 등록된 커널 모듈에 트리거 될 것이다. 패킷이 incoming인지 outgoing인지에 따라, 패킷의 목적지, 패킷이 이전 지점에서 drop 혹은 reject 되었는지에 따라 훅들은 패킷들을 적절히 트리거 할 것이다.

네트워크 스택에서는 다음의 훅들이 정의된다.

NF_IP_PRE_ROUTING : 네트워크 스택에 진입한 이후 incoming 트래픽에 의해 트리거된다. 라우팅이 결정되기 전에 훅이 처리한다.

NF_IP_LOCAL_IN : 만약 패킷이 로컬시스템을 목적지로 한다면, incoming 패킷은 라우팅 된 후에 이 훅에 의해 트리거 된다.

NF_IP_FORWARD : 만약 패킷이 다른 호스트로 향한다면, incoming 패킷이 라우팅 된 후에 이 훅에 의해 트리거 된다.

NF_IP_LOCAL_OUT : 네트워크 스택에 진입된 후 로컬에서 생성된 outbound 트래픽에 의해 트리거 된다.

NF_IP_POST_ROUTING : 라우팅 되고, 실제 패킷이 바깥으로 나가기 전에 outgoing 혹은 forward 트래픽에 의해 트리거 된다.

 

이러한 훅들은 반드시 우선 순위를 제공해야 한다. 각각의 모듈은 우선 순위에 의해 호출되고 패킷을 처리한 후에 netfilter framework에 리턴 된다.

 

IPTables Tables and Chains

Iptables 방화벽은 룰을 구성하기 위해 table을 사용한다. 이 table은 사용 방법에 따라 규칙이 구분된다. 예를 들어, 만약 룰이 network 주소 변환을 다룬다면, 이 룰은 nat table 상에 놓여질 것이다. 만약 룰이 packet의 진행을 결정하는 것이라면, 이 룰은 filter table에 위치할 것이다.

각각의 iptable table 내에서 룰들은 chains으로 조직화된다. 

아래 5개의 built-in chains이 있으며 해당 chain은 각각의 netfilter hooks에 의해 호출된다.

PREROUTING : NF_IP_PRE_ROUTING 훅에 의해 트리거 된다.

INPUT : NF_IP_LOCAL_IN 훅에 의해 트리거 된다.

FORWARD : NF_IP_FORWARD 훅에 의해 트리거 된다.

OUTPUT : NF_IP_LOCAL_OUT 훅에 의해 트리거 된다.

POSTROUTING : NF_IP_POST_ROUTING 훅에 의해 트리거 된다.

 

chains은 패킷의 전달 여부를 제어할 수 있다. 또한 각 테이블에는 여러 체인이 있기 때문에, 하나의 패킷이 처리되는 동안 여러 지점에서 테이블의 영향을 받을 수가 있다.

5개의 netfilter 커널 훅은 여러 테이블의 체인을 등록한다. 예를 들어 3개의 테이블이 PREROUTING 체인을 가지고 있다고 하자. 이 체인이 NF_IP_PREROUTING 훅에 등록이 되면, 해당 체인들은 PREROUTING 체인이 호출되어야 할 우선순위를 명시한다. 해당 우선 순위는 다음 PREROUTING 체인으로 이동하기 전의 순서를 결정한다.

 

Which Tables are Available?

iptables가 제공하는 다양한 tables을 살펴보자.

The Filter Table

- 패킷이 의도한 목적지로 계속 갈 것인지 아니면 요청을 거부할 것인지를 결정한다.

 

The NAT Table

- 네트워크 주소 변환 규칙을 구현하는데 사용된다. 패킷이 네트워크 스택에 들어갈 때 룰은 패킷의 출발지 혹은 목적지 주소를 어떻게 수정할지를 결정한다.

 

The Mangle Table

- 패킷의 ip header를 변경할 때 사용한다. 예를 들어 패킷의 TTL을 조정하여 패킷의 수명을 늘리거나 줄인다.

 

The Raw Table

- iptable 방화벽은 이전 패킷과 관련해서 패킷이 평가된다. connection tracking은 iptables가 패킷을 진행중인 연결의 일부로 판단한다. raw table은 connection tracking을 막기 위해 사용된다.

 

The Security Table

- 패킷에 내부 internal SELinux 보안 context를 마킹하는데 사용한다. SELinux 또는 SELinux 보안 context를 해석하는 다른 시스템이 패킷을 처리하는 방식에 영향을 미칠 수 있다.

 

Which Chains are Implemented in Each Table?

세 개의 테이블에 PREROUTING chain이 있는 경우 어떤 순서로 처리가 될까?

아래의 표처럼 위에서 아래의 순서로 처리가 된다.

Chain Traversal Order

방화벽 규칙이 패킷 전송을 허용한다고 가정하면, 다음의 흐름은 다양한 상황을 보여 준다.

Incoming packets destined for the local system : PREROUTING -> INPUT

Incoming packets destined to another host : PREROUTING -> FORWARD -> POSTROUTING

Locally generated packets : OUTPUT -> POSTROUTING

 

위의 정보와 표를 결합해보면,

로컬 시스템을 목적지로 향하는 incoming 패킷은 먼저 raw, mangle 및 nat 테이블의 PREROUTING 체인에 의해 평가 된다. 그 후 mangle, filter, security 및 nat table의 INPUT chain을 통과한다.

 

IPTables Rules

룰은 특정 테이블의 특정 체인 내에 위치한다. 각 체인이 호출되면 해당 패킷은 체인 내의 각 룰에 대해 순서대로 처리된다. 각 룰에는 matching component와 action component가 존재한다.

 

Matching

- 룰의 matching portion은 관련 액션 또는 대상이 실행되기 위해 패킷이 반드시 충족되어야만 하는 기준을 명시한다. matching system은 매우 유연하고 iptables의 확장이 가능하다. 룰은 프로토콜 타입, destination 또는 source 주소, 포트, 네트워크, input or output 인터페이스, 헤더, 연결 상태에 의해 매칭될 수 있도록 구성된다. 다른 트래픽과 구분짓기 위해 rule set을 생성할 수도 있다.

 

Target

- 타겟은 패킷이 룰과 matching될 때 트리거 되는 액션을 말한다. 타겟은 일반적으로 두 개로 분류된다.

Terminating targets : 체인 내에서 평가를 종료하고, netfilter 훅에 제어를 반환하는 작업을 수행한다. 반환 값에 따라 훅은 패킷을 삭제하거나 다음 단계로 허용할 수 있다.

Non-terminating targets : 체인 내에서 평가를 계속 수행한다.

 

Jumping to User-Defined Chains

non-terminating target의 특별 케이스에 대해 언급한다. jump target이다. jump target은 추가적인 처리를 위해 다른 체인으로 이동하는 것을 말한다.

룰은 기본적으로 제공된 체인과 동일한 방식으로 사용자 정의에 의한 체인을 배치할 수도 있다. 차이점은 사용자 정의 체인은 규칙에서 "jump"를 통해서만 도달 할 수가 있다. (사용자 정의 체인은 netfilter 훅에 등록이 되지 않는다.)

사용자 정의 체인은 단순한 체인의 확장 역할을 한다. 예를 들어, 사용자 정의 체인에서 룰 목록의 끝에 도착하거나 매칭룰에 의해 return target이 활성화된다면, 호출한 체인으로 다시 리턴된다.

이러한 구성은 더 크고 강인한 프레임워크의 제공을 가능하게 해 준다.

 

IPTables and Connection Tracking

이전에 connection tracking system에 대해 언급한 적이 있다. connection trackig을 통해 iptables는 진행중인 연결 context 내에서의 패킷에 대한 결정이 가능하다. connection tracking system은 stateful 기능을 수행하도록 필요한 기능을 iptables에 제공한다.

패킷이 네트워크 스택에 진입한 이후 connection tracking 이 적용된다. raw table chain과 몇 가지 기본 온전성 체크는 패킷이 connection 되기 전에 수행되는 유일한 로직이다. 시스템은 connection 집합에 대해 각 패킷을 확인한다. 필요한 경우 저장소의 연결 상태를 업데이트 하고 새로운 연결을 추가한다. raw chains 중 하나에서 NOTRACK target이 마크된 패킷은 connection tracking 루틴을 우회한다.

 

Available States

connection tracking system이 추적하는 연결은 다음의 상태 중 하나이다.

NEW : 기존 연결과 관련되어 있지는 않지만 첫 번째 패킷으로 유효한 패킷이 들어오게 되면, 새로운 연결을 추가한다. TCP, UDP 모두에서 발생한다.

ESTABLISHED : 유효한 응답을 받았을때 NEW -> ESTABLISHED로 변한다. TCP의 경우 SYN/ACK, UDP와 ICMP의 경우 원본 패킷의 소스와 목적지가 스위칭 되는 것을 의미한다.

RELATED : 해당 패킷이 기존 연결의 일부는 아니지만 이미 시스템에 연결되어 있다면 RELATED로 레이블된다. FTP의 helper connection 또는 다른 프로토콜에 대한 ICMP 응답을 의미한다.

INVALID : 존재하는 연결과 관련이 없고, 새로운 연결을 여는게 부적합하다면 INVALID로 표시된다. 

UNTRACKED : raw table chain에서 bypass tracking으로 타겟된 경우 UNTRACKED로 표시된다.

SNAT : NAT 작업에 의해 소스 주소가 변경되었을 때 설정된다. 응답 패킷에서 소스 주소를 다시 변경하기 위해 connection tracking system에서 사용된다.

DNAT : NAT 작업에 의해 목적지 주소가 변경되었을 때 설정된다. 라우팅 응답 패킷에서 목적지 주소를 변경하기 위해 connection tracking system에서 사용된다.

connection tracking system에서의 상태 추적을 통해 connection 생명주기의 특정 지점을 대상으로 룰을 생성할 수 있다. 이는 보다 철저하고 안전한 규칙을 제공 해 준다.

 

Conclusion

netfilter 패킷 필터링 프레임워크와 Iptables 방화벽은 linux 서버의 방화벽 솔루션의 기본이다. netfilter 커널 훅은 시스템에서 처리되는 패킷을 강력하게 제어할 수가 있다.