Где 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.