Pergunta

Eu tenho um socket criado com socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)), e eu defini-lo em modo promíscuo 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);

O problema é que quando eu faço uma read() da tomada, ele só retorna dados que está acontecendo a partir de ou que chegam ao meu computador.

Como posso obtê-lo para ler e processar todos os pacotes na rede?

Wireshark mostra todos os pacotes bem, então eu sei que não é meu computador ou NIC. relatórios ifconfig que é PROMISC quando se está em execução.

Foi útil?

Solução

Junto com a sugestão de Rob Jones', tente uma ferramenta como Wireshark ter certeza de que você está recebendo os pacotes que você espera na interface. Pelo menos isso vai confirmar (ou negar) que você tem um problema com o seu código.

Também precisa ter certeza de que a própria interface está configurado para o modo promíscuo. Se não, então você pode usar o ioctl () para defini-lo:

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

Enquanto o aplicativo é executado, certifique-se de que ifconfig relata a bandeira PROMISC para essa interface.

Note que esta terá de ser executado como um usuário privilegiado.


Tentou acessar o código, tal como apresentado. Funciona para mim. É claro que (devido ao teste em linha 102) isso só vai imprimir detalhes para o tráfego TCP.

Outras dicas

Tente usar SOCK_PACKET como o segundo argumento para socket (), em vez de SOCK_RAW.

Se você estiver em um interruptor que você provavelmente só irá ver os pacotes destinados a, ou provenientes de seu computador. Tente um hub.

Seu porta do switch também precisa ser configurado de forma adequada (porta SPAN na Cisco mundo). Veja aqui para mais detalhes:

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

E aqui está a informação da Cisco sobre como SPAN portos trabalho:

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

Isso provavelmente não é um problema de software.

Você está provavelmente usando o hardware errado. Seu computador provavelmente está ligado a um interruptor. Os switches são bastante inteligente para "aprender" quais computadores estão em quais portas, e rota de tráfego apenas para onde ele precisa ir. Portanto, a chave é filtrar seus pacotes para você.

Para corrigir isso, você precisará obter um Hub. Embora hubs e switches parecem muito semelhantes, eles funcionam de forma diferente. O Hub é mudo, e vai encaminhar todo o tráfego a todas as portas, permitindo que você veja outro tráfego no modo promíscuo.

Note que mesmo se você substituir o dispositivo que o computador se conecta a, é provável conectado a mais muda up-stream, que também vai limitar o tráfego. Assim, você não será capaz de tráfego fungada de muito mais longe do que o seu próprio hub ou teste de laboratório configuração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top