O nivel do núcleo ofrece só unha interface xenérica independente do protocolo que proporciona funcións básicas para extraer datos de paquetes, realizar operacións de datos e controlar o fluxo. As regras de filtrado e os controladores específicos do protocolo compílanse en bytecode no espazo do usuario, despois de que este bytecode cárgase no núcleo mediante a interface Netlink e execútase no núcleo nunha máquina virtual especial que lembra a BPF (Berkeley Packet Filters). Este enfoque permítelle reducir significativamente o tamaño do código de filtrado que se executa a nivel do núcleo e mover todas as funcións de análise de regras e lóxica para traballar con protocolos ao espazo do usuario.
Principais novidades:
- Soporte para rangos en conexións (concatenación, certos paquetes de enderezos e portos que simplifican a comparación). Por exemplo, para un conxunto "lista branca" cuxos elementos son un anexo, especificar a marca "intervalo" indicará que o conxunto pode incluír intervalos no anexo (para o anexo "ipv4_addr . ipv4_addr . inet_service" antes era posible enumerar os intervalos exactos). coincide coa forma "192.168.10.35. 192.68.11.123", e agora pode especificar grupos de enderezos "80-192.168.10.35-192.168.10.40-192.68.11.123"
mesa ip foo {
establecer lista branca {
escriba ipv4_addr . ipv4_addr. servizo_inet
intervalo de bandeiras
elementos = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125. 80}
}barra de cadea {
tipo filtro hook prerouting filtro de prioridade; caída da política;
ip saddr. ip papá. tcp dport @whitelist aceptar
}
} - En conxuntos e listas de mapas, é posible utilizar a directiva "typeof", que determina o formato do elemento ao coincidir.
Por exemplo:mesa ip foo {
establecer lista branca {
tipo de ip saddr
elementos = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}barra de cadea {
tipo filtro hook prerouting filtro de prioridade; caída da política;
ip daddr @whitelist aceptar
}
}mesa ip foo {
mapa addr2mark {
tipo de ip saddr: meta marca
elementos = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - Engadiuse a posibilidade de usar unións nas ligazóns NAT, o que lle permite especificar un enderezo e un porto ao definir transformacións NAT baseadas en listas de mapas ou conxuntos con nome:
nft add rule ip nat pre dnat ip addr . porto a ip saddr mapa { 1.1.1.1 : 2.2.2.2 . trinta}
nft add map ip nat destinations { type ipv4_addr . inet_service: ipv4_addr. servizo_inet \\; }
nft add rule ip nat pre dnat ip addr . porto a ip saddr. tcp dport map @destinations - Soporte para a aceleración de hardware con algunhas operacións de filtrado realizadas pola tarxeta de rede. A aceleración está habilitada a través da utilidade ethtool ("ethtool -K eth0 hw-tc-offload on"), despois de que se activa en nftables para a cadea principal usando a bandeira "descarga". Cando se usa o núcleo Linux 5.6, a aceleración de hardware é compatible para a correspondencia de campos de cabeceira e a inspección da interface entrante en combinación coa recepción, descarte, duplicación (dup) e reenvío (fwd) de paquetes. No seguinte exemplo, as operacións de soltar paquetes procedentes do enderezo 192.168.30.20 realízanse a nivel de tarxeta de rede, sen pasar os paquetes ao núcleo:
# ficheiro cat.nft
táboa netdev x {
cadea y {
tipo filtro gancho dispositivo de entrada eth0 prioridade 10; descarga de bandeiras;
ip saddr 192.168.30.20 soltar
}
}
# nft -f ficheiro.nft - Mellorouse a información sobre a localización dun erro nas regras.
# nft eliminar regra ip yz handle 7
Erro: non se puido procesar a regra: non hai ningún ficheiro ou directorio
eliminar a regra ip yz handle 7
^# nft elimina a regra ip xx handle 7
Erro: non se puido procesar a regra: non hai ningún ficheiro ou directorio
eliminar a regra ip xx handle 7
^# nft eliminar táboa twst
Erro: non hai ningún ficheiro ou directorio; querías dicir a táboa "test" na IP familiar?
eliminar táboa twst
^^^^O primeiro exemplo mostra que a táboa "y" non está no sistema, o segundo que falta o manejador "7" e o terceiro que se mostra un aviso de erro ao escribir o nome da táboa.
- Engadido soporte para comprobar a interface escrava especificando "meta sdif" ou "meta sdifname":
... meta sdifname vrf1 ...
- Engadido soporte para operacións de desprazamento á dereita ou á esquerda. Por exemplo, para cambiar unha etiqueta de paquete existente á esquerda 1 bit e establecer o bit menor en 1:
... meta marca establecer metamarca lshift 1 ou 0x1 ...
- Implementouse a opción "-V" para mostrar información da versión estendida.
# nft -V
nftables v0.9.4 (Jive at Five)
cli:readline
json: si
minigmp: non
libxtables: si - Agora deben especificarse as opcións da liña de comandos antes dos comandos. Por exemplo, cómpre especificar "nft -a list ruleset" e executar "nft list ruleset -a" producirá un erro.
Fonte: opennet.ru