Question

J'ai un socket créé avec socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)), et je l'ai mis en mode promiscuous utilisant:

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 retourne uniquement les données qui se passe ou à venir à mon ordinateur.

Comment puis-je obtenir de 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 carte réseau. ifconfig signale qu'il est PROMISC quand il est en cours d'exécution.

Était-ce utile?

La solution

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 qui confirmera (ou refuser) que vous avez un problème avec votre code.

Il faut aussi faire en sorte que l'interface elle-même est en mode promiscuous. Sinon, vous pouvez utiliser l'ioctl () pour le définir:

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

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

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


Nous avons essayé le code tel que présenté. Travaille pour moi. Bien sûr (en raison du test sur la ligne 102), ce n'imprimer les détails pour le trafic TCP.

Autres conseils

Essayez d'utiliser SOCK_PACKET comme second argument à la douille (), plutôt que SOCK_RAW.

Si vous êtes sur un interrupteur, vous verrez probablement que les paquets destinés à ou provenant de votre ordinateur. Essayez un concentrateur.

Le port de commutateur doit également être configuré de manière appropriée (port SPAN dans le monde Cisco). Voir ici pour plus de détails:

http://www.winpcap.org/misc/faq.htm # Q-22

Et voici l'info de Cisco sur la façon dont les ports SPAN fonctionnent:

http://www.cisco.com /en/US/products/hw/switches/ps708/products_tech_note09186a008015c612.shtml

Ceci est probablement pas un problème de logiciel.

Vous utilisez probablement le mauvais matériel. Votre ordinateur est probablement relié à un commutateur. Les commutateurs sont assez intelligents pour « apprendre » quels sont les ordinateurs sur lesquels les ports et acheminer le trafic uniquement là où il doit aller. Par conséquent, le commutateur est le filtrage des paquets vos pour vous.

Pour résoudre ce problème, vous devez obtenir un Hub. Bien que concentrateurs et commutateurs apparaissent très similaires, ils fonctionnent différemment. Le Hub est muet, et acheminer tout le trafic à tous les ports, vous permettant de voir tout autre trafic en mode promiscuous.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top