Eu criei uma tabela de filtro de rede. Eu tenho isso em um script. Não consigo fazer esse script carregar sempre. Se eu limpar/excluir a tabela, ela não funcionará, se a tabela não existir. Se eu não liberar/excluir, ele mesclará as regras antigas e novas.
Como faço para liberar/excluir se a tabela existir?
#!/usr/sbin/nft -f
flush table my_table
table ip my_table {
chain output {
type filter hook output priority 0; policy accept;
ip daddr 8.8.8.8 counter
ip daddr 1.1.1.1 counter
skuid "other" jump restrict_chain
skuid "d" jump d_chain
}
chain accept_chain {
nftrace set 1 counter accept
}
chain reject_chain {
nftrace set 1 counter reject
}
chain restrict_chain {
#type filter priority 0; policy drop;
counter
ip daddr 1.1.1.1 counter
oifname "lo" jump accept_chain
oifname != "lo" jump reject_chain
}
chain d_chain {
counter
}
}
Primeiro declare uma tabela vazia. Se a tabela já existia, ela não gera erro nem altera seu conteúdo: nada acontece. Se não existisse, a tabela vazia acabou de ser criada. Agora que existe em todos os casos, pode ser excluído. Tudo isso pode ser feito no mesmo conjunto de regras.
Então, declare a tabela sem chain nem regras, então exclua-a (a página man diz que o flushing irá liberar chains e regras, mas isso não irá remover as chains em si, elas apenas serão esvaziadas, o que deixará chains renomeadas antigas ou conjuntos no lugar ou colidir com eles se suas propriedades foram alteradas. O wiki nftables tem mais informações sobre os comportamentos de exclusão e liberação.). Agora você pode realmente criá-lo, ainda no mesmo arquivo de conjunto de regras exclusivo. O mesmo conjunto de regras agora pode ser carregado de forma idempotente várias vezes sem gerar um erro mesmo na primeira vez.
Você pode optar por usar uma
include
instrução para colocar todas essas linhas preparatórias em um arquivo separado, caso haja muitas e você não queira que elas poluam o conjunto de regras.Você pode fazer o mesmo no nível da cadeia, ou seja, sem alterar outras cadeias na mesma mesa, nem supor ou exigir que a mesa e suas cadeias estivessem aqui antes. Aqui está um exemplo para
reject_chain
desativar o nftrace , que não removerá outras tabelas nemmy_table
as cadeias. O exemplo não tem utilidade real, é apenas para dar um exemplo.Nota de compatibilidade: kernels < 3.18 exigiriam tanto flush + delete para funcionar corretamente, conforme explicado no wiki. Isso (e o equivalente para chains) funcionaria até em qualquer versão do kernel: