Red Hat Training

A Red Hat training course is available for RHEL 8

41.6. nftables 명령에서 확인 맵 사용

사전이라고도 하는 정점 맵을 사용하면 nft 가 일치 기준을 작업에 매핑하여 패킷 정보를 기반으로 작업을 수행할 수 있습니다.

41.6.1. nftables에서 익명 맵 사용

익명 맵은 규칙에서 직접 사용하는 { match_ crite lack : action } 문입니다. 문에는 쉼표로 구분된 여러 매핑이 포함될 수 있습니다.

익명 맵의 단점은 맵을 변경하려면 규칙을 교체해야 한다는 것입니다. 동적 솔루션의 경우 nftables에서 명명된 맵을 사용하도록 설명된 대로 이름이 지정된 맵을 사용합니다.

예를 들어 익명 맵을 사용하여 IPv4 및 IPv6 프로토콜의 TCP 및 UDP 패킷을 서로 다른 체인으로 라우팅하여 들어오는 TCP 및 UDP 패킷을 별도로 계산할 수 있습니다.

절차

  1. 새 테이블을 만듭니다.

    # nft add table inet example_table
  2. example_table 에서 tcp_packets 체인을 만듭니다.

    # nft add chain inet example_table tcp_packets
  3. 이 체인의 트래픽을 계산하는 tcp_packets 에 규칙을 추가합니다.

    # nft add rule inet example_table tcp_packets counter
  4. example_tableudp_packets 체인 생성

    # nft add chain inet example_table udp_packets
  5. 이 체인의 트래픽을 계산하는 udp_packets 에 규칙을 추가합니다.

    # nft add rule inet example_table udp_packets counter
  6. 들어오는 트래픽의 체인을 만듭니다. 예를 들어 들어오는 트래픽을 필터링하는 example_table 에서 incoming_traffic 라는 체인을 생성하려면 다음을 수행합니다.

    # nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }
  7. anonymous map이 있는 규칙을 incoming_traffic 에 추가합니다.

    # nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }

    익명 맵은 패킷을 구분하고 프로토콜을 기반으로 다른 카운터 체인으로 전송합니다.

  8. 트래픽 카운터를 나열하려면 example_table 을 표시합니다.

    # nft list table inet example_table
    table inet example_table {
      chain tcp_packets {
        counter packets 36379 bytes 2103816
      }
    
      chain udp_packets {
        counter packets 10 bytes 1559
      }
    
      chain incoming_traffic {
        type filter hook input priority filter; policy accept;
        ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }
      }
    }

    tcp_packetsudp_packets 체인의 카운터는 수신된 패킷 수와 바이트 수를 모두 표시합니다.

41.6.2. nftables에서 명명된 맵 사용

nftables 프레임워크는 이름이 지정된 map을 지원합니다. 테이블 내에서 이러한 맵을 여러 규칙에 사용할 수 있습니다. 익명 맵에 비해 또 다른 이점은 해당 맵을 사용하는 규칙을 교체하지 않고도 명명된 맵을 업데이트할 수 있다는 것입니다.

명명된 맵을 생성할 때 요소 유형을 지정해야 합니다.

  • 일치하는 부분이 있는 맵의 ipv4_addr 에는 192.0.2.1 과 같은 IPv4 주소가 포함되어 있습니다.
  • 2001:db8:1::1 과 같은 IPv6 주소를 포함하는 맵의 ipv6_addr.
  • 52:54:00:6b:66:42 와 같은 MAC(Media Access Control) 주소가 일치하는 맵의 ether_addr.
  • inet_proto 일치하는 부분이 있는 맵의 경우 tcp 와 같은 인터넷 프로토콜 유형이 포함되어 있습니다.
  • inet_service 일치하는 맵의 경우 ssh 또는 22 와 같은 인터넷 서비스 이름 포트 번호가 포함되어 있습니다.
  • 일치하는 부분에 패킷 표시가 포함된 맵의 경우 표시됩니다. 패킷 마크는 모든 양의 32 비트 정수 값 (0 에서 2147483647)일 수 있습니다.
  • 카운터 값이 일치 하는 맵에 대 한 카운터입니다.A counter for a map whose match part contains a counter value. 카운터 값은 임의의 64비트 정수 값일 수 있습니다.
  • 일치 부분에 할당량 값이 포함된 맵의 할당량입니다. 할당량 값은 임의의 64비트 정수 값일 수 있습니다.

예를 들어 소스 IP 주소에 따라 들어오는 패킷을 허용하거나 삭제할 수 있습니다. 이름 지정된 맵을 사용하면 IP 주소 및 작업이 맵에 동적으로 저장되는 동안 이 시나리오를 구성하는 데 단일 규칙만 필요합니다.

절차

  1. 테이블 만들기. 예를 들어 IPv4 패킷을 처리하는 example_table 라는 테이블을 만들려면 다음을 실행합니다.

    # nft add table ip example_table
  2. 체인을 만듭니다. 예를 들어 example_table 에서 example_chain 이라는 체인을 생성하려면 다음을 수행합니다.

    # nft add chain ip example_table example_chain { type filter hook input priority 0 \; }
    중요

    쉘이 명령 끝부분을 해석하지 못하도록 하려면 백슬래시를 사용하여 host를 이스케이프해야 합니다.

  3. 빈 맵을 만듭니다. 예를 들어 IPv4 주소에 대한 맵을 생성하려면 다음을 수행합니다.

    # nft add map ip example_table example_map { type ipv4_addr : verdict \; }
  4. 맵을 사용하는 규칙을 만듭니다. 예를 들어 다음 명령은 example_map 에 정의된 IPv4 주소에 작업을 적용하는 example_tableexample_chain 에 규칙을 추가합니다.

    # nft add rule example_table example_chain ip saddr vmap @example_map
  5. IPv4 주소 및 해당 작업을 example_map 에 추가합니다.

    # nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }

    이 예제에서는 IPv4 주소의 작업 매핑을 정의합니다. 위에서 생성된 규칙과 함께 방화벽은 192.0.2.1 의 패킷을 수락하고 192.0.2.2 에서 패킷을 삭제합니다.

  6. 선택 사항: 다른 IP 주소 및 action 문을 추가하여 맵을 개선합니다.

    # nft add element ip example_table example_map { 192.0.2.3 : accept }
  7. 선택 사항: 맵에서 항목을 제거합니다.

    # nft delete element ip example_table example_map { 192.0.2.1 }
  8. 선택 사항: 규칙 세트를 표시합니다.

    # nft list ruleset
    table ip example_table {
      map example_map {
        type ipv4_addr : verdict
        elements = { 192.0.2.2 : drop, 192.0.2.3 : accept }
      }
    
      chain example_chain {
        type filter hook input priority filter; policy accept;
        ip saddr vmap @example_map
      }
    }

41.6.3. 추가 리소스

  • nft(8) 매뉴얼 페이지의 Maps 섹션