Suivi de connexion en espace utilisateur et en python…

Mais qu’est ce que ça peut bien vouloir dire ce titre ?
En gros, le connexion tracking, c’est ce qui permet à un pare-feu à états de savoir si un paquet est lié à une connexion autorisée ou non, et donc de prendre les mesures appropriées (accepter ou rejeter le paquet). Pour une connexion TCP, il est simple de suivre le trafic. Mais dans le cas de protocoles utilisant plusieurs connexion ou des flux UDP, c’est déjà plus dur…

Par exemple, le protocole RTSP utilisé pour le Freebox Multipostes (recevoir les flux TV sur les PC) utilise un flux de contrôle en TCP du PC vers la Freebox, un flux UDP contenant la vidéo qui va de la Freebox vers le PC et un flux UDP du PC vers la Freebox pour signaler que le PC est toujours vivant. C’est compliqué, hein 😉

Le problème quand on a un routeur NAT, c’est que les flux « sortant » (du PC vers la Freebox) passent sans problème, mais les flux « entrant » ne vont nulle part (car le routeur ne sait pas vers quelle machine il doit les renvoyer. Il faut donc avoir un routeur intelligent, qui soit capable de faire la relation entre le flux UDP qui arrive et le flux TCP sortant pour renvoyer les paquets UDP au PC qui a initié la connexion TCP.

Et c’est pas dur, car dans le flux de données TCP, il se trouve que par hasard, le port UDP est en question est échangé entre le PC et la Freebox. Il suffit de scruter le flux TCP et de noter le port UDP quand il passe sur la ligne. A partir de là, on peut simplement ajouter une règle au pare-feu pour rediriger le flux vers le bon PC.

Sous linux, il existe un module ip_conntrack_rtsp que j’avais déjà utiliser sur un routeur sous openwrt… Mais la je veux mettre ça en place sur un ‘vrai’ PC. Et c’est chiant… Il faut patcher le Kernel, le recompiler… Bref bien lourd…

Je me suis donc mit en tête que je pouvais le faire très rapidement en python, et en espace utilisateur (c’est a dire sans toucher au noyau…).

Il existe un module python qui permet d’analyser et modifier des paquets piégés par iptables. Il s’appel nfqueue. Il suffit d’utiliser la cible QUEUE dans les règles iptables pour que les paquets passent tous par un script python avant de continuer leur chemin…

A partir de la, le script est très simple. Il commence par installer sa règle d’interception de paquets en exécutant iptables. Puis il commence a traiter les paquets un à un.
Pour chaque paquet, on commence par vérifier s’il est bien en rapport avec un flux RTSP, puis selon le cas, s’il ne s’agit pas d’un paquet de fermeture de connexion TCP, on cherche le port UDP à ouvrir, et si on le trouve, on l’ouvre. S’il s’agit d’un paquet de fermeture de connexion, on ferme le port UDP en rapport avec cette connexion (s’il existe).
Enfin, si l’on tente de fermer le programme, j’en profite pour fermer tous les ports qui restait ouvert et pour supprimer la règle d’interception des paquets. C’est tout.

Voila, j’ai donc pondu ce script en 1 heure et ça marche… C’est plus simple que de patcher sont kernel…

Le script (download).

En tout cas, il y avait longtemps que je voulait essayé d’utiliser ce module python… Il y a encore plein de choses marrante que l’on pourrait faire avec…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.