Ao configurar uma cadeia no nftables, é necessário fornecer um priority
valor. Quase todos os exemplos online definem um piority
de 0; às vezes, um valor de 100 é usado com certos hooks ( output
, postrouting
).
O wiki nftables tem a dizer :
A prioridade pode ser usada para ordenar as cadeias ou colocá-las antes ou depois de algumas operações internas do Netfilter. Por exemplo, uma cadeia no gancho de pré-roteamento com prioridade -300 será colocada antes das operações de rastreamento de conexão.
Para referência, aqui está a lista de diferentes prioridades usadas no iptables:
- NF_IP_PRI_CONNTRACK_DEFRAG (-400): prioridade de desfragmentação
- NF_IP_PRI_RAW (-300): prioridade tradicional da tabela bruta colocada antes da operação de rastreamento de conexão
- NF_IP_PRI_SELINUX_FIRST (-225): operações SELinux
- NF_IP_PRI_CONNTRACK (-200): operações de rastreamento de conexão
- NF_IP_PRI_MANGLE (-150): operação mangle
- NF_IP_PRI_NAT_DST (-100): destino NAT
- NF_IP_PRI_FILTER (0): operação de filtragem, tabela de filtros
- NF_IP_PRI_SECURITY (50): Local da tabela de segurança onde secmark pode ser definido por exemplo
- NF_IP_PRI_NAT_SRC (100): fonte NAT
- NF_IP_PRI_SELINUX_LAST (225): SELinux na saída do pacote
- NF_IP_PRI_CONNTRACK_HELPER (300): rastreamento de conexão na saída
Isso afirma que a priority
interação dos controles com as operações internas do Netfilter, mas apenas menciona os valores usados pelo iptables como exemplos.
Em que casos é priority
relevante (ou seja, tem de ser definido para um valor ≠ 0)? Apenas para várias correntes com o mesmo gancho? Que tal combinar nftables e iptables? Quais operações internas do Netfilter são relevantes para determinar o priority
valor correto?
ATUALIZAÇÃO:
iptables-nft
(em vez deiptables-legacy
) está usando a API do kernel nftables e, além disso, uma camada de compatibilidade para reutilizar os módulos do kernel xtables (aqueles descritos emiptables-extensions
) quando não há tradução nativa do nftables disponível. Deve ser tratado como nftables na maioria dos aspectos, exceto por esta questão que fixou prioridades como a versão legada, então as prioridades do nftables ainda importam aqui.iptables (legado) e nftables dependem da mesma infraestrutura netfilter e usam ganchos em vários lugares. está explicado lá: Ganchos do Netfilter , ou há esta página de manual do systemtap , que documenta um pouco do manuseio do gancho:
ou também este blog sobre netfilter: How to Filter Network Packets using Netfilter–Part 1 Netfilter Hooks (blog desapareceu, usando um link Wayback Machine em seu lugar).
Tudo isso junto informa que vários módulos/funcionalidades podem se cadastrar em cada um dos cinco hooks possíveis (para o caso do IPv4), e em cada hook eles serão chamados por ordem de prioridade registrada para este hook.
Esses ganchos não são apenas para iptables ou nftables . Existem vários outros usuários, como o systemtap acima, ou mesmo os próprios submódulos do netfilter. Por exemplo, com IPv4 ao usar NAT com iptables ou nftables,
nf_conntrack_ipv4
registrará em 4 ganchos em várias prioridades para um total de 6 vezes . Este módulo, por sua vez, puxaránf_defrag_ipv4
os registros emNF_INET_PRE_ROUTING/NF_IP_PRI_CONNTRACK_DEFRAG
eNF_INET_LOCAL_OUT/NF_IP_PRI_CONNTRACK_DEFRAG
.Então sim, a prioridade é relevante apenas dentro do mesmo gancho. Mas neste mesmo gancho existem vários usuários, e eles já têm sua prioridade pré-definida (com muitas vezes, mas nem sempre, o mesmo valor reutilizado em diferentes ganchos), portanto, para interagir corretamente em torno deles, uma prioridade compatível deve ser usada.
Por exemplo, se as regras tiverem que ser feitas antecipadamente em pacotes não desfragmentados, depois (como de costume) com pacotes desfragmentados, apenas registre duas cadeias nftables no pré-roteamento, uma <=
-401
(por exemplo-450
), a outra entre-399
e-201
(por exemplo-300
). O melhor que o iptables podia fazer até recentemente era-300
, ou seja, não conseguia ver pacotes fragmentados sempre que conntrack, portanto, a desfragmentação inicial estava em uso (desde o kernel 4.15 com a opçãoraw_before_defrag
, ele se registrará em-450
vez disso, mas não pode fazer os dois, masiptables-nft
não aparece para oferecer tal escolha).Agora, sobre as interações entre nftables e iptables : ambos podem ser usados juntos, com exceção do NAT em kernels mais antigos, onde ambos competem pelo recurso nat do netfilter: apenas um deve registrar nat, a menos que esteja usando um kernel >= 4.18 conforme explicado no . _ Os exemplos de configurações do nftables são fornecidos com as mesmas prioridades do iptables com pequenas diferenças.
Se o iptables e o nftables forem usados juntos e um deve ser usado antes do outro porque há interações e ordem de efeito necessárias, apenas reduza ou aumente ligeiramente a prioridade do nftables de acordo, já que o iptables não pode ser alterado.
Por exemplo, em uma configuração principalmente de iptables , pode-se usar nftables com um recurso de correspondência específico não disponível em iptables para marcar um pacote e, em seguida, manipular essa marca em iptables , porque ele tem suporte para um alvo específico (por exemplo, o sofisticado alvo de LED do iptables para piscar um led) não disponível em nftables . Apenas registre um valor de prioridade ligeiramente mais baixo para o gancho nftables para ter certeza de que foi feito antes. Para uma regra de filtro de entrada usual, isso seria, por exemplo,
-5
em vez de0
. Então, novamente, esse valor não deve ser menor-149
ou será executado antes do iptables' INPUT cadeia mangle que talvez não seja o que se pretende. Esse é o único outro valor baixo que importaria no caso de entrada. Por exemplo, não háNF_IP_PRI_CONNTRACK
limite a ser considerado, porque o conntrack não registra algo com esta prioridade emNF_INET_LOCAL_IN
, nem o SELinux registra algo neste hook se algo relacionado a ele importa, então-225
não tem nenhum significado especial aqui.