Каков формат заголовка пакета при использовании очередей netfilter?

Я использую очереди netfilter в Ubuntu 14.10. Пока все работает, пакеты вижу и выношу вердикт, но хотелось бы получше понять, что я читаю из очереди.

Начиная с этой страницы.

Это код, о котором идет речь:

fd = nfq_fd(h);
while ((rv = recv(fd, buf, sizeof(buf), 0)) >= 0)
{
    printf("pkt received\n");
    nfq_handle_packet(h, buf, rv);
}

В момент, когда у них есть printf(), что именно было прочитано из fd? Я предполагаю, что это пакет, которому предшествует какой-то заголовок, специфичный для сетевого фильтра, но я понятия не имею, что это за заголовок. Я просматриваю дамп байтов, которые читаю, но нигде не вижу действительных L2, L3 или L4.

Обратите внимание, что согласно документации я настроил очередь в режиме копирования с помощью этой строки:

nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff);

person Stéphane    schedule 16.01.2015    source источник


Ответы (1)


Похоже, очереди netfilter возвращают L3+. Л2 нет. Когда обратный вызов выполняется -- вызывается nfq_handle_packet() -- то, что я вижу, это 58 байт ‹что-то› (не L2), за которым следует L3.

Эфирный тип из «недостающего» L2 можно получить с помощью:

struct nfqnl_msg_packet_hdr *ph = nfq_get_msg_packet_hdr(nfad);
const uint32_t id = ntohl(ph->packet_id);
const uint16_t ethertype = ntohs(ph->hw_protocol);

Тогда L3 получается с:

uint8_t *payload_data = nullptr;
const int payload_len = nfq_get_payload(nfad, &payload_data);

При необходимости исходный MAC-адрес из L2 может быть доступен с вызовом nfq_get_packet_hw().

person Stéphane    schedule 16.01.2015