nftables matches: algunos selectores útiles

Publicado por Diego Córdoba el

Veamos en este artículo una pequeña guía sobre los matches, o los selectores, o coincidencias, que podemos utilizar para filtrar tráfico en nftables.

Cuando usamos un firewall para filtrar tráfico de red debemos, en primer lugar, identificar el tipo de tráfico que queremos filtrar.

Por ejemplo, si querremos denegar todo el tráfico que pasa por el firewall, y aceptar únicamente conexiones que provengan de la LAN, con destino a servidores HTTPS en Internet, deberemos aceptar explícitamente paquetes con cierta dirección IP de origen, y con determinado puerto TCP destino.

Esto podemos hacerlo con diversos campos selectores, o matches, en las reglas de nuestro firewall.

Nftables posee gran cantidad de matches para filtrar tráfico de red cubriendo casi todas nuestras necesidades.

Si ya hemos creado las tablas y cadenas, solamente nos restará añadir las reglas donde correspondan.

Estas reglas nos permitirán seleccionar diferentes tipos de tráfico de red, y aplicar alguna acción puntual, como aceptarlo, descartarlo, etc.

Vamos a ver en este artículo algunos matches que podemos utilizar para seleccionar el tipo de tráfico según diferentes protocolos de red.

Los valores

Antes de seguir, para simplificar la lista y que no sea demasiado extensa, utilicé la palabra «VALOR» para hacer referencia al valor del patrón de selección de tráfico (dirección IP, puerto, etc).

Dependiendo de la regla y el selector que estemos usando, los valores podrán ser:

  • Un valor individual, por ejemplo
    • Dirección IP: 1.1.1.1
    • Cantidad (ej, TTL): 123
  • Un rango de valores, por ejemplo:
    • Rango de direcciones: { 192.168.10.100-192.168.10.200 }
    • Rango de valores: 100-200
  • Lista de valores, por ejemplo:
    • Interfaces de red: { enp2s0, eth0 }
    • Puertos: { 22, 443, 110 }
    • Cantidades: { 100, 200, 300 }
    • Protocolos: { tcp, udp, udplite }

!= para «distinto»

A su vez, todos los valores pueden ir precedidos por != para indicar «distinto«, por ejemplo:

ip saddr 1.1.1.1 coincide con todos los paquetes cuya dirección IP de origen sea 1.1.1.1, mientras que ip saddr != 1.1.1.1 coincide con todos los paquetes cuya dirección IP NO sea 1.1.1.1.

El operador != puede utilizarse para cualquiera de los valore antes mencionados (listas, rangos, o valores individuales).

Matches útiles

En general, salvo los meta, los matches se corresponden con los campos de las cabeceras de los protocolos del stack TCP/IP.

Una importante aclaración: si bien podemos configurar nuestro firewall utilizando los campos básicos de los protocolos, para realizar un trabajo profesional y reducir las brechas de seguridad en la red, es importante conocer las bases de funcionamiento de TCP/IP y los principales protocolos del stack.

Veamos un resumen de algunos matches útiles para los principales protocolos de TCP/IP.

¿Son los únicos? No, existen muchos, al final les comento cómo encontrar más 🙂

IPv4 (ip)

Dirección IP de origenip saddr VALOR
Donde la IP puede o no contener la /mask
Dirección IP de destinoip daddr VALOR
Donde la IP puede o no contener la /mask
Versión del protocoloip version 4
Time to liveip ttl VALOR
Protocolo encapsulado en IPip protocol VALOR
Valores posibles: icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp
Longitud totalip length VALOR
Longitud del headerip hdrlength VALOR

IPv6 (ip6)

Dirección IP de origenip6 saddr VALOR
Donde la IP puede o no contener la /mask
Dirección IP de destinoip6 daddr VALOR
Donde la IP puede o no contener la /mask
Versión del protocoloip6 version 6
Cantidad de saltosip6 hoplimit VALOR
Siguiente cabeceraip6 nexthdr VALOR
Valores posibles: icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp
Longitud del payloadip6 length VALOR

TCP (tcp)

Puerto destinotcp dport VALOR
Puerto origentcp sport VALOR
Número de secuenciatcp sequence VALOR
Número de Achnowledgementtcp ackseq VALOR
Flagstcp flags VALOR
Valores posibles: fin, syn, rst, psh, ack, urg, ecn, cwr

UDP (udp)

Puerto destinoudp dport VALOR
Puerto origenudp sport VALOR
Longitud del segmentoudp length VALOR

ICMP e ICMPv6 (icmp/icmpv6)

(para ICMPv6 cambiar «icmp» por «icmpv6» en los ejemplos)

Tipo del mensajeicmp type VALOR
Valores posibles: echo-reply, destination-unreachable, source-quench, redirect, echo-request, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply, router-advertisement, router-solicitation
Código del mensajeicmp code VALOR
MTU del paqueteicmp mtu VALOR

Ethernet (ether)

Dirección MAC destinoether daddr VALOR
Dirección MAC origenether saddr VALOR
Tipo de tramaether type VALOR
Valores posibles: vlan, 802.1q, 802.1ad, arp, ipv4, ipv6

Meta information (meta)

Aquí tenemos varios selectores de meta-info de los paquetes de red, como la interfaz por la que entraron, el tipo de interfaz, etc.

Las expresiones meta pueden ser de dos tipos:

  • Cualificadas: requieren de la palabra meta delante del parámetro.
  • No cualificadas: pueden especificarse directamente, sin la palabra meta (es opcional)
índice de la interfaz de entradameta iif VALOR
Índice de la interfaz de salidameta oif VALOR
Nombre de la interfaz de entradameta iifname "VALOR"
Nombre de la interfaz de salidameta oifname "VALOR"
Tipo de interfaz de entradameta iiftype VALOR
Valores posibles: ether, ppp, ipip, ipip6, loopback, sit, ipgre
Tipo de interfaz de salidameta oiftype VALOR
Valores posibles: ether, ppp, ipip, ipip6, loopback, sit, ipgre
Ethertype protocolmeta protocol VALOR
Valores posibles: ip, arp, ip6, vlan
Protocolo de capa 4meta l4proto VALOR
Familia de protocolos de Netfilter (ipv4, ipv6, etc)meta nfproto VALOR
Valores posibles: ipv4, ipv6
Tipo de paquetemeta pkttype VALOR
Valores posibles: broadcast, unicast, multicast

Otros protocolos y headers

Estos protocolos y campos que listé son algunos interesantes para comenzar a jugar con nftables y el filtrado de tráfico, pero no son los únicos protocolos, ni campos dentro de cada uno.

También podemos filtrar otros protocolos, como udplite, sctp, dccp, ah, esp, comp, etc. Para ver la lista completa sólo basta visitar la wiki de nftables.

Y, por supuesto, en GNU/Linux también tenemos la documentación 😛

$ man nft

Conclusiones: nftables matches

Este post surgió más como una ayuda para mi, ya que estoy migrando desde iptables a nftables, y necesitaba una breve guía de los principales campos y selectores que suelo utilizar en mis firewalls.

Además, es contenido complementario para nuestros alumnos 🙂

He intentado estructurarlo para que sea fácil de recordar, y por esto puede que haya omitido algunas excepciones en algunos matches… si los prueban y algo no funciona como debería, por favor me avisan así lo corregimos!

Y como siempre, si algo no se entiende, me comentan en el grupo de Telegram de la comunidad!!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: Sin categoría

Diego Córdoba

- Ingeniero en Informática - Mgtr. Teleinformática - Instructor GNU/Linux, Programación, Redes TCP/IP, criptografía y ciberseguridad. - (Ex) Docente universitario e investigador