Tengo un nuevo caso de prueba parahttps://github.com/xdp-project/bpf-examplesaquí https://github.com/tjcw/bpf-examples/tree/tjcw-integration-0.3/AF_XDP-filter . Es para filtrar flujos; la idea es enviar el primer paquete de un flujo al espacio de usuario, hacer que el espacio de usuario determine (observando el quintuplo del paquete) si el flujo es aceptable o no y establecer una entrada en un mapa eBPF en consecuencia. El segundo paquete y los siguientes del flujo se manejan en el kernel mediante código eBPF. El caso de prueba funciona, excepto que el primer paquete (que se reinyecta al kernel a través de una interfaz tun/tap) es descartado por el kernel como un 'marciano'. El efecto es que si intenta hacer 'ping' a este código, verá todos los paquetes respondidos excepto el primero, y si intenta 'ssh', habrá una pequeña pausa al inicio mientras el protocolo TCP en el cliente expira y retransmite. el paquete SYN.
Adjunto el resultado de 'pwru' (paquete-cilium-dónde-estás) cuando ejecuto
tjcw@tjcw-Standard-PC-Q35-ICH9-2009:~$ ping -c 2 192.168.122.48
PING 192.168.122.48 (192.168.122.48) 56(84) bytes of data.
64 bytes from 192.168.122.48: icmp_seq=2 ttl=64 time=2.28 ms
--- 192.168.122.48 ping statistics ---
2 packets transmitted, 1 received, 50% packet loss, time 1028ms
rtt min/avg/max/mdev = 2.282/2.282/2.282/0.000 ms
tjcw@tjcw-Standard-PC-Q35-ICH9-2009:~$
¿Alguien que lea esto sabe por qué el núcleo trata al paquete como a un marciano y si hay alguna manera de superar esto? Estoy usando Ubuntu 22.04 con uname -a mostrando
tjcw@tjcw-Standard-PC-Q35-ICH9-2009:~$ uname -a
Linux tjcw-Standard-PC-Q35-ICH9-2009 5.15.0-53-generic #59-Ubuntu SMP
Mon Oct 17 18:53:30 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
tjcw@tjcw-Standard-PC-Q35-ICH9-2009:~$
2022/11/25 11:37:02 Listening for events..
SKB CPU PROCESS FUNC
0xffff9478f5038300 1 [<empty>] pskb_expand_head
0xffff9478f5038300 1 [<empty>] skb_free_head
0xffff9478f5038300 1 [<empty>] bpf_prog_run_generic_xdp
0xffff9478f5038300 1 [<empty>] xdp_do_generic_redirect
0xffff9478f5038300 1 [<empty>] consume_skb
0xffff9478f5038300 1 [<empty>] skb_release_head_state
0xffff9478f5038300 1 [<empty>] skb_release_data
0xffff9478f5038300 1 [<empty>] skb_free_head
0xffff9478f5038300 1 [<empty>] kfree_skbmem
0xffff9478f5038300 1 [af_xdp_user] netif_receive_skb
0xffff9478f5038300 1 [af_xdp_user] skb_defer_rx_timestamp
0xffff9478f5038300 1 [af_xdp_user] __netif_receive_skb
0xffff9478f5038300 1 [af_xdp_user] __netif_receive_skb_one_core
0xffff9478f5038300 1 [af_xdp_user] ip_rcv
0xffff9478f5038300 1 [af_xdp_user] ip_rcv_core
0xffff9478f5038300 1 [af_xdp_user] sock_wfree
0xffff9478f5038300 1 [af_xdp_user] ip_route_input_noref
0xffff9478f5038300 1 [af_xdp_user] ip_route_input_rcu
0xffff9478f5038300 1 [af_xdp_user] ip_route_input_slow
0xffff9478f5038300 1 [af_xdp_user] fib_validate_source
0xffff9478f5038300 1 [af_xdp_user] __fib_validate_source
0xffff9478f5038300 1 [af_xdp_user] ip_handle_martian_source
0xffff9478f5038300 1 [af_xdp_user] kfree_skb_reason
0xffff9478f5038300 1 [af_xdp_user] skb_release_head_state
0xffff9478f5038300 1 [af_xdp_user] skb_release_data
0xffff9478f5038300 1 [af_xdp_user] skb_free_head
0xffff9478f5038300 1 [af_xdp_user] kfree_skbmem
0xffff9478c75d3000 1 [<empty>] pskb_expand_head
0xffff9478c75d3000 1 [<empty>] skb_free_head
0xffff9478c75d3000 1 [<empty>] bpf_prog_run_generic_xdp
0xffff9478c75d3000 1 [<empty>] ip_rcv
0xffff9478c75d3000 1 [<empty>] ip_rcv_core
0xffff9478c75d3000 1 [<empty>] skb_clone
0xffff9478c75d3000 1 [<empty>] consume_skb
0xffff9478f5038c00 1 [<empty>] ip_route_input_noref
0xffff9478f5038c00 1 [<empty>] ip_route_input_rcu
0xffff9478f5038c00 1 [<empty>] ip_route_input_slow
0xffff9478f5038c00 1 [<empty>] fib_validate_source
0xffff9478f5038c00 1 [<empty>] __fib_validate_source
0xffff9478f5038c00 1 [<empty>] ip_local_deliver
0xffff9478f5038c00 1 [<empty>] ip_local_deliver_finish
0xffff9478f5038c00 1 [<empty>] ip_protocol_deliver_rcu
0xffff9478f5038c00 1 [<empty>] raw_local_deliver
0xffff9478f5038c00 1 [<empty>] icmp_rcv
0xffff9478f5038c00 1 [<empty>] __skb_checksum_complete
0xffff9478f5038c00 1 [<empty>] icmp_echo
0xffff9478f5038c00 1 [<empty>] icmp_reply
0xffff9478f5038c00 1 [<empty>] __ip_options_echo
0xffff9478f5038c00 1 [<empty>] fib_compute_spec_dst
0xffff9478f5038c00 1 [<empty>] security_skb_classify_flow
0xffff9478f5038c00 1 [<empty>] consume_skb
0xffff9478f5038c00 1 [<empty>] skb_release_head_state
0xffff9478f5038c00 1 [<empty>] skb_release_data
0xffff9478f5038c00 1 [<empty>] kfree_skbmem
0xffff9478c75d3000 1 [<empty>] packet_rcv
0xffff9478c75d3000 1 [<empty>] consume_skb
0xffff9478c75d3000 1 [<empty>] skb_release_head_state
0xffff9478c75d3000 1 [<empty>] skb_release_data
0xffff9478c75d3000 1 [<empty>] skb_free_head
El primer paquete (descartado) es la sección desde el primer pskb_expand_head hasta kfree_skbmem, y el segundo paquete (aprobado) es la sección desde el segundo pskb_expand_head hasta el final.
Respuesta1
Este comportamiento se debe al filtrado de ruta inversa, un intento de evitar el manejo de paquetes que llegan a la interfaz "incorrecta". Esto se puede desactivar con
for device in /proc/sys/net/ipv4/conf/*
do
echo 0 >${device}/rp_filter
done
en el script que se ejecuta en el servidor. Hecho esto, se responden todos los paquetes de ping.