Eu acho que você tem esse switch confuso.
A opção --tcp-flags
aceita apenas dois argumentos. O primeiro argumento é quais sinalizadores devem ser verificados. O segundo argumento é o sinalizador do primeiro argumento que deve ser definido para uma correspondência. Assim sua linha:
-p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
Está dizendo: "Corresponder se somente o sinalizador SYN estiver definido a partir desses quatro. (O espaço separa o primeiro e o segundo argumentos.)
-p tcp --tcp-flags ALL SYN -j DROP
significa verificar todos os flags e corresponder a esses pacotes com o conjunto SYN nada mais que . O terceiro dos seus exemplos é uma sintaxe ruim, já que fornece três argumentos. Sua primeira regra derrubaria todas as novas conexões TCP, o que provavelmente não é o que você deseja.
O switch é usado principalmente para descartar pacotes com flags TCP sem sentido definidos. Você não conseguiria, por exemplo, pacotes legítimos com o conjunto SYN e RST, por exemplo, ou SYN e FIN. Pegue este snippet em um dos meus * scripts de firewall:
${IPTABLES} -t filter -A INETIN -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
${IPTABLES} -t filter -A INETIN -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
${IPTABLES} -t filter -A INETIN -p tcp --tcp-flags SYN,URG SYN,URG -j DROP
Eles verificam combinações específicas de sinalizadores TCP que nunca devem ocorrer naturalmente e descartam os pacotes.
Mais leituras na página do manual .
* (versão ajustada do monmotha-2.3.8)