nftables matches: algunos selectores útiles
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
- Dirección IP:
- Un rango de valores, por ejemplo:
- Rango de direcciones:
{ 192.168.10.100-192.168.10.200 }
- Rango de valores:
100-200
- Rango de direcciones:
- Lista de valores, por ejemplo:
- Interfaces de red:
{ enp2s0, eth0 }
- Puertos:
{ 22, 443, 110 }
- Cantidades:
{ 100, 200, 300 }
- Protocolos:
{ tcp, udp, udplite }
- Interfaces de red:
!=
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 origen | ip saddr VALOR Donde la IP puede o no contener la /mask |
Dirección IP de destino | ip daddr VALOR Donde la IP puede o no contener la /mask |
Versión del protocolo | ip version 4 |
Time to live | ip ttl VALOR |
Protocolo encapsulado en IP | ip protocol VALOR Valores posibles: icmp , esp , ah , comp , udp , udplite , tcp , dccp , sctp |
Longitud total | ip length VALOR |
Longitud del header | ip hdrlength VALOR |
IPv6 (ip6
)
Dirección IP de origen | ip6 saddr VALOR Donde la IP puede o no contener la /mask |
Dirección IP de destino | ip6 daddr VALOR Donde la IP puede o no contener la /mask |
Versión del protocolo | ip6 version 6 |
Cantidad de saltos | ip6 hoplimit VALOR |
Siguiente cabecera | ip6 nexthdr VALOR Valores posibles: icmp , esp , ah , comp , udp , udplite , tcp , dccp , sctp |
Longitud del payload | ip6 length VALOR |
TCP (tcp
)
Puerto destino | tcp dport VALOR |
Puerto origen | tcp sport VALOR |
Número de secuencia | tcp sequence VALOR |
Número de Achnowledgement | tcp ackseq VALOR |
Flags | tcp flags VALOR Valores posibles: fin , syn , rst , psh , ack , urg , ecn , cwr |
UDP (udp
)
Puerto destino | udp dport VALOR |
Puerto origen | udp sport VALOR |
Longitud del segmento | udp length VALOR |
ICMP e ICMPv6 (icmp
/icmpv6
)
(para ICMPv6 cambiar «icmp
» por «icmpv6
» en los ejemplos)
Tipo del mensaje | icmp 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 mensaje | icmp code VALOR |
MTU del paquete | icmp mtu VALOR |
Ethernet (ether
)
Dirección MAC destino | ether daddr VALOR |
Dirección MAC origen | ether saddr VALOR |
Tipo de trama | ether 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 entrada | meta iif VALOR |
Índice de la interfaz de salida | meta oif VALOR |
Nombre de la interfaz de entrada | meta iifname "VALOR" |
Nombre de la interfaz de salida | meta oifname "VALOR" |
Tipo de interfaz de entrada | meta iiftype VALOR Valores posibles: ether , ppp , ipip , ipip6 , loopback , sit , ipgre |
Tipo de interfaz de salida | meta oiftype VALOR Valores posibles: ether , ppp , ipip , ipip6 , loopback , sit , ipgre |
Ethertype protocol | meta protocol VALOR Valores posibles: ip , arp , ip6 , vlan |
Protocolo de capa 4 | meta l4proto VALOR |
Familia de protocolos de Netfilter (ipv4, ipv6, etc) | meta nfproto VALOR Valores posibles: ipv4 , ipv6 |
Tipo de paquete | meta 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!!