nftables의 패킷 처리 순서

nftables의 패킷 처리 순서

iptables에서 nftables로 마이그레이션 중입니다. nftables의 패킷 처리 순서에 대한 기본적인 질문이 있습니다.

동일한 유형(예: inet)의 여러 테이블을 생성할 수 있고 각 테이블 내에서 우선순위가 다르거나 동일한 체인을 생성할 수 있으므로 처리 순서는 무엇입니까?

예를 들어, 다음을 생성하면 순서는 어떻게 되나요?

table inet t1 {
    chain INPUT {
        type filter hook input priority 20; policy accept;
        ...
    }
}


table inet t2 {
    chain INPUT {
        type filter hook input priority 20; policy accept;
        ...
    }
}

체인이 다른 입력에 연결되어 있다는 것은 이해하지만, 다른 테이블 뒤에 있는 논리는 아직 이해하지 못했습니다.

이것이 어리석거나 기본적인 질문이라면 사과드립니다.

답변1

예시의 순서는 다음과 같습니다.명확하지 않다, 그러나 두 체인 모두 통과됩니다(패킷이 첫 번째 체인에서 삭제되지 않는 한).

Netfilter 및 네트워크/라우팅 스택은 정렬 기능을 제공합니다.

이것은일반 네트워크의 Netfilter 및 패킷 흐름개략도:

일반 네트워크의 Netfilter 및 패킷 흐름

사용되기는 하지만iptables다음에 적용될 때 전반적인 동작은 동일하다는 점을 명심하십시오.nftables미묘한 차이가 있습니다(예:으깨다그리고필터,이게 다야필터존재하다nftablesmangle/OUTPUT 대신에 아마도 다음과 같이 번역되어야 할 것입니다.입력 라우팅 후크 출력또는 대부분의 교량이 함께 혼합되어 있음ebtables그리고iptables하반신에서 본고쳐 쓰다: 에는 존재하지 않습니다nftables존재하지만 피해야 한다nftables직접적으로브리지 패밀리직접, 그리고 커널 >= 5.3을 사용하는 경우연결하다거기에는 기능이 필요합니다( br_netfilter커널 모듈을 전혀 사용하지 않음).

테이블의 역할

테이블이 들어있어요nftables테이블의 값과 같지 않음iptables: 이것은 덜 엄격한 것입니다. 존재하다nftables, 이것테이블체인을 정리하는 컨테이너이며,놓다및 기타 유형의 개체를 포함하고 해당 범위를 제한합니다. 반대쪽으로iptables이는 완벽하게 허용되며 때로는 동일한 테이블에 서로 다른 체인 유형(예: nat, 필터, 경로)을 혼합해야 할 필요가 있습니다. 예를 들어 이것이 공개 체인에 액세스할 수 있는 유일한 방법입니다.놓다그 범위는 전역이 아닌 테이블로 제한되기 때문입니다(예:iptables'동반자IP 세트).

그런 다음 특정 처리를 위해 또는 특정 트래픽을 처리하기 위해 동일한 시리즈(동일한 유형의 체인 포함)의 여러 테이블을 갖는 것도 완벽하게 허용됩니다. 이 테이블의 내용을 변경할 때 규칙을 변경할 위험이 없습니다. 다른 테이블(전체 결과에도 불구하고 여전히 충돌하는 효과가 발생할 위험이 있음) 규칙을 관리하는 데 도움이 됩니다. 예를 들어NFTLB로드 밸런서는 이름이 지정된 테이블(각 시리즈)을 생성합니다.NFTLB는 자체적으로만 관리되도록 고안되었으며 다른 사용자 정의 테이블과 충돌하지 않습니다.

후크 간 및 후크 내에서 정렬

특정 시리즈(netdev, bridge, arp, ip, ip6)에서 서로 다른 Hook(entrance, pre-routing, input,forwarding,output,post-routing)에 등록된 체인은 Netfilter에서 제공하는 Hook 순서에 따라 정렬되며, 위의 그림과 같이 표시됩니다. 우선순위 범위는 동일한 후크로 제한되며 여기서는 중요하지 않습니다. 예를 들어, 패킷 전달의 경우 type filter hook prerouting priority 500이전 상황이 여전히 발생합니다 .type filter hook forward priority -500

해당되는 경우, 특정 시리즈의 가능한 각 후크에 대해 각 체인은 동일한 위치에 등록된 다른 체인과 경쟁합니다. 이것테이블여기서는 가족을 정의하는 것 외에는 어떤 목적도 제공하지 않습니다. 우선순위가 다른 한, 특정 후크 유형 내에서 패킷은 해당 후크 내의 체인을 가장 낮은 우선순위에서 가장 높은 우선순위로 통과합니다. 동일한 시리즈 및 후크 유형의 두 체인에 대해 정확히 동일한 우선순위가 사용되는 경우 순서는 정의되지 않습니다. 체인을 생성할 때 현재 커널 버전은 해당 연결리스트 구조에서 동일한 우선순위를 가진 체인 앞이나 뒤에 체인을 추가합니까? 다음 커널 버전에서도 동일한 동작이 계속 유지됩니까, 아니면 일부 최적화로 인해 이 순서가 변경됩니까? 이것은 문서화되어 있지 않습니다. 두 후크 모두 계속 호출되지만 호출 순서는 정의되지 않습니다.

그것은 무슨 상관이야? 이것은 다음에서 인용되었습니다.매뉴얼 페이지아래에서는 동일한 후크에서 패킷이 여러 번 허용(또는 허용되지 않음)될 수 있음을 명확히 설명합니다.

accept

규칙 세트 평가를 종료하고 패킷을 수락합니다. 패킷은 나중에 다른 후크에 의해 삭제될 수 있습니다. 예를 들어 순방향 후크의 승인은 패킷이 나중에 라우팅 후 후크에서 삭제되거나 우선 순위가 더 높은 다른 후크에서 삭제되고 이후에 처리 파이프라인에서 평가될 수 있도록 허용합니다. 체인.

예를 들어, 한 링크가 특정 패킷을 수락하고 다른 체인이 이 동일한 패킷을 삭제하는 경우 전체 결과는 항상 다음과 같습니다.줄이다. 그러나 후크는 추가 작업을 수행하여 부작용을 일으킬 수 있습니다. 예를 들어 패킷의 소스 주소를놓다next라고 불리는 또 다른 체인이 패킷을 삭제했습니다. 순서가 바뀌고 패킷이 먼저 삭제되면 이 "부작용" 작업이 발생하지 않으며놓다업데이트되지 않습니다. 따라서 이 경우에는 동일한 우선순위를 사용하는 것을 피해야 합니다. 다른 경우에는 대부분 하락이 발생하지 않으며 이는 중요하지 않습니다. 사람들은 그것이 중요하지 않다는 것을 알지 않는 한 동일한 우선순위를 사용하지 않아야 합니다.

다른 네트워크 하위 시스템과의 관계

후크 내에서 모든정수범위를 사용하여 순서를 선택할 수 있지만 일부 특정 임계값이 중요합니다.

~에서nftables'위키, 이것은 유산입니다iptables고정된 가치는 다음에 적용됩니다.아이피시리즈에는 다른 하위 시스템도 포함됩니다.

NF_IP_PRI_CONNTRACK_DEFRAG (-400): 조각 모음 우선 순위
NF_IP_PRI_RAW (-300): 연결 추적 작업 이전에 원래 테이블의 기존 우선 순위
NF_IP_PRI_SELINUX_FIRST (-225): SELinux 작업
NF_IP_PRI_CONNTRACK (-200): 연결 추적 작업
NF_IP_PRI_MANGLE (-150): mangle 작업
NF_IP_PRI_NAT_DST (-100): 대상 NAT
NF_IP_PRI_FILTER (0): 필터 작업, 필터 테이블
NF_IP_PRI_SECURITY (50): secmark를 설정할 수 있는 보안 테이블의 위치 예
NF_IP_PRI_NAT_SRC (100): 소스 NAT
NF_IP_PRI_SELINUX_LAST (225): 패킷 종료 시 SELinux
NF_IP_PRI_CONNTRACK_HELPER (300): 종료 시 연결 추적

그 중 실제로 중요한 것은 소수에 불과합니다.iptables. 예를 들어 (비완전한) 가족은 다음과 같습니다 ip.

  • NF_IP_PRI_CONNTRACK_DEFRAG (-400): 체인이 들어오는 IPv4 조각을 보려면 다음 위치에 있어야 합니다.사전 라우팅우선순위는 -400보다 낮습니다. 그 후에는 재조립된 패킷만 표시됩니다(조각 존재 여부를 확인하는 규칙은 일치하지 않습니다).
  • NF_IP_PRI_CONNTRACK (-200): 체인을 작동시키세요앞으로 연결하다에 등록되어야 합니다.사전 라우팅또는산출확률은 -200보다 작습니다. 예를 들어, 우선순위 NF_IP_PRI_RAW (-300)(또는 포트가 모든 경우에 일치하도록 하려면 다른 값 < -200이지만 여전히 > -400)로 등록하여 추가하세요.notrack방지하기 위한 성명연결하다이 패킷에 대한 연결 항목을 만듭니다. 그래서nftables동등하다iptables' 원시/미리 라우팅 중사전 라우팅 필터링충분한 우선순위를 갖습니다.

여러 가지 잡다한

일부 특별한 경우:

  • 이것인트라넷호적에아이피그리고IP6또한 가족 후크.

  • 타이프나트

    규칙이 NAT 관련 문과 일치하고 실행되면 다르게 동작합니다. 즉, 패킷이 더 이상 통과되지 않습니다.체인은 같은 후크에 있습니다.타이프나트등록방법이 다릅니다. NAT가 아닌 다른 후크보다 우선순위가 고정되어 있습니다. 예를 들어사전 라우팅또는산출NF_IP_PRI_NAT_DST필터 후크의 경우 NAT 후크는 모두 고정 우선순위 = -100으로 발생합니다. 여러 NAT 후크는 여전히 그들 사이의 우선순위를 존중합니다. 에 대한 추가 세부정보타이프나트이 Q/A에서 이를 확인할 수 있습니다.nftables: 특정 후크에 대해 여러 유형의 체인이 평가됩니까?

    양측에 대한 NAT 규칙iptables-이전 버전그리고nftables4.18 이전 커널과 혼합하면 안 됩니다. 4.18 이전 최초의 시설iptables-이전 버전그리고nftables등록하면 후크의 모든 NAT가 처리됩니다.

답변2

긴 이야기 짧게

넷필터의 처리 순서를 이해하기 위해 저는 좀 더 직관적인 형태를 선호합니다. 그래서 저는 종종 다음을 참조합니다.플루프

                     (input interface)
                             |
                             v
                     /-------+-------\
                     | sanity checks |
                     \-------+-------/
                             |
                             v hook NF_IP_PRE_ROUTING
                      +------+------+
                      | conntrack   |
                      | defrag.     |
                      +-------------+
                      | mangle      |
                      | PREROUTING  |
                      +-------------+
                      | nat (dst)   |
                      | PREROUTING  |
                      +------+------+
                             |
                             v
        local delivery  /----+----\    forward
       +---------------+   route   +---------------+
       |                \---------/                |
       v                                           v
 /-----+-----\                               /-----+-----\
 |  defrag.  |                               | TTL check |
 \-----+-----/                               | dec. TTL  |
       |                                     \-----+-----/
       v hook NF_IP_LOCAL_IN                       |
+------+------+                                    |
| mangle  (1) |                                    |
| INPUT       |                                    |
+-------------+                                    |
| filter      |                                    v
| INPUT       |                              /-----+-----\
+-------------+                              | DF check  |
| nat (src)(2)|                              \-----+-----/
+-------------+                                    |
| conntrack   |                                    |
| confirm     |                                    | 
+------+------+                               hook v NF_IP_FORWARD
       |                                    +------+------+
       v                                    | mangle  (1) |
/-------+-------\                           | FORWARD     |
| local process |                           +-------------|
\-------+-------/                           | filter      |
       |                                    | FORWARD     |
       v                                    +------+------+
 /-----+-----\                                     |
 |   route   |                                     |
 |   frag.   |                                     |
 \-----+-----/                                     |
       |                                           |
       v hook NF_IP_LOCAL_OUT                      |
+------+------+                                    |
| conntrack   |                                    |
| defrag.     |                                    |
+-------------+                                    |
| mangle      |                                    |
| OUTPUT      |                                    |
+-------------+                                    v
| nat (dst)(3)|                              /-----+-----\
| OUTPUT      |                              |   frag.   |
+-------------+                              \-----+-----/
| filter      |                                    |
| OUTPUT      |                                    |
+------+------+                                    |
       |                                           |
       v                                           |
 /-----+-----\                                     |
 |  reroute  |                                     |
 \-----+-----/                                     |
       |                                           |
       +------------------+     +------------------+
                          |     |
                          v     v hook NF_IP_POST_ROUTING
                      +---+-----+---+
                      | mangle  (1) |
                      | POSTROUTING |
                      +-------------+
                      | nat (src)   |
                      | defrag.     |
                      | POSTROUTING |
                      +-------------+
                      | conntrack   |
                      | confirm     |
                      | frag.       |
                      +------+------+
                             |
                             v
                   (output interface)

관련 정보