Как сбросить skb_buff использовать ebpf / b cc? - PullRequest
0 голосов
/ 07 января 2020

Я запускаю пример b cc / 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 / b cc?

1 Ответ

1 голос
/ 07 января 2020

TL; DR. http-parse-simple отбрасывает копию пакетов, а не исходных пакетов.


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

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

...