Red Hat Training

A Red Hat training course is available for RHEL 8

6.6.2. Uso de mapas de veredicto mutables en nftables

El marco nftables admite mapas de veredicto mutables. Puedes utilizar estos mapas en múltiples reglas dentro de una tabla. Otra ventaja con respecto a los mapas literales es que puedes actualizar un mapa mutable sin reemplazar las reglas que lo utilizan.

Cuando se crea un mapa de veredicto mutable, se debe especificar el tipo de elementos

  • ipv4_addr para un mapa cuya parte coincidente contiene una dirección IPv4, como 192.0.2.1.
  • ipv6_addr para un mapa cuya parte coincidente contiene una dirección IPv6, como 2001:db8:1::1.
  • ether_addr para un mapa cuya parte coincidente contiene una dirección de control de acceso al medio (MAC), como 52:54:00:6b:66:42.
  • inet_proto para un mapa cuya parte coincidente contiene un tipo de protocolo de Internet, como tcp.
  • inet_service para un mapa cuya parte de coincidencia contiene un número de puerto de nombre de servicios de Internet, como ssh o 22.
  • mark para un mapa cuya parte coincidente contiene una marca de paquete. Una marca de paquete puede ser cualquier valor entero positivo de 32 bits (0 a 2147483647.
  • counter para un mapa cuya parte de coincidencia contiene un valor de contador. El valor del contador puede ser cualquier valor entero positivo de 64 bits.
  • quota para un mapa cuya parte de coincidencia contiene un valor de cuota. El valor de la cuota puede ser cualquier valor entero positivo de 64 bits.

El ejemplo describe cómo permitir o descartar paquetes entrantes basándose en su dirección IP de origen. Utilizando un mapa de veredicto mutable, sólo se requiere una única regla para configurar este escenario, mientras que las direcciones IP y las acciones se almacenan dinámicamente en el mapa. El procedimiento también describe cómo añadir y eliminar entradas del mapa.

Procedimiento

  1. Cree una tabla. Por ejemplo, para crear una tabla llamada example_table que procese paquetes IPv4:

    # nft add table ip example_table
  2. Cree una cadena. Por ejemplo, para crear una cadena llamada example_chain en example_table:

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

    Para evitar que el shell interprete los puntos y comas como el final del comando, debe escapar los puntos y comas con una barra invertida.

  3. Cree un mapa vacío. Por ejemplo, para crear un mapa de direcciones IPv4:

    # nft add map ip example_table example_map { type ipv4_addr : verdict \; }
  4. Cree reglas que utilicen el mapa. Por ejemplo, el siguiente comando añade una regla a example_chain en example_table que aplica acciones a las direcciones IPv4 que están definidas en example_map:

    # nft add rule example_table example_chain ip saddr vmap @example_map
  5. Agregue las direcciones IPv4 y las acciones correspondientes a example_map:

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

    Este ejemplo define las asignaciones de direcciones IPv4 a acciones. En combinación con la regla creada anteriormente, el cortafuegos acepta los paquetes de 192.0.2.1 y los descarta de 192.0.2.2.

  6. Opcionalmente, puede mejorar el mapa añadiendo otra dirección IP y una declaración de acción:

    # nft add element ip example_table example_map { 192.0.2.3 : accept }
  7. Opcionalmente, eliminar una entrada del mapa:

    # nft delete element ip example_table example_map { 192.0.2.1 }
  8. Opcionalmente, mostrar el conjunto de reglas:

    # 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
      }
    }