使用iptables,ipset和tc(–match-set和–set-mark)进行stream量整形

我认为应该是一个相当直接的stream量整形问题,我有一些麻烦。

我有一个Ubuntu(16.04)服务器,充当路由器/ NAT。 我想让大多数用户使用2mbps的互联网,同时将一些设备限制在512kbps。

我有一个ipset节stream设备的列表。 我试图--mark-set来自这些设备的数据包,以便tc可以通过stream量整形来标记它们。

我目前的设置是:

 tc qdisc del root dev $LAN tc qdisc add dev $LAN root handle 1: htb default 20 tc class add dev $LAN parent 1: classid 1:1 htb rate 6mbit burst 15k tc class add dev $LAN parent 1:1 classid 1:10 htb rate 5mbit burst 15k tc class add dev $LAN parent 1:1 classid 1:20 htb rate 2mbit ceil 2mbit burst 15k tc class add dev $LAN parent 1:1 classid 1:30 htb rate 512kbit ceil 512kbit burst 15k tc qdisc add dev $LAN parent 1:10 handle 10: sfq perturb 10 tc qdisc add dev $LAN parent 1:20 handle 20: sfq perturb 10 tc qdisc add dev $LAN parent 1:30 handle 30: sfq perturb 10 tc filter add dev $LAN protocol ip parent 1: prio 1 handle 6 fw flowid 1:30 $IPS create throttled hash:mac -exist $IPS add throttled 00:11:22:33:44:55 -exist $IPT -A PREROUTING -t mangle -m set --match-set throttled src,dst -j MARK --set-mark 6 

这不会节制我下降到512kbps(假设我的mac地址是提供的),它回落到默认的2mbps

如果我删除了--match-set部分,它正确地将所有设备节stream到512kbps(这使我认为tc部分是正确的)

但是,如果我DROP匹配这个集合的数据包,它会正确地丢弃数据包(这使我认为iptables部分是正确的)

我在这里错过了什么,或者这两个命令不能像这样一起使用?

任何帮助不胜感激。

谢谢,

有人认为…你的设备包含MAC地址,但我怀疑PREROUTING规则是试图匹配src或dst IP地址,而不是MAC地址。