захват с сокетом AF_PACKET - PullRequest
0 голосов
/ 05 мая 2019

Я перехватываю пакеты, создавая сокет AF_PACKET / SOCK_RAW с ETH_P_ALL и включая неразборчивый режим, отключая большую часть материала, важный код, который должен сообщить вам, как я настраиваю сокет, выглядит следующим образом:

sockfd = socket( AF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );
<cut>
socket_address.sll_family = AF_PACKET;
socket_address.sll_ifindex = if_nametoindex(target_if);
if( socket_address.sll_ifindex == 0 ) {
    perror("Can't find the interface.");
    exit( EXIT_FAILURE );
}
socket_address.sll_protocol = htons(ETH_P_ALL);

if( bind(sockfd, (struct sockaddr*)&socket_address,sizeof(socket_address)) == -1 ) {
    perror( "bind()" );
    exit( EXIT_FAILURE );
}
<cut>
struct ifreq ifr;
memset(&ifr,0,sizeof(struct ifreq));
strcpy( ifr.ifr_name, target_if );
ifr.ifr_flags |= IFF_PROMISC;
ifr.ifr_flags |= IFF_UP;
if( ioctl( sockfd, SIOCSIFFLAGS, &ifr ) == -1 ) {
    perror( "can't set to promiscuous" );
    exit( EXIT_FAILURE );
}
<cut>

Основной цикл выглядит примерно так (где msgs - допустимый массив, а VLEN - допустимое значение):

do{
    retval = recvmmsg( sockfd, msgs,VLEN,0, &timeout);
    if( retval > 0) {
        <cut>
    }
    <cut>
} while( running );

Я ожидал, что этот код будет захватывать все пакеты, поступающие на интерфейс,но я заметил, что значение rx_packets_phy из ethtool всегда намного больше, чем количество пакетов, которые я могу захватить с помощью своего кода (например, если я позволю запустить приложение в течение 5 минут, я могу перехватить 40 тыс. пакетов, в то время как rx_packets_phy увеличивается втот же период на 5k больше, до 45k ..).

Чего-то не хватает в моей конфигурации?При необходимости я могу опубликовать весь пример кода, но это несколько сотен строк, и я думаю, что то, что я представил, охватывает всю конфигурацию, которую я делаю.

...