web-dev-qa-db-fra.com

Besoin d'aide avec la règle des tables IP pour filtrer par hex

Je suis en train de mettre en place un serveur et je dois faire une configuration spécifique. Je dois déposer un paquet spécifique qui commence toujours par XX 01. Je peux le faire, avec cette règle:

Sudo iptables -A INPUT  -p tcp --dport XXXX -m string --hex-string '|XX 01|' --algo bm -j REJECT

Mais le problème est que iptables commence à lire le premier caractère HEX, ainsi, il génère parfois des faux positifs.
Je veux dire, iptables supprime les bons paquets qui correspondent à la règle.Par exemple: il supprime aa aa aa XX 01 aa aa aa aa.

Ce que j'ai besoin de faire avec iptables, c'est de ne jeter le paquet UNIQUEMENT que si XX 01 est les 4 premiers caractères de la chaîne de données. Ignorer si c'est présent après la 4ème donnée. Je veux dire, si j'ai par exemple 6D 00 00 00 00 00 XX 01 00 AA cela doit passer.

Je sais qu'il y a un moyen opposé de le faire, je veux dire, je peux simplement connecter mon serveur et sniffer les paquets entrants avec wireshark, afin de mettre en liste blanche le premier Hex qui n'est pas XX 01 pour chaque paquet contenant XX 01 sur sa chaîne de données: par exemple, la chaîne 6D que j'ai mise là-bas. Mais pour le faire ainsi, je dois renifler pendant des heures et créer autant de règles. Je dois configurer une règle pour que tous les paquets qui commencent par autre chose que XX 01 soient inscrits sur la liste blanche, ou une règle qui arrête la lecture du paquet après le 4ème caractère Hex.

Toute aide serait appréciée.

2
TheGreek

Selon la section string de la page de manuel iptables-extensions, il existe deux options pour contrôler la partie d'un paquet sur laquelle le modèle est testé:

   --from offset
          Set the offset from which it starts looking for any matching. If
          not passed, default is 0.

   --to offset
          Set the offset up to which should be scanned. That is, byte off‐
          set-1 (counting from 0) is the last one that is scanned.  If not
          passed, default is the packet size.

Avez-vous essayé l'argument --to 2, qui devrait limiter la longueur de la plage correspondante à cette valeur?

1
Andrey Ryazantsev