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 como192.0.2.1
. -
ipv6_addr
para um mapa cuja parte correspondente contém um endereço IPv6, tal como2001:db8:1::1
. -
ether_addr
para um mapa cuja parte correspondente contém um endereço de controle de acesso à mídia (MAC), tal como52:54:00:6b:66:42
. -
inet_proto
para um mapa cuja parte correspondente contém um tipo de protocolo Internet, tal comotcp
. -
inet_service
para um mapa cuja parte correspondente contém um número de porta do nome dos serviços da Internet, comossh
ou22
. -
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
a2147483647
. -
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
Criar uma mesa. Por exemplo, para criar uma tabela chamada
example_table
que processa pacotes IPv4:# nft adicionar tabela ip exemplo_tabela
Criar uma corrente. Por exemplo, para criar uma cadeia chamada
example_chain
emexample_table
:# nft add chain ip example_table example_chain { type filter hook input priority 0 {\i1}; {\i1}
ImportantePara 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.
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 }
Criar regras que utilizem o mapa. Por exemplo, o seguinte comando adiciona uma regra a
example_chain
emexample_table
que aplica ações a endereços IPv4 que são ambos definidos emexample_map
:# nft add rule example_table example_chain ip saddr vmap @example_map
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 de192.0.2.2
.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 }
Opcionalmente, remova uma entrada do mapa:
# nft apagar elemento ip example_table example_map { 192.0.2.1 }
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 } }