tc 过滤器无法与 DRR 配合使用

tc 过滤器无法与 DRR 配合使用

我正在尝试使用 DRR qdisc 控制来自两个虚拟机的传出流量。

这是我想要的层次结构:

                 root
                  |
              qdisc drr
                 1:
            /     |      \  
           /      |       \
  class drr    class drr     class drr
 quantum 200  quantum 800  (w/ max quantum)
    1:1          1:2            1:3

VM1 的流量应转到 1:1,VM2 的流量转到 1:2,其他流量转到 1:3(因为 DRR 本身没有默认类别)。VM 的传出流量分别标记为 1 和 2。我iptables -L -v -n -t mangle可以看到数据包被正确标记。

我使用以下命令进行设置:

tc qdisc add dev wlan0 handle 1: root drr
tc class add dev wlan0 parent 1: classid 1:1 drr quantum 200
tc class add dev wlan0 parent 1: classid 1:2 drr quantum 800
tc class add dev wlan0 parent 1: classid 1:3 drr #used as default class
tc filter add dev wlan0 parent 1: protocol ip prio 1 handle 1 fw classid 1:1
tc filter add dev wlan0 parent 1: protocol ip prio 1 handle 2 fw classid 1:2
tc filter add dev wlan0 parent 1: protocol ip prio 2 u32 match ip dst 0.0.0.0/0 classid 1:3 #match everything

但使用此配置,我根本无法访问网络。几乎每个数据包都会被根 qdisc 丢弃。

这些是从 VM1 发送 83 个数据包(全部正确标记)后的输出。

#tc -s class show dev wlan0
class drr 1:1 root quantum 200b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
 deficit 0b
class drr 1:2 root quantum 800b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
 deficit 0b
class drr 1:3 root quantum 1514b
 Sent 118029 bytes 497 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
 deficit 0b

#tc -s qdisc show dev wlan0
qdisc drr 1: root refcnt 2
 Sent 117057 bytes 493 pkt (dropped 3372, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0

如您所见,没有数据包被定向到 1:1,并且来自非虚拟机流量,只有一小部分被定向到 1:3。

当使用与 HTB 相同的过滤命令时,一切都按预期工作。我在这里做错了什么?

答案1

由于 DRR 没有默认队列,您必须将 arp 流量分配给特定队列,否则这些数据包将被丢弃,导致您的机器忘记其网关物理地址。

相关内容