Usar sets em nftables é muito legal. Atualmente, estou usando muitas instruções como estas em meus conjuntos de nftables.conf
regras:
iifname {clients0, dockernet} oifname wan0 accept \
comment "Allow clients and Docker containers to reach the internet"
Na regra acima {clients0, dockernet}
está um conjunto anônimo (inline) de interfaces. Em vez de repetir as regras repetidamente, gostaria de definir um conjunto de interfaces na parte superior do arquivo, chamado de conjunto nomeado em nftables. A página de manual (Debian Buster) mostra como fazer isso para vários tipos de conjuntos: ipv4_addr , ipv6_addr , ether_addr , inet_proto , inet_service e mark . No entanto, parece que não está disponível para interfaces por nome ou tipo primitivo simples, como strings.
Eu tenho a abordagem abaixo, mas isso não funciona com os erros fornecidos:
Omitindo o tipo:
table inet filter { set myset { elements = { clients0, dockernet, } } [...] }
Resultado:
Error: set definition does not specify key
.Usando o
string
tipo:table inet filter { type string; set myset { elements = { clients0, dockernet, } } [...] }
Resultado:
Error: unqualified key type string specified in set definition
.
Não há realmente nenhuma maneira de nomear o conjunto anônimo que mostrei no topo?
Procurando na fonte pela versão 0.9.0 :
[...]
[...]
e, em seguida, procurando onde eles estão definidos :
[...]
é possível descobrir que os tipos necessários são
iface_index
(por exemplo:iif lo
) eifname
(por exemploiifname "lo"
), mesmo que (no momento de escrever esta resposta) não esteja documentado nanft
página man do .Observe que o suporte a curingas ifname em um conjunto foi adicionado em 2022-05-31 em nftables 1.0.3 . Um conjunto nomeado deve ser usado
flags intervals
e o caractere curinga final é*
(não+
como em iptables ).O tipo de dados do elemento pode ser facilmente encontrado usando
nft
assim:Você vê isso
ifname
eiface_index
são os tipos possíveis, então você pode apenas declarar :No exemplo acima, você pode até escrever
typeof iifname
em vez detype ifname
se não souber sobre o tipo (requernft
v0.9.4 ou superior).