2009-08-24 7 views
3

J'ai un socket créé avec socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)), et je l'ai mis en mode promiscuous utilisant:Prise de paquets en mode promiscuous recevant uniquement le trafic local

struct ifreq ifr; 
strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE); 
if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2); 

struct packet_mreq mr; 
memset(&mr, 0, sizeof(mr)); 
mr.mr_ifindex = ifr.ifr_ifindex; 
mr.mr_type = PACKET_MR_PROMISC; 
if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2); 

Le problème est que quand je fais un read() de la prise , il ne renvoie que les données qui proviennent ou qui arrivent sur mon ordinateur.

Comment puis-je l'obtenir pour lire et traiter tous les paquets sur le réseau? Wireshark montre tous les paquets bien, donc je sais que ce n'est pas mon ordinateur ou NIC. ifconfig signale que c'est PROMISC lorsqu'il est en cours d'exécution. Essayez d'utiliser SOCK_PACKET comme second argument de socket(), plutôt que SOCK_RAW.

Répondre

4

Avec la suggestion de Rob Jones, essayez un outil comme Wireshark pour vous assurer que vous recevez les paquets que vous attendez à l'interface. Au moins cela confirmera (ou niera) que vous avez un problème avec votre code.

Vous devez également vous assurer que l'interface elle-même est définie sur le mode de promiscuité. Sinon, vous pouvez utiliser l'ioctl() pour le mettre:

ifr.ifr_flags |= IFF_PROMISC; 
if(ioctl(sock, SIOCSIFFLAGS, &ifr) != 0) 
{ 
    // handle error here 
} 

Bien que votre application est en cours d'exécution, assurez-vous que ifconfig le drapeau PROMISC pour cette interface.

Notez que ceci devra être exécuté en tant qu'utilisateur privilégié.


Essayé le code tel que présenté. Travaille pour moi. Bien sûr (en raison du test sur la ligne 102) cela ne fera qu'imprimer les détails pour le trafic TCP.

+0

Wireshark montre les paquets bien, tout comme tcpdump. – computergeek6

+0

Oui, mais le socket ne recevra toujours pas d'autre trafic. – computergeek6

+0

J'ai réussi à le réparer de mon côté, et c'était la réponse la plus utile. Merci! – computergeek6

1

Si vous utilisez un commutateur, vous ne verrez probablement que les paquets destinés à ou provenant de votre ordinateur. Essayez un hub.

+0

Si je fais cela, le bind() échoue. En outre, il est obsolète. – computergeek6

+1

Assez juste. Courez-vous en tant qu'utilisateur privilégié? –

0

Ceci est probablement pas un problème de logiciel.

Vous n'utilisez probablement pas le bon matériel. Votre ordinateur est probablement connecté à un commutateur. Les commutateurs sont assez intelligents pour "apprendre" quels ordinateurs sont sur quels ports, et acheminer le trafic uniquement là où il doit aller. Par conséquent, le commutateur filtre vos paquets pour vous.

Pour résoudre ce problème, vous devez disposer d'un concentrateur. Bien que les concentrateurs et les commutateurs semblent très similaires, ils fonctionnent différemment. Le Hub est muet et achemine tout le trafic vers tous les ports, vous permettant de voir les autres trafics en mode promiscuous.

Notez que même si vous remplacez le périphérique auquel votre ordinateur se connecte, il est probablement connecté à plus de commutateurs en amont, ce qui limitera également le trafic.Par conséquent, vous ne serez pas capable de détecter le trafic de beaucoup plus loin que votre propre configuration de concentrateur ou de laboratoire de test.

Questions connexes