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
相关产品推荐
相关产品推荐

