Shim layer, messages TCP dans le noyau

Bonjour à tous, :slightly_smiling:

J’ai une question très ardue à vous poser, je cherche à intercepter au niveau du noyau les messages TCP (connexion, …) pour les modifier, les logger.

En fait je veux réellement les intercepter au niveau du kernel. J’aimerais modifier ce “tcp_connect()” avant qu’il ne se transforme en trame Ethernet.

J’ai lu que pouvait inclure une API (shim layer) entre l’user space et le kernel space.

Mais je n’ai pas de code ou d’autres informations pour m’aider à le faire.

Merci pour vos lectures/réponses.

Ça a vraiment besoin d’être aussi profond ? Un LD_PRELOAD ne suffirait pas à faire ce que tu veux ?

Encore une fois (t’inquiète t’es loin d’être le seul) ça aide beaucoup de dire ce qu’on veut réellement faire, et non pas comment on croit qu’on veut le faire.

En fait pour tout vous dire, je cherche à transformer cet appel TCP en appel SCTP, je cherche à rendre le support SCTP transparent pour l’utilisateur et les applications.

Mon but final est donc de convertir les massages TCP venant des applications en messages SCTP sur le réseau et inversement sur le retour.

J’aimerais commencer par une simple association voir juste un log des messages TCP.

  • implémentation kernel : compliquée à développer, peu portable, mais s’applique à tous les programmes sans distinction
  • implémentation dans une bibliothèque LD_PRELOAD : simple à développer, plus portable, mais ne s’applique que si l’utilisateur le demande explicitement

Si tu veux mon avis, commence déjà par faire fonctionner ça en LD_PRELOAD, t’auras déjà bien assez de boulot. De toutes façons la majorité du code que tu vas écrire sera réutilisable donc si tu veux passer plus tard à une implémentation kernel (pour rendre l’ensemble transparent pour l’utilisateur) t’auras pas grand chose à changer, et en attendant tu pourras bosser dessus sans mettre en danger la stabilité de ta machine de test (puisque seuls les programmes démarrés explicitement avec cette option en bénéficieront) ni avoir à recompiler le kernel, ce qui est un gain de temps non négligeable.

Je ne connais pas shim (c’est pas le nom d’une chanteuse ?), mais je vois plusieurs méthodes pour arriver à tes fins :
[ul]
[li]avec LDPRELOAD ça te permet d’intercepter les appels à une bibliothèque (ou a un appel système) tu peut faire ce que tu veux avec[/li]
[li]avec un proxy, tu créer un deamon qui accepte les connexions TCP et qui crée des connexions SCTP[/li][/ul]

C’est juste un gros mot pour un pattern proxy.

:laughing:

Oui j’ai déjà étudié la solution du proxy, je suis pas contre un tuto/code dailleur mais en fait c’est plus la solution “shim” qu’il faut que je commence a développer. J’ai une semaine :cry:

Je vais me pencher sur cette solution, LDPRELOAD alors, je vous tiens au jus. Je suis pas contre un petit boost non plus vu le temps de dev. que j’ai. Je ne suis pas doué en programmation :078

:laughing:

Edit :

On m’a dis de regarder dans la libc6 car la création et l’usage de socket sont dans la section 2 du man, donc des appels noyaux.
J’ai récupérer les sources (apt-get source libc6) et il me faut trouver comment la libc6 encapsule ces appels pour les modifiers. Juste ?

Je up mon problème avec de nouvelles options :slightly_smiling:

Apparemment le LD_PRELOAD ne correspond pas a mon besoin, le mieux étant de faire des modifications sur les appels système (sys/syscall.h ?)

Sous BSD apparemment, les fichiers à modifier serraient “uipc_syscalls.c”, "uipc_socket.c, “uipc_socket2”.c et “sys_socket.c” .

Je suis complètement perdu, il ne me reste vraiment que très peut de temps pour ne serrais-ce que établir une connexion SCTP avec cette méthode.

:slightly_smiling:

Pour la partie kernel je ne pourrai pas t’aider, mais je suis étonné que le LD_PRELOAD ne convienne pas. Un outil comme tsocks fait grosso modo ce que tu veux faire :

  • intercepter les connexions réseau en provenance d’une application
  • utiliser une autre méthode de transport (en l’occurrence un proxy SOCKS) de manière transparente pour l’appli

Seul bémol, tsocks n’intercepte que les appels à connect() car c’est tout ce qui est nécessaire pour passer par un proxy SOCKS, mais le principe pour les autres appels reste le même.
Vu que c’est open source tu peux peut-être t’en inspirer ?

C’est un projet de recherche donc je dois forcement passé par la partie noyau.

Le but a long terme est de faire entièrement du SCTP et non seulement du connect(). :smiley:

Tu n’aurais pas des liens/tuto pour des modifications noyau ?