lanzamiento del filtro de paquetes , que se está desarrollando como un reemplazo de iptables, ip6tables, arptables y ebtables mediante la unificación de las interfaces de filtrado de paquetes para IPv4, IPv6, ARP y puentes de red. El paquete nftables incluye componentes del filtro de paquetes que funcionan en el espacio de usuario, mientras que a nivel del núcleo, la funcionalidad está garantizada 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 nftables 0.9.5 se incluyen en el núcleo. .
A nivel del núcleo, se proporciona solo una interfaz general, que no depende de un protocolo específico y ofrece funciones básicas para extraer datos de paquetes, realizar operaciones sobre los datos y gestionar el flujo. Las reglas de filtrado específicas y los controladores para protocolos se compilan en bytecode en el espacio de usuario, y luego este bytecode se carga en el núcleo a través de la interfaz Netlink y se ejecuta en el núcleo 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:
- Se ha añadido soporte para contadores de paquetes y tráfico vinculados a los elementos del conjunto. Los contadores se activan mediante la palabra clave «counter»:
tabla ip x {
set y {
typeof ip saddr
counter
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}chain z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
} - Para establecer valores iniciales para los contadores, por ejemplo, para restaurar contadores anteriores después de un reinicio, se puede usar el comando «nft -f»:
# cat ruleset.nft
tabla ip x {
set y {
typeof ip saddr
counter
elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
counter p 192.168.10.135 counter packets 0 bytes 0 }
}chain z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
}
# nft -f ruleset.nft
# nft list ruleset
tabla ip x {
set y {
typeof ip saddr
counter
elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
counter p 192.168.10.135 counter packets 0 bytes 0 }
}chain z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
} - El soporte para contadores también se ha añadido en flowtable:
table ip foo {
flowtable bar {
hook ingress priority -100
devices = { eth0, eth1 }
counter
}chain forward {
type filter hook forward priority filter;
flow add @bar counter
}
}Se puede ver la lista de contadores con el comando «conntrack -L»:
tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 packets=9 bytes=608 \
src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
packets=1005763 bytes=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
packets=967505 bytes=50310268 [OFFLOAD] mark=0 secctx=null use=2 - En los conjuntos de uniones (concatenación, ciertas combinaciones de direcciones y puertos que simplifican la coincidencia) se ha habilitado la posibilidad de usar la directiva «typeof», que define el tipo de datos de los elementos para las partes constitutivas de los elementos del conjunto:
table ip foo {
set whitelist {
typeof ip saddr . tcp dport
elements = { 192.168.10.35 . 80, 192.168.10.101 . 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr . tcp dport @whitelist accept
}
} - La directiva typeof ahora también es aplicable para uniones en listas de mapas:
table ip foo {
map addr2mark {
typeof ip saddr . tcp dport : meta mark
elements = { 192.168.10.35 . 80 : 0x00000001,
192.168.10.135 . 80 : 0x00000002 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
meta mark set ip daddr . tcp dport map @addr2mark accept
}
} - Se ha añadido soporte para uniones con rangos en conjuntos anónimos (sin nombre):
# nft add rule inet filter input ip daddr . tcp dport \
{ 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8 . 80-443 } accept - Se ha proporcionado la posibilidad de descartar paquetes con las banderas 802.1q (VLAN) al procesar puentes de red:
# nft add rule bridge foo bar ether type vlan reject with tcp reset
- Se ha añadido soporte para coincidencia por identificación de sesión TCP (conntrack ID). Para determinar el conntrack ID se puede utilizar la opción «—output id»:
# conntrack -L —output id
udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 packets=2 \
bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
[ASSURED] mark=0 use=1 id=2779986232# nft add rule foo bar ct id 2779986232 counter
Fuente: opennet.ru
