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

Использование tc qdisc, class и filter для ограничения пропускной способности (как входящей, так и исходящей) на основе меток DSCP

Я хочу настроить программу формирования трафика, которая ограничивает как входящий, так и исходящий трафик на основе 6-битного поля DSCP в заголовке пакета IPv4. Пользователь должен иметь возможность указывать разные скорости для разных значений DSCP. Для этого я использую tc и iptables.

Пока что я пробовал следующий процесс формирования исходящего трафика. Я отмечаю входящие пакеты на основе их значений DSCP, а затем фильтрую эти пакеты по определенным классам с разными скоростями, которые могут быть указаны пользователем. У меня была бы маркировка и класс для каждого из возможных значений DSCP. Действует ли следующий метод формирования исходящего трафика?

iptables -t mangle -A PREROUTING -m dscp --dscp <value> -j MARK --set-mark <value>

tc filter add dev eth0 parent 1:0 protocol ip handle <value> fw classid 1:<value>

tc qdisc add dev eth0 root handle 1: htb default <default class>
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
tc class add dev eth0 parent 1:1 classid 1:<value> htb rate <user specified rate>mbit ceil 100mbit

Однако у меня возникли трудности с формированием входящего трафика с помощью аналогичного процесса. Подходы, которые у меня есть до сих пор, описаны в этой ссылке: Tc: входящая политика и зеркалирование ifb. Однако меня беспокоит то, что входящий трафик пересылается до того, как будет произведена маркировка iptables. Это означало бы, что весь трафик для ifb0 будет перенаправлен в класс по умолчанию.

Есть ли способ фильтровать пакеты на основе их меток DSCP без использования iptables, просто используя tc (или другой процесс)?

Кроме того, есть ли другие методы ограничения входящего трафика? Я считаю, что входящий qdisc не имеет возможностей класса, что затрудняет для меня определение конкретных скоростей для разных значений DSCP.