Iptables --tcp-flags : comment ça marche ?

Bonjour,

Je suis en train de bricoler mon firewall, et j’ai une petite question concernant la section “combinaisons impossibles de flags TCP”.

Je m’explique…
On trouve un peu partout sur le net les 11 règles suivantes pour filtrer les paquets TCP invalides : -A INPUT -j DROP -p tcp --tcp-flags ALL ALL -A INPUT -j DROP -p tcp --tcp-flags ALL NONE -A INPUT -j DROP -p tcp --tcp-flags ACK,FIN FIN -A INPUT -j DROP -p tcp --tcp-flags ACK,PSH PSH -A INPUT -j DROP -p tcp --tcp-flags ACK,URG URG -A INPUT -j DROP -p tcp --tcp-flags SYN,FIN SYN,FIN -A INPUT -j DROP -p tcp --tcp-flags SYN,RST SYN,RST -A INPUT -j DROP -p tcp --tcp-flags FIN,RST FIN,RST -A INPUT -j DROP -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -A INPUT -j DROP -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -A INPUT -j DROP -p tcp --tcp-flags ALL FIN,PSH,URG
Or, si j’ai bien compris la doc, le premier argument de --tcp-flags est un masque (opération ET avec les flags du paquet), et le deuxième argument est l’état que ces flags doivent avoir (opération =).

En conséquence de quoi, j’ai comme l’impression qu’il y a des règles redondantes dans ces 11 là.

Par exemple (et si je n’ai pas compris de travers), SYN,FIN SYN,FIN couvre aussi ALL SYN,FIN,PSH,URG et ALL SYN,RST,ACK,FIN,URG, car dans les 3 cas il y a SYN et FIN dans le paquet.
De même, ACK,FIN FIN signifie un FIN sans ACK, ce qui couvre donc ALL FIN,PSH,URG.
Les 3 règles “ALL” que j’ai cité sont donc inutiles du point de vue d’iptables, car redondantes.

J’ai bon ou pas ?

Non pas que ça ait une réelle importance d’enlever ou de laisser ces 3 règles dans mon firewall, mais j’aime bien comprendre ce que je fais et surtout pourquoi.
La vraie question serait donc : si j’ai tort, où est-ce que je me suis planté dans mon analyse ?