2017-07-13 2 views
0

J'essayais de renifler le trafic réseau en utilisant le socket raw AF_PACKET. Je suis capable d'obtenir tous les paquets IP/ARP, mais je suis incapable d'obtenir des paquets IPv6 du tout. Y a-t-il quelque chose que je dois faire pour obtenir le trafic IPv6?Le socket AF_PACKET ne recevait pas les paquets IPv6

unsigned char buffer[65536]; 
    int sock_raw = socket(AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ; 

    if (sock_raw < 0) 
    { 
    perror("socket error!"); 
    return 1; 
    } 

    while (1) 
    { 
     struct sockaddr saddr; 
     int saddr_size, data_size; 

     data_size = recvfrom(sock_raw, buffer, 65536, 0, &saddr, (socklen_t *)&saddr_size); 

     if (data_size >= 0) 
     { 
     ProcessPacket(buffer, data_size); 
     } 
    } 
+2

Cela peut dépendre du système d'exploitation que vous utilisez. Les fenêtres? Linux? FreeBSD? FreeDOS? – Neil

+0

S'agit-il d'un réseau Ethernet commuté? Cela vous obligerait à configurer la mise en miroir des ports. S'il s'agit d'un réseau Wi-Fi, cela vous obligerait à être en mode moniteur ou en mode promiscuité. Sinon, vous ne verrez que la diffusion, par ex. ARP ou trafic destiné uniquement à votre hôte. –

+0

L'interface est-elle en mode promiscuous? – Cheatah

Répondre

0

Mon mauvais. IPv6 a un protocole Ethernet différent: ETH_P_IPV6 au lieu de ETH_P_IP, et je cherchais seulement les paquets ETH_P_IP! Ajouter le cas pour ETH_P_IPv6 a résolu le problème!

+0

Oui, IPv6 n'utilise pas ARP et n'a pas de diffusion. –