Aqui está um exemplo prático de como atualmente uso um unamed set
tipo de ICMP:
#!/usr/sbin/nft -f
add table filter_4
add chain filter_4 icmp_out_4 {
comment "Output ICMPv4 traffic"
}
define response_icmp_4 = {
0, # Echo Reply
3, # Destination Unreachable
10, # Router Solicitation
11, # Time Exceeded
12, # Parameter Problem
14 # Timestamp Reply
}
# Block ICMP response from localhost
add rule filter_4 icmp_out_4 icmp type $response_icmp_4 drop
O que eu quero fazer é converter isso unamed set
chamado response_icmp_4
em um conjunto nomeado.
Aqui está minha tentativa frustrada de fazer isso:
# Declare named set
add set filter_4 response_icmp_4 { type inet_service }
# Add ICMP type elements
add element filter_4 response_icmp_4 {
0, # Echo Reply
3, # Destination Unreachable
10, # Router Solicitation
11, # Time Exceeded
12, # Parameter Problem
14 # Timestamp Reply
}
A criação do conjunto funciona, mas é recusada durante o processamento da regra:
# Block ICMP response from localhost
add rule filter_4 icmp_out_4 icmp type @response_icmp_4 drop
Com a seguinte saída de erro:
Erro: incompatibilidade de tipo de dados, tipo ICMP esperado, expressão tem tipo serviço de rede de internet
O erro é autoexplicativo, mas a questão é: o que type
devo especificar? porque type inet_service
não funciona.
De acordo com os documentos, as expressões válidas type
sãoipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark
Também é possível especificar typeof
a derivação automática do tipo de dados, mas isso não funciona tão bem, por exemplo:
add set filter_4 response_icmp_4 { typeof vlan id }
Quais erros com erro semelhante:
Erro: incompatibilidade de tipo de dados, tipo ICMP esperado, expressão tem tipo inteiro
O que é um erro estranho porque ICMP type
É um número inteiro.
Se você também puder criar um link para a documentação explicando isso, isso seria útil porque não consigo encontrá-lo.
A declaração do conjunto nomeado deve corresponder ao tipo com o qual compará-la. Um tipo ICMP não é um serviço inet:
o que significa uma porta. Compatível, por exemplo, com:
Portanto, ao adicionar a regra, o nftables reclama:
Quanto a descobrir o tipo de ICMP, a partir da regra (payload expression/typeof)
icmp type
:levando a (tipo de dados/tipo)
icmp_type
:Esse:
deve ser substituído por:
ou, em vez de
type
usartypeof
(que geralmente corresponde ao que é usado no conjunto de regras, é mais fácil de descobrir e que também pode ser usado diretamente como acima paranft describe
descobrir o equivalentetype
):