웹사이트 검색

Iptables 및 Netfilter 아키텍처에 대한 심층 분석


소개

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

이 가이드에서는 자체 방화벽 정책을 구축해야 하는 사용자가 보다 쉽게 이해할 수 있도록 iptables 아키텍처를 자세히 살펴보겠습니다. iptablesnetfilter와 상호 작용하는 방법과 다양한 구성 요소가 종합적인 필터링 시스템을 제공하기 위해 함께 맞춰지는 방법에 대해 설명합니다.

IPTables 및 Netfilter는 무엇입니까?

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

네트워킹 계층(수신 또는 발신)을 통과하는 모든 패킷은 이러한 후크를 트리거하여 프로그램이 주요 지점에서 트래픽과 상호 작용할 수 있도록 합니다. iptables와 관련된 커널 모듈은 트래픽이 방화벽 규칙에 의해 제시된 조건을 준수하도록 하기 위해 이러한 후크에 등록됩니다.

넷필터 후크

프로그램이 등록할 수 있는 5개의 netfilter 후크가 있습니다. 패킷이 스택을 통해 진행됨에 따라 이러한 후크에 등록된 커널 모듈을 트리거합니다. 패킷이 트리거하는 후크는 패킷이 들어오는지 또는 나가는지 여부, 패킷의 대상 및 이전 지점에서 패킷이 삭제되었는지 또는 거부되었는지 여부에 따라 다릅니다.

다음 후크는 네트워킹 스택에서 이러한 잘 정의된 지점을 나타냅니다.

  • NF_IP_PRE_ROUTING: 이 후크는 네트워크 스택에 진입한 직후 들어오는 모든 트래픽에 의해 트리거됩니다. 이 후크는 패킷을 보낼 위치에 대한 라우팅 결정이 이루어지기 전에 처리됩니다.
  • NF_IP_LOCAL_IN: 패킷이 로컬 시스템으로 향하는 경우 수신 패킷이 라우팅된 후 이 후크가 트리거됩니다.
  • NF_IP_FORWARD: 패킷이 다른 호스트로 전달되어야 하는 경우 들어오는 패킷이 라우팅된 후에 이 후크가 트리거됩니다.
  • NF_IP_LOCAL_OUT: 이 후크는 네트워크 스택에 도달하는 즉시 로컬에서 생성된 아웃바운드 트래픽에 의해 트리거됩니다.
  • NF_IP_POST_ROUTING: 이 후크는 라우팅이 발생한 후 유선으로 전송되기 직전에 나가거나 전달된 트래픽에 의해 트리거됩니다.

이러한 후크에 등록해야 하는 커널 모듈은 후크가 트리거될 때 호출되는 순서를 결정하는 데 도움이 되는 우선 순위 번호도 제공해야 합니다. 이것은 여러 모듈(또는 동일한 모듈의 여러 인스턴스)이 결정론적 순서로 각 후크에 연결되는 수단을 제공합니다. 각 모듈은 차례로 호출되며 처리 후 패킷으로 수행해야 하는 작업을 나타내는 결정을 netfilter 프레임워크에 반환합니다.

IPTables 테이블 및 체인

iptables 방화벽은 테이블을 사용하여 규칙을 구성합니다. 이 테이블은 규칙을 만드는 데 사용되는 결정 유형에 따라 규칙을 분류합니다. 예를 들어 규칙이 네트워크 주소 변환을 처리하는 경우 nat 테이블에 배치됩니다. 패킷이 목적지까지 계속되도록 허용할지 여부를 결정하는 데 규칙이 사용되는 경우 필터 테이블에 추가될 수 있습니다.

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 커널 후크는 5개뿐이므로 여러 테이블의 체인이 각 후크에 등록됩니다. 예를 들어 세 개의 테이블에는 PREROUTING 체인이 있습니다. 이러한 체인이 연결된 NF_IP_PRE_ROUTING 후크에 등록되면 각 테이블의 PREROUTING 체인이 호출되는 순서를 지정하는 우선 순위를 지정합니다. 우선 순위가 가장 높은 PREROUTING 체인 내부의 각 규칙은 다음 PREROUTING 체인으로 이동하기 전에 순차적으로 평가됩니다. 잠시 후에 각 체인의 특정 순서를 살펴보겠습니다.

어떤 테이블을 사용할 수 있습니까?

잠시 뒤로 물러서서 iptables가 제공하는 다양한 테이블을 살펴보겠습니다. 이들은 패킷을 평가하기 위해 관심 영역별로 구성된 고유한 규칙 집합을 나타냅니다.

필터 테이블

필터 테이블은 iptables에서 가장 널리 사용되는 테이블 중 하나입니다. filter 테이블은 패킷이 의도한 대상으로 계속 이동하도록 할지 아니면 요청을 거부할지 결정하는 데 사용됩니다. 방화벽 용어로 이것은 "필터링\ 패킷이라고 합니다. 이 표는 사람들이 방화벽에 대해 논의할 때 생각하는 대부분의 기능을 제공합니다.

NAT 테이블

nat 테이블은 네트워크 주소 변환 규칙을 구현하는 데 사용됩니다. 패킷이 네트워크 스택에 들어갈 때 이 테이블의 규칙은 패킷 및 모든 응답 트래픽이 라우팅되는 방식에 영향을 미치기 위해 패킷의 소스 또는 대상 주소를 수정할지 여부와 수정 방법을 결정합니다. 이는 직접 액세스가 불가능할 때 패킷을 네트워크로 라우팅하는 데 자주 사용됩니다.

맹글 테이블

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

이 테이블은 또한 다른 테이블과 다른 네트워킹 도구에서 추가 처리를 위해 패킷에 내부 커널 "표시\를 배치할 수 있습니다. 이 표시는 실제 패킷을 건드리지 않지만 커널의 패킷 표현에 표시를 추가합니다.

원시 테이블

iptables 방화벽은 상태를 유지합니다. 즉, 이전 패킷과의 관계에 따라 패킷이 평가됩니다. netfilter 프레임워크 위에 구축된 연결 추적 기능을 통해 iptables는 패킷을 별개의 관련 없는 패킷 스트림 대신 진행 중인 연결 또는 세션의 일부로 볼 수 있습니다. 연결 추적 논리는 일반적으로 패킷이 네트워크 인터페이스에 도달한 직후에 적용됩니다.

raw 테이블에는 매우 협소하게 정의된 기능이 있습니다. 유일한 목적은 연결 추적을 거부하기 위해 패킷을 표시하는 메커니즘을 제공하는 것입니다.

보안 테이블

security 테이블은 패킷에 내부 SELinux 보안 컨텍스트 표시를 설정하는 데 사용되며, 이는 SELinux 또는 SELinux 보안 컨텍스트를 해석할 수 있는 다른 시스템이 패킷을 처리하는 방식에 영향을 미칩니다. 이러한 표시는 패킷당 또는 연결당 기준으로 적용될 수 있습니다.

체인과 테이블 간의 관계

세 개의 테이블에 PREROUTING 체인이 있는 경우 어떤 순서로 평가됩니까?

다음 표는 왼쪽에서 오른쪽으로 읽을 때 각 iptables 테이블 내에서 사용할 수 있는 체인을 나타냅니다. 예를 들어 raw 테이블에 PREROUTINGOUTPUT 체인이 모두 있음을 알 수 있습니다. 위에서 아래로 읽으면 연결된 netfilter 후크가 트리거될 때 각 체인이 호출되는 순서도 표시됩니다.

몇 가지 사항에 유의해야 합니다. 아래 표현에서 nat 테이블은 DNAT 작업(패킷의 대상 주소를 변경하는 작업)과 SNAT 작업( 순서를 보다 명확하게 표시하기 위해 소스 주소를 변경하는 것). 또한 발생하는 프로세스에 대한 보다 전체적인 보기를 제공하기 위해 라우팅 결정이 내려지는 지점과 연결 추적이 활성화되는 지점을 나타내는 행도 포함했습니다.

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<의 PREROUTING 체인에 대해 평가된다는 것을 알 수 있습니다., manglenat 테이블. 그런 다음 mangle, filter, securitynatINPUT 체인을 순회합니다. 테이블이 최종적으로 로컬 소켓으로 전달되기 전에.

IPTables 규칙

규칙은 특정 테이블의 특정 체인 내에 배치됩니다. 각 체인이 호출되면 문제의 패킷이 체인 내의 각 규칙에 대해 순서대로 확인됩니다. 각 규칙에는 일치하는 구성 요소와 작업 구성 요소가 있습니다.

어울리는

규칙의 일치하는 부분은 연결된 작업(또는 \대상\)이 실행되기 위해 패킷이 충족해야 하는 기준을 지정합니다.

일치 시스템은 매우 유연하며 추가 iptables 확장으로 크게 확장할 수 있습니다. 프로토콜 유형, 대상 또는 소스 주소, 대상 또는 소스 포트, 대상 또는 소스 네트워크, 입력 또는 출력 인터페이스, 헤더 또는 다른 기준 중에서 연결 상태에 따라 일치하도록 규칙을 구성할 수 있습니다. 이를 결합하여 서로 다른 트래픽을 구별하는 복잡한 규칙 세트를 만들 수 있습니다.

대상

"대상\은 패킷이 규칙의 일치 기준을 충족할 때 트리거되는 작업을 나타냅니다. 대상은 일반적으로 두 가지 범주로 나뉩니다.

  • 종료 대상: 종료 대상은 체인 내에서 평가를 종료하고 제어권을 netfilter 후크로 반환하는 작업을 수행합니다. 제공된 반환 값에 따라 후크는 패킷을 삭제하거나 패킷이 다음 처리 단계로 계속 진행되도록 허용할 수 있습니다.
  • 비종료 대상: 비종료 대상은 작업을 수행하고 체인 내에서 평가를 계속합니다. 각 체인은 결국 최종 종료 결정을 다시 전달해야 하지만 사전에 종료되지 않는 대상을 얼마든지 실행할 수 있습니다.

규칙 내에서 각 대상의 가용성은 컨텍스트에 따라 다릅니다. 예를 들어 테이블 및 체인 유형에 따라 사용 가능한 대상이 결정될 수 있습니다. 규칙에서 활성화된 확장 및 일치하는 절도 대상의 가용성에 영향을 줄 수 있습니다.

사용자 정의 체인으로 점프

종료되지 않는 특수한 대상인 점프 대상도 있습니다. 점프 대상은 추가 처리를 위해 평가가 다른 체인으로 이동하는 작업입니다. 우리는 그것을 호출하는 netfilter 후크에 연결된 내장 체인을 다루었습니다. 그러나 iptables를 사용하면 관리자가 조직 목적으로 자체 체인을 만들 수도 있습니다.

규칙은 기본 제공 체인에 배치할 수 있는 것과 동일한 방식으로 사용자 정의 체인에 배치할 수 있습니다. 차이점은 사용자 정의 체인은 규칙에서 체인으로 \점프\해야만 도달할 수 있다는 것입니다(netfilter 후크 자체에 등록되지 않음).

사용자 정의 체인은 자신을 호출한 체인의 확장 역할을 합니다. 예를 들어 사용자 정의 체인에서 규칙 목록의 끝에 도달하거나 일치하는 규칙에 의해 RETURN 대상이 활성화되면 평가가 호출 체인으로 다시 전달됩니다. 평가는 추가 사용자 정의 체인으로 이동할 수도 있습니다.

이 구조는 더 큰 조직을 허용하고 보다 강력한 분기에 필요한 프레임워크를 제공합니다.

IPTables 및 연결 추적

raw 테이블과 연결 상태 일치 기준에 대해 논의할 때 netfilter 프레임워크 위에 구현된 연결 추적 시스템을 소개했습니다. 연결 추적을 통해 iptables는 진행 중인 연결의 맥락에서 본 패킷에 대한 결정을 내릴 수 있습니다. 연결 추적 시스템은 "상태 저장\ 작업을 수행하는 데 필요한 기능을 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 방화벽 규칙 구현을 시작하는 데 도움이 될 수 있습니다.

  • iptables를 사용하여 방화벽을 설정하는 방법
  • Iptables Essentials: 일반 방화벽 규칙 및 명령
  • Ubuntu 22.04에서 UFW로 방화벽을 설정하는 방법
  • Rocky Linux 8에서 firewalld를 사용하여 방화벽을 설정하는 방법
  • 서버 간 트래픽을 보호하기 위해 Iptables 방화벽을 설정하는 방법