Как сбросить skb_buff с помощью ebpf/bcc?
Я запускаю пример bcc /http_filter/http-parse-simple.c, в котором поясняется в комментарии:
/*
eBPF program.
Filter IP and TCP packets, having payload not empty
and containing "HTTP", "GET", "POST" ... as first bytes of payload
if the program is loaded as PROG_TYPE_SOCKET_FILTER
and attached to a socket
return 0 -> DROP the packet
return -1 -> KEEP the packet and return it to user space (userspace
can read it from the socket_fd )
*/
И когда я запустил этот пример, я увидел, что когда я запускаю пакет UDP (например, dig) или пакет icmp (ping), пользовательский программист действительно не получает пакет.
Но программа ping или dig не падает.
Насколько я понимаю, эти пакеты, отличные от TCP, должны быть отброшены (я ожидаю, что ping или dig не удастся), но это не так.
Так в чем причина?
А есть ли еще способ сбросить skb_buff с помощью ebpf/bcc?
1 ответ
TL;DR. http-parse-simple отбрасывает копию пакетов, а не исходные пакеты.
Цель http-parse-simple - показать пользователю URL-адреса всех HTTP-запросов, сделанных в данном интерфейсе. С этой целью он создает необработанный сокет и присоединяет к нему программу BPF. Необработанный сокет получает копии всех входящих пакетов интерфейса; это не зависит от BPF. Присоединенная программа BPF затем используется для передачи в пользовательское пространство только интересующих пакетов (т. Е. Только пакетов HTTP); копии других пакетов отбрасываются.
Таким образом, процесс http-parse-simple в пользовательском пространстве принимает только HTTP-пакеты, и это не влияет на ваши исходные приложения (например, веб-браузер), поскольку программа BPF работает с копиями пакетов.