vlan 上的 tc 速率限制

vlan 上的 tc 速率限制

我已经找到了这个先前的答案(https://serverfault.com/questions/461153/vlan-based-rate-limiting-using-tc),但是尝试将 VLAN 匹配添加到我的脚本中会产生:

什么是“把柄”?用法:...基本[匹配EMATCH_TREE][操作ACTION_SPEC][classid CLASSID]

其中: SELECTOR := SAMPLE SAMPLE ... FILTERID := X:Y:Z ACTION_SPEC := ... 查看各个操作

注意:CLASSID 被解析为十六进制输入。

我的脚本如下。它在物理接口上工作得很好,但如果我用em1它替换vlanXXX(其中 XX 是 VLAN 号!),它就会失败。

操作系统是 openSUSE LEAP15 (4.12.14-lp150.12.16-default #1 SMP Tue Aug 14 17:51:27 UTC 2018 (28574e6) x86_64 x86_64 x86_64 GNU/Linux)

#!/bin/bash
tc qdisc add dev vlanXX root handle 1:0 htb default 10
tc class add dev vlanXX parent 1:0 classid 1:10 htb rate 1000mbit ceil 1000mbit prio 0
tc class add dev vlanXX parent 1:0 classid 1:20 htb rate  15mbit ceil 16mbit prio 0
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 20
iptables -A OUTPUT -t mangle -p tcp --dport 443 -j MARK --set-mark 20
tc filter add dev vlanXX parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20

这是我根据其他答案尝试的过滤器 VLAN 匹配:

tc filter add dev em1 parent 1:0 prio 0 protocol ip basic match "meta(vlan mask 0xfff eq 0x07D1)" handle 20 fw flowid 1:20

***更新:

我发现这个语法安装正常:

 tc filter add dev em1 parent 1:0 prio 0 protocol ip handle 20 basic match "meta(vlan mask 0xfff eq 0xB2)" flowid 1:20

sudo tc filter show dev em1 过滤器父级 1:协议 ip pref 49152

基本过滤器父级 1:协议 ip pref 49152 基本句柄 0x14

flowid 1:20 元(VLAN 掩码 0x00000fff eq 178)

但我不知道如何让fw语法工作(这样我可以使用 iptables 来设置速率限制适用于哪些端口,而不是限制整个接口的速率)

例如,这不起作用:

 sudo tc filter add dev em1 parent 1:0 prio 0 protocol ip handle 20 fw basic match "meta(vlan mask 0xfff eq 0xB2)" flowid 1:20

基本匹配“meta(vlan mask 0xfff eq 0xB2)” flowid 1:20

什么是“基本”?用法: ... fw [ classid CLASSID ] [ indev DEV ] [ action ACTION_SPEC ] CLASSID := 将匹配的数据包推送到 CLASSID 标识的类,格式为 X:Y CLASSID 被解析为十六进制输入。 DEV := 指定传入设备分类的设备。 ACTION_SPEC := 对匹配的数据包应用操作。注意:句柄表示为 HANDLE[/FWMASK]。 FWMASK 默认为 0xffffffff。

答案1

参数的顺序很重要。从手册页:

tc [ OPTIONS ] filter [ add | change | replace | delete | get ] dev DEV
   [ parent qdisc-id | root ] [ handle filter-id ] protocol protocol prio priority 
   filtertype [ filtertype specific parameters ] flowid flow-id

据此,句柄规格应在 之前protocol

尽管 tc 命令本身以相反的方式显示它:

$ tc filter help
Usage: tc filter [ add | del | change | replace | show ] [ dev STRING ]
[...]
   [ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]
   [ estimator INTERVAL TIME_CONSTANT ]
   [ root | ingress | egress | parent CLASSID ]
   [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]
     ^^^

但它仍然在 FILTER_TYPE 之前,这是实际的过滤条件。

在你的命令下:

tc filter add dev em1 parent 1:0 prio 0 protocol ip
   basic match "meta(vlan mask 0xfff eq 0x07D1)"
   handle 20 fw flowid 1:20

...句柄位于过滤器之后(基本匹配...),因此,它不再被识别。当然,可能有一个带有自己handle参数的过滤器,但我认为这里不是这种情况。

请注意,我还没有检查这个过滤器是否有意义,但“句柄是什么?”解析错误应该是由参数顺序单独引起的。对于您显示的其他命令,我也没有收到此错误。

相关内容