使用bpf_redirect()重定向至网卡B,为何未触发其TC ingress钩子?
问题解答
当通过bpf_redirect()(或bpf_redirect_map())将数据包从网卡A重定向到网卡B时,不会触发网卡B的TC ingress钩子,但会触发其TC egress钩子,这是由Linux网络栈的数据包路径设计决定的:
- 内核中,
bpf_redirect()会将数据包直接送入网卡B的传输队列(tx queue),跳过了网卡B的ingress路径处理。Ingress钩子是为从物理链路接收的数据包设计的,而重定向的数据包属于内核内部转发,不走物理接收的完整流程。 - 数据包进入网卡B的tx队列后,会正常经过TC egress的处理流程,这就是测试中egress程序能正常触发的原因。
如果需要对这类重定向的数据包做类似ingress的处理,可以考虑以下方案:
- 在发起重定向的网卡A的BPF程序中提前处理数据包逻辑;
- 使用XDP程序挂载到网卡B的XDP钩子,XDP在驱动层面处理,内核内部转发的数据包也会触发XDP(需内核版本4.18+支持该特性);
- 利用cgroup BPF钩子,在套接字层面处理相关流量。
内容的提问来源于stack exchange,提问作者light_rain
相关产品推荐
相关产品推荐

