Ya sé que, en el caso hipotético de que la "Gran G" indexe este hilo, apenas lo aprovecharán cuatro frikis. El caso es que, a la hora de hacerme mi propio router neutro, me he enamorado de la nueva criatura que va a reemplazar a IPTABLES en Linux (principalmente por tener una sintaxis mucho más clara y limpia, al estilo de los IPFW o PF de los xBSD y salvando las distancias, que al fin y al cabo Netfilter sigue estando "ahí debajo"); pero resulta que la criatura está a medio hacer, sobre todo en lo que se refiere a documentación.
Me he pasado buena parte de la tarde rompiéndome la cabeza para establecer reglas que inspeccionen las cabeceras de los paquetes TCP y así evitar los ataques DoS/DDoS más comunes. Nftables está preparado para tal cosa, pero la anteriormente mencionada carencia de documentación hace que tengas que ir a ciegas. Lo peor llega cuando su propio wiki pone ejemplos que, luego, no funcionan:
add rule filter output tcp flags "& (syn | ack) == (syn | ack)" counter log # This one doesn't work on Nftables 0.6 ^ Unexpected (
Comando que devuelve un bonito error de sintaxis: "unexpected (" o algo así, señalando a la segunda de las aperturas de paréntesis. Lo malo es que dicho error es, a su vez, reproducido por otros tutoriales; lo que demuestra que la gente copia&pega pero luego no se molesta en comprobar, a la manera de Ana Rosa Q.
Bien, por pura coña he llegado a la sintaxis correcta de ese ejemplo y es la siguiente (el truco está en eliminar el segundo paréntesis):
add rule filter output tcp flags "& (syn | ack) == syn | ack" counter log
Y, por ejemplo, para desechar y registrar en el log los intentos de Xmas Scan:
add rule filter input tcp flags "& (fin | syn | rst | psh | ack | urg) == fin | psh | urg" log drop
Lo he comprobado atacándome a mí mismo con hping3 y ha funcionado. Que, hablando del log de Nftables, es otro dolor de huevos (averiguar que hay que instalar ulogd2 para visualizarlo, sufrir la inoperancia de systemd a la hora de arrancarlo por primera vez...)
Ojalá le sea útil a alguien.