我已经找到了这个先前的答案(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
参数的过滤器,但我认为这里不是这种情况。
请注意,我还没有检查这个过滤器是否有意义,但“句柄是什么?”解析错误应该是由参数顺序单独引起的。对于您显示的其他命令,我也没有收到此错误。