Pregunta

Tengo un socket creado con socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)), y lo he instalado en modo promiscuo usando:

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);

El problema es que cuando hago un read() de la toma, que sólo devuelve los datos que va desde o venir a mi equipo.

¿Cómo puedo conseguirlo para leer y procesar todos los paquetes en la red?

Wireshark muestra todos los paquetes bien, así que sé que no es mi ordenador o NIC. ifconfig informa que es PROMISC cuando está en marcha.

¿Fue útil?

Solución

Junto con la sugerencia de Rob Jones, trata de una herramienta como Wireshark para asegurarse de que está recibiendo los paquetes que se puede esperar en la interfaz. Al menos que se confirme (o negar) que tiene un problema con su código.

También es necesario asegurarse de que la propia interfaz está configurada en modo promiscuo. Si no, entonces usted puede utilizar el ioctl () para establecer que:

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

Mientras se ejecuta la aplicación, asegúrese de que ifconfig informa la bandera promisc para esa interfaz.

Tenga en cuenta que esto tendrá que ser ejecutado como usuario privilegiado.


Probamos el código tal como se presenta. Funciona para mi. Por supuesto (debido a la prueba en la línea 102) esto sólo imprimirá los detalles para el tráfico TCP.

Otros consejos

Trate de usar SOCK_PACKET como el segundo argumento de socket (), en lugar de SOCK_RAW.

Si estás en un interruptor es probable que sólo ven los paquetes destinados a, o procedentes de su equipo. Pruebe con un cubo.

Su puerto del conmutador también necesita ser configurado apropiadamente (puerto SPAN en Cisco mundo). Vea aquí para más detalles:

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

Y aquí está la información de Cisco con respecto a cómo funcionan los puertos SPAN:

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

Esto es probablemente no es un problema de software.

Es probable utilizando el hardware mal. El ordenador está probablemente conectado a un interruptor. Los switches son lo suficientemente inteligentes como para "aprender" los equipos que están en los puertos, y la ruta de tráfico solamente a donde tiene que ir. Por lo tanto, el interruptor está filtrando los paquetes para usted.

Para solucionar este problema, es necesario obtener un concentrador. Aunque concentradores y conmutadores son muy similares, que funcionan de forma diferente. El Hub es mudo, y encaminar todo el tráfico a todos los puertos, lo que le permite ver el resto del tráfico en modo promiscuo.

Tenga en cuenta que incluso si se reemplaza el dispositivo que se conecta el equipo, es probable conectado a más interruptores aguas arriba, que también van a limitar el tráfico. Por lo tanto, usted no será capaz de rastrear el tráfico de mucho más lejos que su propia configuración de concentrador o prueba de laboratorio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top