Após um ano de desenvolvimento
O nível do kernel fornece apenas uma interface genérica independente de protocolo que fornece funções básicas para extrair dados de pacotes, realizar operações de dados e controlar o fluxo.
A própria lógica de filtragem e os manipuladores específicos do protocolo são compilados em bytecode no espaço do usuário, após o qual esse bytecode é carregado no kernel usando a interface Netlink e executado em uma máquina virtual especial que lembra BPF (Berkeley Packet Filters). Essa abordagem permite reduzir significativamente o tamanho do código de filtragem em execução no nível do kernel e mover todas as funções de análise de regras e lógica para trabalhar com protocolos para o espaço do usuário.
Principais inovações:
- Suporte IPsec, permitindo a correspondência de endereços de túnel com base em pacote, ID de solicitação IPsec e tag SPI (Security Parameter Index). Por exemplo,
... ipsec em ip saddr 192.168.1.0/24
... ipsec em spi 1-65536Também é possível verificar se uma rota passa por um túnel IPsec. Por exemplo, para bloquear tráfego que não seja via IPSec:
… saída do filtro rt ipsec faltando drop
- Suporte para IGMP (Internet Group Management Protocol). Por exemplo, você pode usar uma regra para descartar solicitações recebidas de associação a grupos IGMP
nft adicionar regra netdev foo bar tipo igmp contador de consulta de associação drop
- Possibilidade de utilização de variáveis para definir cadeias de transição (salto/goto). Por exemplo:
definir destino = ber
adicionar regra 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 remetente, você pode usar o comando:
... meta mark set osf ttl pular mapa de nome { "Linux": 0x1,
"Janelas": 0x2,
"Mac OS": 0x3,
"desconhecido": 0x0}
... osf ttl pular versão "Linux:4.20" - Capacidade de combinar 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, você pode usar a seguinte regra:
tabela arp x {
cadeia y {
tipo filtro gancho filtro de prioridade de entrada; política aceita;
arp saddr ip 192.168.2.1 contador pacotes 1 bytes 46
}
} - Suporte para encaminhamento transparente de solicitações através de um proxy (tproxy). Por exemplo, para redirecionar chamadas da porta 80 para a porta proxy 8080:
ip da tabela x {
cadeia y {
digite prioridade de pré-roteamento do gancho de filtro -150; política aceita;
tcp dport 80 tproxy para: 8080
}
} - Suporte para marcação de soquetes com a capacidade de obter ainda mais a marca definida via setsockopt() no modo SO_MARK. Por exemplo:
tabela inet x {
cadeia y {
digite prioridade de pré-roteamento do gancho de filtro -150; política aceita;
tcp dport 8080 marca definir marca de soquete
}
} - Suporte para especificar nomes de texto prioritários para cadeias. Por exemplo:
nft add chain ip x raw {tipo filtro gancho pré-roteamento prioridade raw; }
nft add chain ip x filter {tipo filtro gancho filtro de prioridade de pré-roteamento; }
nft add chain ip x filter_later {tipo filtro gancho pré-roteamento filtro de prioridade + 10; } - Suporte para tags SELinux (Secmark). Por exemplo, para definir a tag "sshtag" em um contexto SELinux, você pode executar:
nft adicionar filtro secmark inet sshtag "system_u:object_r:ssh_server_packet_t:s0"
E então use este rótulo nas regras:
nft adicionar regra inet filtro entrada tcp dport 22 meta secmark set “sshtag”
nft add map inet filter secmapping { tipo inet_service: secmark; }
nft adicionar elemento inet filter secmapping {22: "sshtag"}
nft adicionar regra inet filtro entrada meta secmark definir tcp dport mapa @secmapping - Capacidade de especificar portas atribuídas a protocolos em formato de texto, conforme definidos no arquivo /etc/services. Por exemplo:
nft adicionar regra xy tcp dport "ssh"
conjunto de regras da lista nft -l
tabela x {
cadeia y {
...
porta tcp "ssh"
}
} - Capacidade de verificar o tipo de interface de rede. Por exemplo:
adicionar regra inet pré-roteamento bruto meta iifkind "vrf" aceitar
- Suporte aprimorado para atualização dinâmica do conteúdo de conjuntos, especificando explicitamente o sinalizador “dinâmico”. Por exemplo, para atualizar o conjunto "s" para adicionar o endereço de origem e redefinir a entrada se não houver pacotes por 30 segundos:
adicionar tabela x
adicionar conjunto xs {tipo ipv4_addr; tamanho 128; tempo limite 30s; sinalizadores dinâmicos; }
add chain xy {tipo filtro gancho prioridade de entrada 0; }
adicionar regra xy atualização @s {ip saddr} - Capacidade de definir uma condição de tempo limite separada. Por exemplo, para substituir o tempo limite padrão para pacotes que chegam na porta 8888, você pode especificar:
filtro de ip da tabela {
ct tempo limite agressivo-tcp {
protocolo tcp;
l3protoip;
política = {estabelecido: 100, close_wait: 4, close: 4}
}
cadeia de saída {
...
tcp dport 8888 ct tempo limite definido "tcp agressivo"
}
} - Suporte NAT para família inet:
tabela inet nat {
...
ip6 daddr morto::2::1 dnat to morto:2::99
} - Relatório de erros de digitação aprimorado:
teste de filtro de cadeia nft add
Erro: Esse arquivo ou diretório não existe; você quis dizer “filtro” de tabela no ip da família?
adicionar teste de filtro de cadeia
^^^^^^ - Capacidade de especificar nomes de interface em conjuntos:
definir sc {
digite inet_service. ifname
elementos = { "ssh" . "eth0" }
} - Sintaxe atualizada das regras da tabela de fluxo:
nft adicionar tabela x
nft add flowtable x ft { prioridade de entrada do gancho 0; dispositivos = {eth0, wlan0}; }
...
nft adicionar regra x protocolo IP de encaminhamento {tcp, udp} fluxo adicionar @ft - Suporte JSON aprimorado.
Fonte: opennet.ru