From 424934def42098d152ee21cad4d5808098d6e109 Mon Sep 17 00:00:00 2001 From: Rodrigo Bertoldo de Sousa Martins Date: Mon, 14 Sep 2026 14:53:43 -0300 Subject: [PATCH] nova tentativa de fix do ebpf-sockmap2 --- ebpf-sockmap/bpf/sockmap.bpf.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ebpf-sockmap/bpf/sockmap.bpf.c b/ebpf-sockmap/bpf/sockmap.bpf.c index 343426c..6fcb8b4 100644 --- a/ebpf-sockmap/bpf/sockmap.bpf.c +++ b/ebpf-sockmap/bpf/sockmap.bpf.c @@ -95,16 +95,24 @@ static __always_inline void stats_inc(__u32 idx) // esbarrar na limitação do verificador. // ───────────────────────────────────────────────────────── // Verifica se um IP (em network byte order / big-endian) é -// endereço privado RFC-1918 ou loopback. +// endereço privado RFC-1918 — ou seja, tráfego ENTRE containers na +// dockernet, que é o único caso que se beneficia do sockmap. // // Por que isso importa: // O sock_ops roda para TODAS as conexões TCP do cgroup raiz, -// incluindo tráfego externo (HTTPS do mundo, metadata AWS…). +// incluindo tráfego externo (HTTPS do mundo, metadata AWS…) e +// tráfego de LOOPBACK dentro de um único container. // Registrar IPs públicos no sockhash é inútil e perigoso: // o par nunca será encontrado, o sk_msg vai ao fallback e // entradas mortas poluem o mapa. +// Loopback (127.0.0.0/8) é EXCLUÍDO de propósito: conexão de um +// processo consigo mesmo (ou com outro processo no MESMO container) +// já não atravessa bridge/veth/netfilter — não tem nada a ganhar com +// o bypass do sockmap, só risco. Foi justamente uma rajada de +// centenas de mensagens grandes pro loopback do nginx (127.0.0.6) +// que apareceu correlacionada com travamentos de página em produção. // Só registramos conexões onde ambos os lados são privados -// (i.e., comunicação intra-host / intra-container). +// RFC-1918 (i.e., comunicação DE VERDADE entre containers). // ───────────────────────────────────────────────────────── static __always_inline bool is_local_ip(__u32 ip_be) { @@ -122,7 +130,6 @@ static __always_inline bool is_local_ip(__u32 ip_be) if (o1 == 10) return true; // 10.0.0.0/8 if (o1 == 172 && o2 >= 16 && o2 <= 31) return true; // 172.16.0.0/12 if (o1 == 192 && o2 == 168) return true; // 192.168.0.0/16 - if (o1 == 127) return true; // 127.0.0.0/8 loopback return false; }