J'arrive pas à trouver de réponse franche sur un problème que j'ai, donc j'me suis dit autant demander ici, ça coute rien

Mon problème est le suivant :
Je souhaite filtrer ce qui arrive sur mon PC (tournant sous Linux) en fonction du protocole du flux d'entrée.
Un exemple : admettons que je reçoive du flux Emule (quel que soit le port), je le laisse passer, par contre du FTP, je bloque.
Je me suis tourné (par habitude) vers iptables, mais ce dernier ne fait que du filtrage sur le port au mieux. Or je souhaite filtrer selon le protocole (niveau Application dans le modèle OSI) plutôt que sur le port, qui peut changer à tout moment.
J'ai réussi à trouver une surcouche iptables baptisée l7-filter, qui fait plus ou moins ce que je veux, mais ils déconseillent de l'utiliser en tant que filtre bloquant :/ (probablement parce que ça prend trop de temps CPU). EDIT : Ah non, en fait c'est qu'il est obligé de laisser passer les premiers paquets pour être sûr du protocole :/
Donc, pour résumer, je souhaite trouver un filtre qui lit jusqu'à la couche applicative (du DPI pour ceux qui connaissent) et qui permette de fixer des règles dessus.
Merci

EDIT 2 : A priori, utiliser un proxy comme Squid serait conseillé. Mais je pige pas comment le mettre en place <_<
EDIT 3 : Apparement, Snort fait ce que je veux. J'vais me pencher dessus. Et j'suis toujours preneur de toute remarque ;)