我想使用以下方式降低特定网络流量的优先级tc
尤其tc-u32
在我的 Linux 服务器上。换句话说,所有其他流量必须比具有指定 IP 协议的流量具有更高的优先级。
我正在尝试应用此 tc 过滤规则来降低传出的 ICMP 流量的优先级:
tc f a dev eno1 parent 1: prio 2 u32 match ip protocol 1 0xff
但它返回此错误:
RTNETLINK answers: Invalid argument
We have an error talking to the kernel
对于这个上下文中的 tc,我仍然不清楚以下几点:
- 如何让这个规则正常发挥作用?
- 我是否需要另一条规则来告诉 Linux 类似“所有其他流量都享有 1 个优先级”或者这是默认完成的?
- 这些命名背后的基本逻辑是什么 -
1:
、2:
等等?是什么0xff
意思?我应该明确指定classid
字段吗?
答案1
这可以按照我下面描述的方式完成。
首先,我们应该将接口的根规则(通常是pfifo_fast
)更改为prio
:
tc q a dev eno1 root handle 1: prio
此命令默认创建eno1
带有类别的 qdisc( - 最高优先级,- 中等,- 最低优先级)。通常,所有常规流量都会流向具有最高优先级的流量(例如通过3
1:1
1:2
1:3
1:2
服务类型/DSCP) 转到1:1
。
我们可以通过以下方式检查结果:
tc -d -s class show dev eno1
然后我们可以添加过滤规则来引导所有流量IP 协议 = 1至第 3 类(优先级较低):
tc f a dev eno1 parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:3
parent 1:
- 此过滤器已附加到 qdisc。根据过滤器结果,qdisc 决定应将此流量定向到哪个类。-
prio 1
此过滤器的优先级(优先使用优先级较低的过滤器 - 具体来说,在这种情况下无关紧要,因为只有一个过滤器)
u32
- 流量分类器
match ip protocol 1 0xff
- 当 IP-proto 1 的数据包到达时触发过滤器。0xff
- 是 IP 协议匹配的位掩码。
flowid 1:3
- 要使用的类。
您可以启动一些 ICMP 流量并Sent
通过以下方式观察结果:
watch -d -n1 'tc -d -s class show dev eno1'