écouteur de socket brut

C’est une question rapide pour linux c programmer des sockets raw. Si je voulais simplement écouter une interface avec une socket brute, dois-je me lier à une adresse IP ou une interface pour écouter le trafic? D’après ce que j’ai compris, j’estime que je devrais être capable d’appeler simplement sock (); puis démarrez le trafic recvfrom (). Je me trompe peut-être, mais j’ai vu des programmes qui ne l’utilisent pas.

Vous avez raison, la seule chose à faire est d’appeler socket() puis recvfrom() . Néanmoins, sachez que l’écoute avec SOCK_RAW présente certaines limitations.

Si vous n’utilisez pas de sockets brutes sur une base “envoyer et oublier”, vous serez intéressé par la lecture du ou des paquet (s) de réponse pour votre / vos paquet (s) brut (s). La logique de décision permettant de savoir si un paquet doit être livré à une socket brute peut être énumérée de la manière suivante:

  1. Les paquets TCP et UDP ne sont jamais livrés à des sockets bruts, ils sont toujours traités par la stack de protocoles du kernel.

  2. Des copies des paquets ICMP sont livrées à un socket brut correspondant. Pour certains types ICMP (demande d’écho ICMP, demande d’horodatage ICMP, demande de masque), le kernel peut en même temps effectuer certains traitements et générer des réponses.

  3. Tous les paquets IGMP sont livrés aux sockets bruts: par exemple, les paquets OSPF.

  4. Tous les autres paquets destinés à des protocoles qui ne sont pas traités par un sous-système du kernel sont livrés à des sockets bruts.

Le fait que vous traitiez avec un protocole pour lequel des paquets de réponse sont remis à votre socket brut ne signifie pas nécessairement que vous obtiendrez le paquet de réponse. Pour cela, vous devrez peut-être également prendre en compte:

  1. définir le protocole en conséquence lors de la création de votre socket via un appel système socket (2). Par exemple, si vous envoyez un paquet de demande d’écho ICMP et souhaitez recevoir une réponse d’écho ICMP, vous pouvez définir l’argument de protocole (3ème argument) sur IPPROTO_ICMP).

  2. définir l’argument de protocole dans socket (2) sur 0, de sorte que tout numéro de protocole dans l’en-tête de paquet reçu corresponde.

  3. définir une adresse locale pour votre socket (via par exemple bind (2)), donc si l’adresse de destination correspond à l’adresse locale du socket, elle sera également fournie à votre application.

Pour plus de détails, vous pouvez lire par exemple ceci .

Si vous vouliez capturer le trafic sur une interface, vous pouvez utiliser libpcap.