lanzamiento del filtro de paquetes , que se está desarrollando como un reemplazo de iptables, ip6tables, arptables y ebtables a través de la unificación de las interfaces de filtrado de paquetes para IPv4, IPv6, ARP y puentes de red. El paquete nftables incluye componentes de filtrado de paquetes que operan en el espacio de usuario, mientras que a nivel del núcleo, la funcionalidad es proporcionada por el subsistema nf_tables, que forma parte del núcleo de Linux desde la versión 3.13. Los cambios necesarios para el funcionamiento de la versión nftables 0.9.2 se incluyen en el núcleo de Linux 5.3.
A nivel del núcleo se proporciona solo una interfaz general, independiente del protocolo específico y que ofrece funciones básicas para extraer datos de paquetes, realizar operaciones con los datos y gestionar el flujo. La lógica de filtrado y los controladores específicos del protocolo se compilan en bytecode en el espacio de usuario, después de lo cual este bytecode se carga en el núcleo mediante la interfaz Netlink y se ejecuta en una máquina virtual especial similar a BPF (Berkeley Packet Filters). Este enfoque permite reducir significativamente el tamaño del código de filtrado que opera a nivel del núcleo y trasladar todas las funciones de análisis de reglas y lógica de trabajo con protocolos al espacio de usuario.
Novedades principales:
- Posibilidad de verificar el número de puerto del encabezado del paquete de nivel de transporte independientemente del tipo de protocolo de nivel 4:
add rule x y ip protocol { tcp, udp } th dport 53
- Soporte para la recuperación del tiempo de vida de un conjunto de elementos:
add element ip x y { 1.1.1.1 timeout 30s expires 15s }
- Posibilidad de verificar opciones individuales (lsrr, rr, ssrr y ra) de paquetes IPv4:
add rule x y ip option rr exists drop
Para las opciones de enrutamiento, se puede verificar los campos type, ptr, length y addr:
add rule x y ip option rr type 1 drop
- En las expresiones ahora es permitido especificar prefijos de red y rangos de direcciones:
iifname ens3 snat to 10.0.0.0/28
iifname ens3 snat to 10.0.0.1-10.0.0.15 - Soporte para el uso de variables en las definiciones de cadenas:
define default_policy = accept
add chain ip foo bar { type filter hook input priority filter; policy $default_policy } - La especificación de la prioridad de la cadena ahora puede hacerse tanto en forma numérica como simbólica:
define prio = filter
define prionum = 10
define prioffset = «filter — 150»add table ip foo
add chain ip foo bar { type filter hook input priority $prio; }
add chain ip foo ber { type filter hook input priority $prionum; }
add chain ip foo bor { type filter hook input priority $prioffset; } - Se ha implementado el soporte para el módulo synproxy. Por ejemplo, para proteger el puerto TCP 8888 con synproxy se pueden utilizar el siguiente conjunto de reglas:
tabla ip x {
chain y {
tipo de filtro gancho prerouting prioridad raw; política aceptar;
tcp dport 8888 tcp flags syn notrack
}chain z {
tipo de filtro gancho forward prioridad filtro; política aceptar;
tcp dport 8888 ct estado inválido, no rastreado synproxy mss 1460 \
wscale 7 timestamp sack-perm ct estado inválido drop
}
} - Ahora se pueden definir políticas a través de conjuntos de reglas estándar para determinar en la tabla conntrack conexiones adicionales esperadas relacionadas con la conexión actual, que se aplican en protocolos y escenarios que requieren establecer múltiples conexiones. Por ejemplo, para determinar conexiones esperadas posteriores al puerto TCP 8888 hacia el puerto 5432, se pueden especificar las siguientes reglas:
tabla x {
ct expectativa myexpect {
protocolo tcp
dport 5432
tiempo de espera 1h
tamaño 12
l3proto ip
}cadena de entrada {
tipo de filtro gancho input prioridad 0;
ct estado nuevo tcp dport 8888 ct expectativa set myexpect
ct estado establecido, relacionado contador aceptar
}
}
Fuente: opennet.ru
