![使用 eBPF 和 AF_XDP 时回复 IP 数据包丢失 --- 它们去了哪里?](https://linux22.com/image/781145/%E4%BD%BF%E7%94%A8%20eBPF%20%E5%92%8C%20AF_XDP%20%E6%97%B6%E5%9B%9E%E5%A4%8D%20IP%20%E6%95%B0%E6%8D%AE%E5%8C%85%E4%B8%A2%E5%A4%B1%20---%20%E5%AE%83%E4%BB%AC%E5%8E%BB%E4%BA%86%E5%93%AA%E9%87%8C%EF%BC%9F.png)
我有一个测试用例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。