Após um ano de desenvolvimento lançamento do filtro de pacotes , que está em desenvolvimento como substituto do iptables, ip6tables, arptables e ebtables, através da unificação das interfaces de filtragem de pacotes para IPv4, IPv6, ARP e pontes de rede. O pacote nftables inclui componentes do filtro de pacotes que operam no espaço do usuário, enquanto no nível do kernel, a operação é garantida pela subsistema nf_tables, integrado ao kernel Linux desde a versão 3.13.
No nível do kernel, é fornecida apenas uma interface geral que não depende de um protocolo específico e oferece funções básicas para extração de dados de pacotes, execução de operações sobre dados e controle de fluxo.
A lógica de filtragem e os manipuladores específicos de protocolos são compilados em bytecode no espaço do usuário, após o que esse bytecode é carregado no kernel através da interface Netlink e executado em uma máquina virtual especial, semelhante ao BPF (Berkeley Packet Filters). Essa abordagem permite reduzir significativamente o tamanho do código de filtragem que opera no nível do kernel e deslocar todas as funções de análise de regras e lógica de funcionamento com protocolos para o espaço do usuário.
Principais novidades:
- Suporte ao IPsec, que permite a correspondência de endereços de túneis em relação ao pacote, ao identificador de solicitação do IPsec e à etiqueta SPI (Security Parameter Index). Por exemplo,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Também é possível verificar a passagem da rota através do túnel IPsec. Por exemplo, para bloquear o tráfego que não passa pelo IPSec:
… filter output rt ipsec missing drop
- Suporte ao protocolo IGMP (Internet Group Management Protocol). Por exemplo, para descartar consultas de pertencimento a grupos IGMP, pode-se usar a regra
nft add rule netdev foo bar igmp type membership-query counter drop
- Possibilidade de usar variáveis para definir cadeias de transição (jump / goto). Por exemplo:
define dest = ber
add rule ip foo bar jump $dest - Suporte a máscaras para identificar sistemas operacionais (OS Fingerprint) com base nos valores TTL no cabeçalho. Por exemplo, para marcar pacotes com base no sistema operacional do remetente, pode-se usar o comando:
… meta mark set osf ttl skip name map { «Linux» : 0x1,
«Windows» : 0x2,
«MacOS» : 0x3,
«unknown» : 0x0 }
… osf ttl skip version «Linux:4.20» - Possibilidade de correspondência entre o endereço ARP do remetente e o endereço IPv4 do sistema de destino. Por exemplo, para aumentar o contador de pacotes ARP enviados do endereço 192.168.2.1 pode-se usar a regra:
table arp x {
chain y {
tipo de filtro gancho entrada prioridade filtro; política aceitar;
arp saddr ip 192.168.2.1 contador pacotes 1 bytes 46
}
} - Suporte para encaminhamento transparente de solicitações através de proxy (tproxy). Por exemplo, para redirecionar solicitações da porta 80 para a porta proxy 8080:
table ip x {
chain y {
tipo de filtro gancho prerouting prioridade -150; política aceitar;
tcp dport 80 tproxy para :8080
}
} - Suporte para marcação de sockets com a possibilidade de recuperar a marca estabelecida através de setsockopt() no modo SO_MARK. Por exemplo:
tabela inet x {
chain y {
tipo de filtro gancho prerouting prioridade -150; política aceitar;
tcp dport 8080 marca definir socket mark
}
} - Suporte para especificar nomes textuais de prioridades para cadeias. Por exemplo:
nft adicionar cadeia ip x raw { tipo filtro gancho prerouting prioridade raw; }
nft adicionar cadeia ip x filter { tipo filtro gancho prerouting prioridade filter; }
nft adicionar cadeia ip x filter_later { tipo filtro gancho prerouting prioridade filter + 10; } - Suporte para rótulos SELinux (Secmark). Por exemplo, para definir o rótulo «sshtag» em anexo ao contexto SELinux, você pode executar:
nft adicionar secmark inet filter sshtag «system_u:object_r:ssh_server_packet_t:s0»
E então usar este rótulo nas regras:
nft adicionar regra inet filter entrada tcp dport 22 meta secmark set «sshtag»
nft adicionar mapa inet filter secmapping { tipo inet_service : secmark; }
nft adicionar elemento inet filter secmapping { 22 : «sshtag» }
nft adicionar regra inet filter entrada meta secmark set tcp dport mapa @secmapping - Capacidade de especificar portas associadas a protocolos em formato textual, como são definidas no arquivo /etc/services. Por exemplo:
nft adicionar regra x y tcp dport «ssh»
nft listar regraset -l
tabela x {
chain y {
…
tcp dport «ssh»
}
} - Capacidade de verificar o tipo de interface de rede. Por exemplo:
adicionar regra inet raw prerouting meta iifkind «vrf» aceitar
- Suporte melhorado para atualização dinâmica do conteúdo de conjuntos (sets) através da especificação explícita do sinalizador «dynamic». Por exemplo, para atualizar o conjunto «s» com a adição do endereço de origem e redefinir a entrada em caso de ausência de pacotes por 30 segundos:
adicionar tabela x
adicionar conjunto x s { tipo ipv4_addr; tamanho 128; tempo limite 30s; sinalizadores dinâmicos; }
adicionar cadeia x y { tipo filtro gancho entrada prioridade 0; }
adicionar regra x y atualizar @s { ip saddr } - Capacidade de definir uma condição separada para o início do tempo limite. Por exemplo, para redefinir o tempo limite padrão para pacotes que chegam à porta 8888, pode-se especificar:
tabela ip filter {
ct timeout agressive-tcp {
protocolo tcp;
l3proto ip;
política = {established: 100, close_wait: 4, close: 4}
}
cadeia saída {
…
tcp dport 8888 ct timeout set «agressive-tcp»
}
} - Suporte NAT para a família inet:
tabela inet nat {
…
ip6 daddr dead::2::1 dnat para dead:2::99
} - Ferramentas de saída aprimoradas para informações de erro devido a erros de digitação:
nft adicionar cadeia filtre test
Erro: Arquivo ou diretório não encontrado; você quis dizer tabela «filter» na família ip?
adicionar cadeia filtre test
^^^^^^ - Capacidade de especificar nomes de interfaces em conjuntos (sets):
conjunto sc {
tipo inet_service . ifname
elementos = { «ssh» . «eth0» }
} - Sintaxe de regras flowtable atualizada:
nft adicionar tabela x
nft adicionar flowtable x ft { gancho ingress prioridade 0; dispositivos = { eth0, wlan0 }; }
…
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Apoio ao JSON melhorado.
Fonte: opennet.ru
