Где Wireshark/tcpdump/libpcap перехватывает пакеты внутри ядра Linux?

В соответствии с этим, wireshark может получить пакет до того, как он будет отброшен (поэтому я не могу получить такие пакеты самостоятельно). И я до сих пор задаюсь вопросом о точном расположении ядра Linux для wireshark для получения пакетов.

Ответ звучит так: "В UN*Xes он использует libpcap, который в Linux использует сокеты AF_PACKET". У кого-нибудь есть более конкретный пример использования "сокетов AF_PACKET"? Если я правильно понимаю wireshark, сетевая интерфейсная карта (NIC) сделает копию всех входящих пакетов и отправит ее на фильтр (фильтр пакетов Беркли), определенный пользователем. Но где это происходит? Или я не прав с этим пониманием и мне здесь что-то не хватает?

Заранее спасибо!

2 ответа

Решение

Но где это происходит?

Если я вас правильно понял - вы хотите знать, где инициализируется такой сокет.
Есть pcap_create функция, которая пытается определить тип интерфейса источника, создает его копию и активирует.
Для сети см. pcap_create_interface функция => pcap_create_common функция => pcap_activate_linux функция
Вся инициализация происходит в pcap_activate_linux => activate_new функция => iface_bind функция
(скопируйте дескриптор устройства с handlep->device = strdup(device);,
создать сокет с socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL)),
привязать сокет к устройству с bind(fd, (struct sockaddr *) &sll, sizeof(sll))).
Для более подробной информации читайте комментарии в исходных файлах упомянутых функций - они очень подробные.
После инициализации вся работа происходит в группе функций, таких как pcap_read_linux, так далее.

В Linux вы можете просто использовать tcpdump (который использует библиотеку libpcap) для этого. Это можно сделать с помощью файла или STDOUT, и вы указываете фильтр в конце команды tcpdump.

Другие вопросы по тегам