Фильтрация пакетов в файле дампа pcap - PullRequest
0 голосов
/ 26 февраля 2012

Я пишу сетевой анализатор и мне нужно отфильтровать пакеты, сохраненные в файле, я написал некоторый код для фильтрации http-пакетов, но я не уверен, работает ли он так, как должен, потому что, когда я использую свой код в дампе pcapВ результате получается 5 пакетов, но при записи в Wireshark http в фильтре дает мне 2 пакета, и если я использую:

tcpdump port http -r trace-1.pcap

, это дает мне 11 пакетов.

Ну, 3 разных результата, этонемного сбивает с толку.

Фильтр и обработка пакетов в моем коде:

...
if (pcap_compile(handle, &fcode, "tcp port 80", 1, netmask) < 0)
...
while ((packet = pcap_next(handle,&header))) {
    u_char *pkt_ptr = (u_char *)packet; 

    //parse the first (ethernet) header, grabbing the type field
    int ether_type = ((int)(pkt_ptr[12]) << 8) | (int)pkt_ptr[13];
    int ether_offset = 0;

    if (ether_type == ETHER_TYPE_IP) // ethernet II
        ether_offset = 14;
    else if (ether_type == ETHER_TYPE_8021Q) // 802
        ether_offset = 18;
    else
        fprintf(stderr, "Unknown ethernet type, %04X, skipping...\n", ether_type);

    //parse the IP header
    pkt_ptr += ether_offset;  //skip past the Ethernet II header
    struct ip_header *ip_hdr = (struct ip_header *)pkt_ptr; 
    int packet_length = ntohs(ip_hdr->tlen);

    printf("\n%d - packet length: %d, and the capture lenght: %d\n", cnt++,packet_length, header.caplen);

}

Мой вопрос: почему при фильтрации http есть 3 разных результата?И / или если я фильтрую это неправильно, то как я могу сделать это правильно, также есть ли способ фильтровать пакеты http (или ssh, ftp, telnet ...), используя что-то другое, чем номера портов?

Спасибо

1 Ответ

0 голосов
/ 26 февраля 2012

Итак, я понял это. Потребовался небольшой поиск и понимание, но я сделал это.

Фильтр Wireshark настроен на http-фильтрацию пакетов, которые установлены в tcp-порту 80, а также для флагов PSH, ACK. После реализации этого, параметры команды tcpdump, которые приводят к одинаковому количеству пакетов, было легко записать.

Так что теперь wireshark и tcpdump дают одинаковые результаты

А как насчет моего кода? ну я понял, что у меня действительно была ошибка в моем вопросе, фильтр

if (pcap_compile(handle, &fcode, "tcp port 80", 1, netmask) < 0)

действительно дает 11 пакетов (для порта src и dst установлено значение 80 независимо от того, какие флаги tcp)

Теперь отфильтровать нужные пакеты - это вопрос хорошего понимания синтаксиса фильтра. или настройка фильтрации только порта 80 (21,22, ...), а затем в функции обратного вызова или в цикле while получить заголовок tcp и оттуда получить флаги и использовать маску, чтобы увидеть, является ли это правильный пакет (PSH, ACK , SYN ...) число флагов, например, здесь

...