Как удалить skb_buff, используя ebpf/bcc?

Я запускаю пример скрытой копии https://github.com/iovisor/bcc/blob/master/examples/networking/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 не падает.

В моем понимании, эти Non-TCP пакеты должны быть отброшены (ожидаю, что ping или dig не пройдут), но это не так.

Так в чем причина?

И можно ли как-то еще сбросить skb_buff, используя ebpf/bcc?


person Vector    schedule 07.01.2020    source источник
comment
Некоторые элементы ваших вопросов мне непонятны. 1) Отбрасываются ли пакеты (вы говорите, что пакеты UDP/ICMP отбрасываются) или нет (вы добавляете, что ожидаете сбоя ping/dig, но в конце концов он работает, поэтому, предположительно, пакеты не отбрасываются?) 2) Что вы подразумеваете под «отбрасывается ли в любом случае, чтобы удалить skb_buff, используйте ebpf/bcc», не могли бы вы перефразировать это?   -  person Qeole    schedule 07.01.2020


Ответы (1)


TL;DR. http-parse-simple отбрасывает копии пакетов, а не оригинальные пакеты.


Цель http-parse-simple — показать пользователю URL-адрес всех HTTP-запросов, сделанных на данном интерфейсе. С этой целью он создает необработанный сокет и прикрепляет к нему программу BPF. Необработанный сокет получает копию всех входящих пакетов на интерфейсе; который не зависит от BPF. Подключенная программа BPF затем используется для передачи в пользовательское пространство только интересующих пакетов (т. е. только HTTP-пакетов); копии других пакетов отбрасываются.

Таким образом, процесс пользовательского пространства http-parse-simple получает только HTTP-пакеты, и это не влияет на исходные приложения (например, веб-браузер), поскольку программа BPF работает с копиями пакетов.

person pchaigno    schedule 07.01.2020