我编写了一个使用 AF_XDP 套接字的应用程序,目前接口上接收的所有数据包都由 Af_XDP 应用程序接收。该应用程序过滤特定端口号的数据包,所有其他数据包都使用 tap 接口重新注入到 linux 网络堆栈中。我在系统上运行了其他应用程序。我正在使用 tap 将数据包推回,但发现没有任何东西被传送到其他应用程序。tcpdump 显示数据包是在 tap 接口接收的。我假设在 tap 接口接收到的数据包将由网络堆栈处理,其他应用程序将通过该堆栈接收数据包,经过处理后,数据包将从真实接口发出。但事实并非如此。
答案1
我的情况是,在从 AF_XDP 套接字收到数据包后,我将其写入 TAP 接口,假设该数据包将被注入内核。但在我的例子中,内核丢弃了数据包,因为数据包的 MAC 地址与 TAP 接口的 MAC 地址不同。
这个问题有两个解决方案。一个是将数据包 eth_dst 修改为广播地址,或者将 TAP 接口设置为混杂模式。之后一切正常。
此外,rp_filter 也需要禁用,否则数据包将在 IP 层丢失。
- 禁用 rp_filter
- 检查 MAC 地址是否与 TAP 接口或广播相同或者使用 TUN 接口,或者您可以在混杂模式下使用 TAP 接口。