tc中ingress与egress定义及mirred重定向参数疑问
问题解答
为什么需要手动创建ingress qdisc?
ingress qdisc 不会默认自动加载。它是一个特殊的无队列qdisc,仅用于挂载入站方向的流量过滤器,本身没有排队、整形能力。因为大部分场景不需要对入站流量做额外控制,内核默认不会为网卡初始化这个qdisc,只有当你需要处理入站流量时才需要手动创建,你用到的tc qdisc add dev eth0 ingress handle ffff:0就是这个初始化操作,其中ffff:0是ingress qdisc的固定主编号约定。
为什么mirred动作要指定egress参数?
首先明确ingress/egress的核心定义:所有方向判定都是相对于当前操作的网络设备而言的,和qdisc的入队出队逻辑没有直接关联:
- 对任意网络设备,流量从外部流入设备、走向内核协议栈的方向为ingress
- 流量从内核协议栈发出、要通过设备向外发送的方向为egress
你提到的action mirred egress redirect dev ifb0里的egress,指的是将从eth0 ingress方向抓取到的流量,注入到ifb0的egress方向处理流程,并不是说原本的入站流量属性发生了变化。
这么设计的核心原因是:tc原生的排队、整形、调度能力(比如HTB、FQ、cake等常用qdisc)最初都是为egress方向设计的,ingress qdisc本身没有队列,无法实现这类需要缓存排队的功能。而IFB虚拟设备的作用就是把入站流量拐到自身的egress方向,复用现有egress方向的所有流量控制能力,实现入站流量的整形、限速。如果这里指定注入到ifb0的ingress方向,还是会走到ifb0无队列的ingress qdisc,达不到排队处理的目的。
完整逻辑梳理
你用到的这两条命令是Linux tc实现入站流量整形的标准方案:
- 为物理网卡eth0创建ingress qdisc,挂载过滤器捕获所有入站流量
- 通过mirred动作把所有入站流量转发到ifb0的egress方向
- 在ifb0的egress上挂载需要的qdisc规则,对入站流量做整形、限速等处理
- 处理完成的流量会从ifb0送回内核协议栈继续处理,等效于直接对eth0的入站流量做了控制
内容的提问来源于stack exchange,提问作者krop
相关产品推荐
相关产品推荐

