O que é o Nftables
Da página oficial:
"O Nftables substitui os populares {ip,ip6,arp,eb}tables. Este software fornece uma nova estrutura de classificação de pacotes no kernel baseada em uma máquina virtual (VM) específica para a rede e uma nova ferramenta de linha de comando (nft) que atua no espaço do usuário. O Nftables reutiliza os subsistemas Netfilter existentes como a infraestrutura de hook (gancho), o sistema de rastreamento de conexão, NAT, enfileiramento de espaço do usuário e subsistema de registro. Este software também fornece a libnftables, a biblioteca de espaço do usuário de alto nível que inclui suporte para JSON. Consulte man (3)libnftables para obter mais informações."
O Nftables é um filtro de pacotes, como o Iptables, e está disponível no
Linux desde 2014, desde o kernel 3.13; porém, somente nos últimos 2 anos começou a ganhar adeptos.
Para instalar é bem simples, basta dar o comando adequado à sua distribuição:
Debian e derivados:
# apt-get install nftables
ou
# apt install nftables
ou
# aptitude install nftables
Red Hat e derivados (CentOS, Fedora, etc):
# yum install nftables
ou
# dnf install nftables
OpenSuse Tumbleweed:
# zypper addrepo https://download.opensuse.org/repositories/security:netfilter/openSUSE_Tumbleweed/security:netfilter.repo
# zypper refresh
# zypper install nftables
No link abaixo encontramos como instalar em várias distribuições:
Nftables from distributions - nftables wiki
Dependendo da distribuição, o arquivo nftables.conf estará em um diretório diferente:
- /etc/sysconfig/nftables.conf
- /etc/nftables/nftables.conf
- /etc/nftables.conf
Você pode usar o seguinte comando para encontrá-lo em qualquer distribuição:
# find / -type f -name nftables.conf
Após configurar o script nftables.conf, você pode salvar o script:
# nft list ruleset > /home/nftables.conf.bkp
Lembrando que o comando acima salvará somente as regras sem os comentários do script.
Porém, você pode criar uma cópia completa:
# cp /etc/nftables.conf /home/nftables.conf.bkp
Algumas diferenças importantes entre Nftables e Iptables:
1) O Nftables usa uma nova sintaxe:
A ferramenta de linha de comando do Iptables usa um analisador baseado em getopt_long() onde as chaves (key) são sempre precedidas por dois sinais de menos, por exemplo, --chave (--key) ou um único sinal de menos, por exemplo, -p tcp.
Em contraste, o Nftables usa uma sintaxe compacta inspirada no tcpdump.
2) Tabelas (tables) e correntes (ou cadeias, chains) são totalmente configuráveis:
O Iptables possui várias tabelas (tables) e correntes (chains) de base pré-definidas, todas registradas, mesmo que você precise apenas de uma delas. Houve relatos de cadeias (chains) de base não utilizadas prejudicando o desempenho.
Com o Nftables não há tabelas (tables) ou correntes (chains) pré-definidas.
Cada tabela é explicitamente definida e contém apenas os objetos (chains, sets, maps, flowtables e stateful objects) que você adiciona explicitamente a ela, ou seja, cada tabela terá somente os objetos (chains, sets, maps, flowtables e stateful objects) que você criar nela.
As tabelas são contêineres para cadeias (ou correntes), conjuntos (sets) e objetos com estado (stateful objects).
As chains, por sua vez, são contêineres para regras.
Os mapas armazenam dados com base em alguma chave específica usada como entrada. Eles são identificados exclusivamente por um nome definido pelo usuário e anexados às tabelas. Map (mapa), no caso, não devemos racionar com a palavra "mapa" em Português no sentido de carta geográfica, devemos racionar no sentido de mapear, traçar e armazenar dados.
O vmap (mapa de veredictos) funciona de forma análoga à instrução map, mas contém veredictos como valores. Veredictos aqui devemos racionar no sentido de decisão, no vmap colocamos uma tomada de decisão para o Nftables, ou seja, dizemos o que queremos que ele faça numa determinada regra.
Na página 2 teremos exemplos.
3) Agora você registra apenas as correntes (chains) de base que você precisa:
Você escolhe nomes de tabelas e correntes e prioridades de gancho (hook) do Netfilter que implementam com eficiência o processamento dos pacotes.
4) Uma única regra Nftables pode executar várias ações:
Em vez das correspondências e ações de destino único usadas no Iptables, uma regra Nftables consiste em zero ou mais expressões seguidas por uma ou mais instruções. Cada expressão testa se um pacote corresponde a um campo de carga útil específico ou metadados de fluxo/pacote.
5) Várias expressões são avaliadas linearmente da esquerda para a direita:
Se a primeira expressão corresponder, a próxima expressão será avaliada e assim por diante. Se atingirmos a expressão final, o pacote corresponderá a todas as expressões da regra e as instruções da regra serão executadas. Cada instrução executa uma ação como definir a marca netfilter, contar o pacote, registrar o pacote ou emite um veredicto como aceitar ou descartar o pacote ou pular para outra correntes (chain).
Assim como as expressões, várias declarações são avaliadas linearmente da esquerda para a direita: uma única regra pode executar várias ações usando várias instruções.
Observe que uma declaração de veredicto por sua natureza encerra a regra.
6) Não vem com contador (counter) embutido nas correntes (chain) e regras (rules):
No Nftables os contadores são opcionais, você pode ativá-los conforme necessário.
Um contador conta o número total de pacotes e o total de bytes vistos desde a última reinicialização. Com o Nftables você precisa especificar explicitamente um contador para cada regra que deseja contar.
O valor do contador, quando tiver, pode ser qualquer valor inteiro positivo de 64 bits.
Tem contadores anônimos e contadores nomeados. Anônimos são aqueles que não levam nome.
Um contador anônimo é local para a única regra em que aparece.
O exemplo a seguir usa um contador anônimo para contar todo o tráfego TCP roteado para o host local:
table ip counter_demo {
chain IN {
type filter hook input priority filter; policy drop;
protocol tcp counter # Veja que somente vai counter, sem nome, e vale para somente esta regra
}
}
Contadores nomeados (named counters) podem ser usados em várias regras:
table inet named_counter_demo {
counter cnt_http {
comment "count both http and https packets"
}
counter cnt_smtp {
}
chain IN {
type filter hook input priority filter; policy drop;
tcp dport 25 counter name cnt_smtp # Veja que o contador recebe um nome à escolha do autor do script e pode ser usado em várias regras
tcp dport 80 counter name cnt_http
tcp dport 443 counter name cnt_http
}
}
7) Melhor suporte para atualizações dinâmicas do conjunto de regras (ruleset):
Em contraste com o blob monolítico usado pelo Iptables, os conjuntos de regras do Nftables são representados internamente em uma lista encadeada.
Agora adicionar ou excluir uma regra deixa o restante do conjunto de regras intocado simplificando a manutenção das informações do estado interno do filtro de pacotes.
8) Administração IPv4/IPv6 de pilha dupla simplificada:
A família inet Nftables permite que você registre correntes (chains) de base que enxergam o tráfego IPv4 e IPv6.
Não é mais necessário depender de scripts para duplicar seu conjunto de regras.
9) Nova infraestrutura de conjunto genérico:
Essa infraestrutura integra-se perfeitamente ao núcleo do Nftables e permite configurações avançadas como mapas , mapas de vereditos e intervalos para alcançar a classificação de pacotes orientada ao desempenho. O mais importante é que você pode usar qualquer seletor compatível para classificar o tráfego.
10) Suporte para concatenações:
Desde o kernel Linux 4.1 você pode concatenar várias chaves e combiná-las com mapas e mapas de veredictos (vmap). A ideia é construir uma tupla cujos valores são "hashados" para obter a próxima ação a ser executada.
11) Suporte a novos protocolos sem atualização de kernel:
Atualizações de kernel podem ser uma tarefa demorada e assustadora, especialmente se você tiver que manter mais de um único firewall em sua rede. Os kernels das distribuições geralmente ficam para trás em relação ao lançamento mais recente. Com a nova abordagem de máquina virtual Nftables o suporte a um novo protocolo geralmente não requer um novo kernel, apenas uma atualização relativamente simples da ferramenta nft no espaço do usuário.
Quando uma mudança no conjunto de regras é feita no Iptables, toda a configuração é esvaziada e reescrita. O Nftables resolveu este problema representando o conjunto de regras como uma lista ligada permitindo adicionar novas regras sem tocar nas existentes.
Elenquei 11 com base na página oficial do Nftables, mas tem várias outras novidades no Nftables.
A estrutura do Iptables se tornou um pouco complicada com iptables, ip6tables, arptables e ebtables, todos fornecendo funções diferentes, mas semelhantes.
Por exemplo, é simplesmente ineficiente criar regras IPv4 no iptables e regras IPv6 em ip6tables e manter as duas sincronizadas.
O Nftables visa substituir tudo isso e visa ser uma solução centralizada.
Tanto no Iptables como no Nftables você pode numerar as regras que elas serão executadas na ordem de numeração e não na ordem de posição, por exemplo:
table inet filter {
chain input {
type filter hook input priority 0; policy accept;
ct state vmap { invalid : drop, established : accept, related : accept }
}
chain forward {
type filter hook forward priority -1; policy accept;
}
chain output {
type filter hook output priority 1; policy accept;
}
}
A regra da chain forward (priority -1) será executada primeiro, depois a regra da chain input (priority 0) e por último da chain output (priority 1).
O Nftables aceita numeração negativa e executa em ordem crescente: -1, 0 e 1.