Iptables와 Netfilter 아키텍처에 대한 깊은 탐구

소개

방화벽은 서버와 인프라를 보호하기 위해 구성할 수 있는 중요한 도구입니다. Linux 생태계에서는 iptables가 커널의 netfilter 패킷 필터링 프레임워크와 함께 널리 사용되는 방화벽 도구입니다. 신뢰할 수 있는 방화벽 정책을 만드는 것은 복잡한 구문과 관련된 다양한 구성 요소들의 수가 많기 때문에 어려울 수 있습니다.

이 가이드에서는 iptables 아키텍처에 대해 자세히 알아보고자 합니다. 이는 자체 방화벽 정책을 구축해야 하는 사용자들이 이해하기 쉽도록 돕기 위한 것입니다. iptablesnetfilter와 상호 작용하며 다양한 구성 요소들이 어떻게 함께 작동하여 포괄적인 필터링 시스템을 제공하는지에 대해 논의할 것입니다.

IPTables과 Netfilter란 무엇인가요?

많은 해 동안, Linux에서 가장 일반적으로 사용되는 방화벽 소프트웨어는 iptables라고 불렸습니다. 일부 배포판에서는 nftables라는 새로운 도구로 대체되었지만, 여전히 iptables 구문은 기준으로 자주 사용됩니다. iptables 방화벽은 Linux 커널의 네트워킹 스택의 패킷 필터링 훅과 상호작용하여 작동합니다. 이러한 커널 훅은 netfilter 프레임워크로 알려져 있습니다.

네트워킹 레이어를 통과하는 모든 패킷(들어오는 또는 나가는)은 이러한 훅을 트리거하며, 프로그램은 트래픽을 주요 포인트에서 상호작용할 수 있습니다. iptables와 관련된 커널 모듈은 방화벽 규칙에서 제시된 조건을 트래픽이 준수하도록 보장하기 위해 이러한 훅에 등록됩니다.

Netfilter 훅

프로그램은 등록할 수 있는 다섯 가지 netfilter 훅이 있습니다. 패킷이 스택을 통과함에 따라, 이러한 훅에 등록된 커널 모듈이 트리거됩니다. 패킷이 트리거하는 훅은 패킷의 들어오는 또는 나가는 여부, 패킷의 대상 및 이전 지점에서 드랍되거나 거부된 여부에 따라 달라집니다.

다음 훅은 네트워킹 스택에서 이러한 명확한 포인트를 나타냅니다:

  • NF_IP_PRE_ROUTING: 이 훅은 네트워크 스택에 진입한 후 매우 빠르게 수신 트래픽에 의해 트리거됩니다. 이 훅은 패킷을 어디로 보낼지에 대한 경로 결정이 이루어지기 전에 처리됩니다.
  • NF_IP_LOCAL_IN: 이 훅은 수신된 패킷이 로컬 시스템으로 전송되는 경우 경로 결정 후 트리거됩니다.
  • NF_IP_FORWARD: 이 훅은 수신된 패킷이 다른 호스트로 전달되는 경우 경로 결정 후 트리거됩니다.
  • NF_IP_LOCAL_OUT: 이 훅은 로컬에서 생성된 아웃바운드 트래픽이 네트워크 스택에 도달하는 즉시 트리거됩니다.
  • NF_IP_POST_ROUTING: 이 훅은 라우팅이 완료된 후, 외부로 전송되기 직전에 발생하는 아웃바운드 또는 포워딩된 트래픽에 트리거됩니다.

이 훅에 등록해야하는 커널 모듈은 훅이 트리거될 때 호출될 순서를 결정하기 위해 우선순위 번호를 제공해야 합니다. 이는 여러 모듈(또는 동일한 모듈의 여러 인스턴스)이 각 훅에 결정적인 순서로 연결될 수 있도록 합니다. 각 모듈은 차례대로 호출되고 패킷에 대해 어떻게 처리해야 하는지를 나타내는 결정을 netfilter 프레임워크에 반환합니다.

IPTables 테이블과 체인

iptables 방화벽은 규칙을 구성하기 위해 테이블을 사용합니다. 이러한 테이블은 규칙이 내리는 결정의 유형에 따라 규칙을 분류합니다. 예를 들어, 네트워크 주소 변환과 관련된 규칙은 nat 테이블에 추가됩니다. 패킷이 목적지로 이동할 것인지 여부를 결정하는 규칙은 filter 테이블에 추가될 것입니다.

iptables 테이블 내에서 각각의 규칙은 별도의 “체인” 내에서 더욱 구체적으로 구성됩니다. 테이블은 해당 규칙의 일반적인 목적에 따라 정의되는 반면, 내장된 체인은 이를 트리거하는 netfilter 후크를 나타냅니다. 체인은 규칙이 언제 평가될지를 결정합니다.

내장 체인의 이름은 해당하는 netfilter 후크의 이름과 일치합니다:

  • PREROUTING: NF_IP_PRE_ROUTING 후크에 의해 트리거됩니다.
  • INPUT: NF_IP_LOCAL_IN 후크에 의해 트리거됩니다.
  • FORWARD: NF_IP_FORWARD 후크에 의해 트리거됩니다.
  • OUTPUT: NF_IP_LOCAL_OUT 후크에 의해 트리거됩니다.
  • POSTROUTING: NF_IP_POST_ROUTING 후크에 의해 트리거됩니다.

체인을 사용하면 관리자는 패킷의 전달 경로에서 규칙이 평가되는 위치를 제어할 수 있습니다. 각 테이블에는 여러 개의 체인이 있으므로, 테이블의 영향은 처리 과정의 여러 지점에 영향을 미칠 수 있습니다. 네트워크 스택의 특정 유형의 결정은 특정 지점에서만 의미가 있기 때문에, 모든 테이블이 모든 커널 후크에 등록된 체인을 갖지는 않을 것입니다.

각각 다섯 가지의 “netfilter” 커널 후크만이 존재하며, 따라서 여러 테이블의 체인은 각 후크에 등록됩니다. 예를 들어, 세 개의 테이블에는 “PREROUTING” 체인이 있습니다. 이러한 체인들이 관련된 “NF_IP_PRE_ROUTING” 후크에 등록될 때, 각 테이블의 “PREROUTING” 체인이 호출되는 순서를 지정하는 우선순위를 지정합니다. 가장 높은 우선순위의 “PREROUTING” 체인 내의 각 규칙은 순차적으로 평가되고 다음 “PREROUTING” 체인으로 넘어갑니다. 이 체인들의 특정 순서를 곧 살펴보겠습니다.

사용 가능한 테이블은 어떤 것들이 있을까요?

잠시 돌아가서 “iptables”에서 제공하는 다른 테이블들을 살펴보겠습니다. 이들은 패킷을 평가하기 위해 관심 영역별로 구성된 서로 다른 규칙 세트를 나타냅니다.

필터 테이블

필터 테이블은 “iptables”에서 가장 널리 사용되는 테이블 중 하나입니다. “filter” 테이블은 패킷이 목적지로 계속 진행할지 여부를 결정하거나 요청을 거부할지에 대한 결정을 내립니다. 방화벽 용어로는 이를 패킷 “필터링”이라고 합니다. 이 테이블은 방화벽에 대한 대화에서 사람들이 생각하는 대부분의 기능을 제공합니다.

NAT 테이블

nat 테이블은 네트워크 주소 변환 규칙을 구현하는 데 사용됩니다. 패킷이 네트워크 스택으로 들어오면이 테이블의 규칙에 따라 패킷의 소스 또는 대상 주소를 수정하여 패킷 및 응답 트래픽의 경로에 영향을 줍니다. 직접 액세스가 불가능한 경우 패킷을 네트워크로 라우팅하는 데 자주 사용됩니다.

Mangle 테이블

mangle 테이블은 패킷의 IP 헤더를 다양한 방법으로 변경하는 데 사용됩니다. 예를 들어, 패킷의 TTL (Time to Live) 값을 조정하여 패킷이 지원할 수 있는 유효한 네트워크 홉의 수를 늘리거나 줄일 수 있습니다. 다른 IP 헤더도 유사한 방식으로 변경할 수 있습니다.

이 테이블은 패킷에 대해 내부 커널 “마크”를 지정하여 다른 테이블 및 기타 네트워킹 도구에서 추가 처리 할 수 있습니다. 이 마크는 실제 패킷에 영향을 주지 않고 커널의 패킷 표현에 마크를 추가합니다.

Raw 테이블

iptables 방화벽은 상태를 유지하는 방식으로 작동합니다. 이는 패킷이 이전 패킷과의 관계에 따라 평가된다는 것을 의미합니다. netfilter 프레임워크 위에 구축된 연결 추적 기능은 iptables가 패킷을 연속된 연결 또는 세션의 일부로 볼 수 있도록 해줍니다. 연결 추적 로직은 일반적으로 패킷이 네트워크 인터페이스에 도달하는 즉시 적용됩니다.

raw 테이블은 매우 한정된 기능을 가지고 있습니다. 그 목적은 연결 추적에서 제외하기 위해 패킷에 표시할 수 있는 메커니즘을 제공하는 것입니다.

보안 테이블

security 테이블은 패킷에 내부 SELinux 보안 컨텍스트 마크를 설정하는 데 사용됩니다. 이는 SELinux 또는 SELinux 보안 컨텍스트를 해석할 수 있는 다른 시스템이 패킷을 처리하는 방식에 영향을 줄 것입니다. 이러한 마크는 패킷 단위 또는 연결 단위로 적용할 수 있습니다.

체인과 테이블 간의 관계

만약 세 개의 테이블이 PREROUTING 체인을 가지고 있다면, 어떤 순서로 평가될까요?

다음 표는 왼쪽에서 오른쪽으로 읽을 때 iptables 테이블 내에서 사용 가능한 체인을 나타냅니다. 예를 들어, raw 테이블에는 PREROUTINGOUTPUT 체인이 모두 있음을 알 수 있습니다. 위에서 아래로 읽을 때, 체인이 호출되는 순서도 표시됩니다.

A few things should be noted. In the representation below, the nat table has been split between DNAT operations (those that alter the destination address of a packet) and SNAT operations (those that alter the source address) in order to display their ordering more clearly. We have also include rows that represent points where routing decisions are made and where connection tracking is enabled in order to give a more holistic view of the processes taking place:

Tables↓/Chains→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)
raw
(connection tracking enabled)
mangle
nat (DNAT)
(routing decision)
filter
security
nat (SNAT)

패킷이 netfilter 훅을 트리거하면, 연결된 체인은 위의 표에 나열된 순서대로 처리됩니다. 패킷이 트리거하는 훅(열)은 들어오는 패킷인지 아웃고잉 패킷인지, 라우팅 결정, 그리고 패킷이 필터링 기준을 통과하는지 여부에 따라 다릅니다.

일부 이벤트는 테이블의 체인이 처리 중에 건너뛰어질 수 있습니다. 예를 들어, 연결의 첫 번째 패킷만 NAT 규칙에 대해 평가됩니다. 첫 번째 패킷에 대한 모든 nat 결정은 추가 평가 없이 연결의 모든 후속 패킷에 적용됩니다. NAT된 연결에 대한 응답은 올바르게 라우팅하기 위해 자동으로 반대 방향의 NAT 규칙이 적용됩니다.

체인 탐색 순서

서버가 패킷을 라우팅할 수 있고 방화벽 규칙이 전송을 허용하는 경우, 다음 흐름은 다른 상황에서 탐색되는 경로를 나타냅니다:

  • 로컬 시스템으로 향하는 수신 패킷: PREROUTING -> INPUT
  • 다른 호스트로 향하는 수신 패킷: PREROUTING -> FORWARD -> POSTROUTING
  • 로컬에서 생성된 패킷: OUTPUT -> POSTROUTING

위의 정보를 이전 테이블에 나열된 순서와 결합하면, 로컬 시스템으로 향하는 수신 패킷은 먼저 raw, mangle, nat 테이블의 PREROUTING 체인에서 평가됩니다. 그런 다음 mangle, filter, security, nat 테이블의 INPUT 체인을 통과한 후 로컬 소켓으로 전달됩니다.

IPTables 규칙

각 규칙은 특정 테이블의 특정 체인에 배치됩니다. 각 체인이 호출될 때, 해당 패킷은 체인 내의 각 규칙과 비교됩니다. 각 규칙에는 일치하는 구성 요소와 동작 구성 요소가 있습니다.

일치하는 구성 요소

룰의 일치 부분은 연관된 동작(또는 “대상”)이 실행되기 위해 패킷이 충족해야 하는 기준을 지정합니다.

일치 시스템은 매우 유연하며 추가적인 iptables 확장으로 확장할 수 있습니다. 프로토콜 유형, 대상 또는 출발지 주소, 대상 또는 출발지 포트, 대상 또는 출발지 네트워크, 입력 또는 출력 인터페이스, 헤더 또는 연결 상태 등으로 매치할 수 있는 규칙을 생성할 수 있습니다. 이러한 기준을 결합하여 다양한 트래픽을 구분할 수 있는 복잡한 규칙 집합을 생성할 수 있습니다.

대상

A “target” refers to the actions that are triggered when a packet meets the matching criteria of a rule. Targets are generally divided into two categories:

  • 종결 대상: 종결 대상은 체인 내에서 평가를 종료하고 netfilter 후크에 제어를 반환하는 동작을 수행합니다. 제공된 반환 값에 따라 후크는 패킷을 삭제하거나 패킷을 처리의 다음 단계로 진행할 수 있습니다.
  • 비종결 대상: 비종결 대상은 동작을 수행하고 체인 내에서 평가를 계속합니다. 각 체인은 최종 종결 결정을 반환해야 하지만, 여러 개의 비종결 대상을 먼저 실행할 수 있습니다.

규칙 내에서 각 대상의 가용성은 맥락에 따라 달라집니다. 예를 들어, 테이블과 체인 유형은 사용 가능한 대상을 지정할 수 있습니다. 규칙에서 활성화된 확장과 일치 절은 대상의 가용성에도 영향을 줄 수 있습니다.

사용자 정의 체인으로 이동하기

점프(target) 대상이라는 특수한 종류의 비종료(target)도 있습니다. 점프(target) 대상은 평가를 추가 처리하기 위해 다른 체인으로 이동하는 작업입니다. 우리는 호출되는 netfilter 후크와 관련된 내장 체인에 대해 다루었습니다. 그러나 iptables은 관리자가 조직적인 목적으로 자체 체인을 생성할 수 있도록 해줍니다.

사용자 정의 체인에 규칙을 배치하는 방법은 내장 체인에 규칙을 배치하는 방법과 동일합니다. 차이점은 사용자 정의 체인은 규칙에서 그 체인으로 “점프”하여 도달할 수 있다는 것입니다(그들 자체로는 netfilter 후크에 등록되지 않음).

사용자 정의 체인은 호출한 체인의 확장 기능으로 작동합니다. 예를 들어, 사용자 정의 체인에서, 규칙 목록의 끝에 도달하거나 일치하는 규칙에 의해 활성화된 RETURN 대상이 활성화되면 평가가 호출한 체인으로 돌아갑니다. 평가는 또한 추가적인 사용자 정의 체인으로 이동할 수 있습니다.

이러한 구조는 더 큰 조직화를 가능하게 하며, 보다 견고한 분기를 위해 필요한 프레임워크를 제공합니다.

IPTables와 연결 추적

우리는 netfilter 프레임워크 위에 구현된 연결 추적 시스템을 소개했을 때, raw 테이블과 연결 상태 일치 기준을 논의했습니다. 연결 추적을 통해 iptables는 주어진 연결의 맥락에서 패킷에 대한 결정을 내릴 수 있습니다. 연결 추적 시스템은 “상태를 유지하는(stateful)” 작업을 수행하기 위해 iptables에 필요한 기능을 제공합니다.

패킷이 네트워킹 스택에 진입한 직후에 연결 추적이 적용됩니다. raw 테이블 체인과 일부 일관성 검사는 패킷을 연결과 연관시키기 전에 수행되는 유일한 논리입니다.

시스템은 각 패킷을 기존 연결 집합과 비교합니다. 필요한 경우 연결의 상태를 업데이트하고 필요할 때 새로운 연결을 시스템에 추가합니다. raw 체인 중 하나에서 NOTRACK 타겟으로 표시된 패킷은 연결 추적 루틴을 통과하지 않습니다.

사용 가능한 상태

연결 추적 시스템에 의해 추적되는 연결은 다음 중 하나의 상태에 있을 것입니다:

  • NEW: 기존 연결과 연관되지 않지만 첫 번째 패킷으로서 유효하지 않은 패킷이 도착하면, 이 레이블이 있는 새로운 연결이 시스템에 추가됩니다. 이는 TCP와 같은 연결 지향 프로토콜뿐만 아니라 UDP와 같은 비연결형 프로토콜에도 해당됩니다.
  • ESTABLISHED: 연결이 반대 방향으로 유효한 응답을 받으면 NEW에서 ESTABLISHED로 변경됩니다. TCP 연결의 경우, 이는 SYN/ACK이고 UDP 및 ICMP 트래픽의 경우 소스와 목적지가 전환된 응답을 의미합니다.
  • RELATED: 기존 연결의 일부가 아니지만 이미 시스템에 연결된 연결과 관련된 패킷은 RELATED로 레이블이 지정됩니다. 이는 FTP 데이터 전송 연결과 같은 도우미 연결일 수도 있으며, 다른 프로토콜의 연결 시도에 대한 ICMP 응답일 수도 있습니다.
  • INVALID: 패킷은 기존 연결과 연결되지 않으며 새로운 연결을 열기에 적합하지 않거나 식별할 수 없거나 경로 지정이 불가능한 경우 등 여러 가지 이유로 INVALID로 표시될 수 있습니다.
  • UNTRACKED: 패킷은 추적을 우회하기 위해 raw 테이블 체인에서 대상으로 설정되었다면 UNTRACKED로 표시될 수 있습니다.
  • SNAT: 이는 NAT 작업에 의해 소스 주소가 변경된 경우 설정되는 가상 상태입니다. 이는 연결 추적 시스템이 응답 패킷에서 소스 주소를 다시 변경해야 함을 알 수 있도록 사용됩니다.
  • DNAT: 이는 NAT 작업에 의해 대상 주소가 변경된 경우 설정되는 가상 상태입니다. 이는 연결 추적 시스템이 응답 패킷을 라우팅할 때 대상 주소를 다시 변경해야 함을 알 수 있도록 사용됩니다.

연결 추적 시스템에서 추적되는 상태는 관리자가 연결의 수명 주기에서 특정 지점을 대상으로 하는 규칙을 작성할 수 있도록 합니다. 이는 보다 철저하고 안전한 규칙을 위해 필요한 기능을 제공합니다.

결론

netfilter 패킷 필터링 프레임워크와 iptables 방화벽은 Linux 서버의 대부분 방화벽 솔루션의 기초입니다. netfilter 커널 훅은 시스템에서 처리되는 패킷에 대한 강력한 제어를 제공하기 위해 네트워킹 스택과 충분히 가깝습니다. iptables 방화벽은 이러한 기능을 활용하여 커널에 정책 요구 사항을 유연하고 확장 가능한 방법으로 전달합니다. 이러한 구성 요소들이 어떻게 맞물리는지에 대해 학습함으로써 서버 환경을 제어하고 보안하는 데 더욱 효과적으로 활용할 수 있습니다.

효과적인 iptables 정책을 선택하는 방법에 대해 더 알고 싶다면 이 가이드를 확인해보세요.

이러한 안내서는 iptables 방화벽 규칙을 구현하는 데 도움이 될 수 있습니다:

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