使用 eBPF 和 AF_XDP 时回复 IP 数据包丢失 --- 它们去了哪里?

使用 eBPF 和 AF_XDP 时回复 IP 数据包丢失 --- 它们去了哪里?

我有一个测试用例eBPF/AF_XDP 测试用例它应该从接口接收传入的以太网数据包,使用 AF_XDP 套接字将它们发送到用户空间,根据某些标准对它们进行过滤(目前我接受所有数据包),然后使用 tun/tap“tun”接口将它们发送到 Linux 内核进行常规网络堆栈处理。

为了使测试用例运行,您必须将 xsk_def_xdp_prog.c 文件复制到 xdp-tools 中的匹配文件(xdp-tools/lib/libxdp/xsk_def_xdp_prog.c)上,然后重建并安装 libxdp。

大多数入站数据包都应生成答复,例如,传入的 ICMP ping 请求应生成 ICMP ping 响应,并且如果正在运行 sshd,则 ssh 会话的传入 tcp SYN 请求应生成 tcp ACK 数据包。tun 接口上的“tcpdump”确认数据包已到达那里。

但是我没有看到任何响应数据包。我原本希望响应数据包从内核网络堆栈发送到运行用于入口的 eBPF 程序的 eth 设备;但“tcpdump”没有显示任何内容,并且“ping”和“ssh”在客户端计算机上都没有收到任何响应。

我以为数据包可能会发送到 tun 接口,但事实似乎也不是这样。

谁能告诉我这些数据包要发往哪里以及如何追踪它们?

'iptables' 似乎没有丢弃它们;我尝试了 'iptables -P FORWARD ACCEPT' 和 'iptables -F FORWARD',但没有效果,现在 'iptables -L' 显示

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

/proc/sys/net/ipv4 下的所有“转发”控制也都设置为 1,因此禁用转发不是问题。

我正在使用带有 5.15.0-48-generic 内核的 Ubuntu 22.04。

相关内容