Как сбросить 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 работает с копиями пакетов.

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