You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tc ingress链中多BPF过滤器的关联关系及流量处理逻辑问询

问题结论

你的猜测完全正确,第二个过滤器能否收到流量完全取决于第一个带direct-action标记的BPF程序的返回值,二者不存在默认都会接收同一份流量的关联。

具体逻辑说明

1. 先明确你的挂载场景特征

从你给出的tc filter show输出可以看到两个过滤器的挂载链不同:

  • 优先级pref 1的过滤器挂载在ingress qdisc的默认入口链chain 0
  • 优先级pref 2的过滤器挂载在自定义链chain 1
    ingress qdisc收到报文后,默认只会进入chain 0开始处理,不会自动跳转到其他自定义链。

2. direct-action参数的作用

挂载tc BPF过滤器时加的direct-action(常简写为da)标记,会让BPF程序的返回值直接决定报文的后续处理走向,跳过传统tc的分类、排队后续逻辑:

  • 如果第一个BPF程序返回TC_ACT_SHOT:报文直接被丢弃,不会有任何后续处理,第二个过滤器完全收不到该报文
  • 如果第一个BPF程序返回TC_ACT_OK、TC_ACT_REDIRECT、TC_ACT_STOLEN这类终止性返回值:会直接结束ingress qdisc的处理流程,不会继续匹配其他过滤器,也不会跳转到chain 1
  • 如果第一个BPF程序返回TC_ACT_UNSPEC:会继续匹配chain 0内更低优先级的过滤器,但你的第二个过滤器不在chain 0,因此还是不会被执行
  • 只有一种情况能触发第二个过滤器执行:第一个BPF程序主动调用bpf_tc_redirect_to_chain(1)辅助函数,显式将报文跳转到chain 1,才会执行pref 2的过滤器逻辑。

3. 如果第二个过滤器也挂载在chain 0的情况

如果你是把pref 2的过滤器也挂载在chain 0,规则和上面一致:只有第一个BPF返回TC_ACT_UNSPEC时,才会继续匹配pref 2的过滤器,其他返回值都会直接终止处理流程,pref 2不会收到流量。

内容的提问来源于stack exchange,提问作者rookie099

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 19:54:03