Назад | Перейти на главную страницу

фильтры 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 не имеет класса по умолчанию). Исходящий трафик виртуальных машин помечается цифрой 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.

Это выходы после отправки 83 пакетов от ВМ1 (все отмечены правильно).

#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 все работает, как ожидалось. Что я здесь делаю не так?

Поскольку DRR не имеет очереди по умолчанию, вам необходимо назначить трафик arp для определенной очереди, иначе эти пакеты будут отброшены, что приведет к тому, что ваша машина забудет физический адрес шлюза.