Red Hat Training

A Red Hat training course is available for RHEL 8

6.6.2. Usando mapas de veredictos mutáveis em nftables

A estrutura nftables suporta mapas de veredictos mutáveis. Você pode usar estes mapas em várias regras dentro de uma tabela. Outro benefício sobre os mapas literais é que você pode atualizar um mapa mutável sem substituir as regras que o utilizam.

Quando você cria um mapa de veredicto mutável, você deve especificar o tipo de elementos

  • ipv4_addr para um mapa cuja parte correspondente contém um endereço IPv4, tal como 192.0.2.1.
  • ipv6_addr para um mapa cuja parte correspondente contém um endereço IPv6, tal como 2001:db8:1::1.
  • ether_addr para um mapa cuja parte correspondente contém um endereço de controle de acesso à mídia (MAC), tal como 52:54:00:6b:66:42.
  • inet_proto para um mapa cuja parte correspondente contém um tipo de protocolo Internet, tal como tcp.
  • inet_service para um mapa cuja parte correspondente contém um número de porta do nome dos serviços da Internet, como ssh ou 22.
  • mark para um mapa cuja parte correspondente contém uma marca de pacote. Uma marca de pacote pode ser qualquer valor inteiro positivo de 32 bits (0 a 2147483647.
  • counter para um mapa cuja parte correspondente contém um contravalor. O valor do contador pode ser qualquer valor inteiro positivo de 64 bits.
  • quota para um mapa cuja parte correspondente contém um valor de cota. O valor da cota pode ser qualquer valor inteiro positivo de 64 bits.

O exemplo descreve como permitir ou largar pacotes de entrada com base em seu endereço IP de origem. Usando um mapa de veredicto mutável, é necessária apenas uma única regra para configurar este cenário enquanto os endereços IP e ações são armazenados dinamicamente no mapa. O procedimento também descreve como adicionar e remover entradas do mapa.

Procedimento

  1. Criar uma mesa. Por exemplo, para criar uma tabela chamada example_table que processa pacotes IPv4:

    # nft adicionar tabela ip exemplo_tabela
  2. Criar uma corrente. Por exemplo, para criar uma cadeia chamada example_chain em example_table:

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

    Para evitar que a casca interprete os ponto-e-vírgula como o fim do comando, você deve escapar dos pontos-e-vírgula com uma barra invertida.

  3. Criar um mapa vazio. Por exemplo, para criar um mapa para endereços IPv4:

    # nft add map ip example_table example_map { type ipv4_addr : veredicto }
  4. Criar regras que utilizem o mapa. Por exemplo, o seguinte comando adiciona uma regra a example_chain em example_table que aplica ações a endereços IPv4 que são ambos definidos em example_map:

    # nft add rule example_table example_chain ip saddr vmap @example_map
  5. Adicionar endereços IPv4 e ações correspondentes a example_map:

    # nft adicionar elemento ip example_table example_map { 192.0.2.1 : aceitar, 192.0.2.2 : largar }

    Este exemplo define os mapeamentos de endereços IPv4 para ações. Em combinação com a regra criada acima, o firewall aceita pacotes de 192.0.2.1 e deixa cair pacotes de 192.0.2.2.

  6. Opcionalmente, melhore o mapa adicionando outro endereço IP e declaração de ação:

    # nft adicionar elemento ip example_table example_map { 192.0.2.3 : aceitar }
  7. Opcionalmente, remova uma entrada do mapa:

    # nft apagar elemento ip example_table example_map { 192.0.2.1 }
  8. Opcionalmente, exibir o conjunto de regras:

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