несколько сконфигурированных правил TC (TrafficControl) становятся едиными

Вопрос или проблема

К сожалению, у меня не так много опыта в системном администрировании и настройке систем Linux, поэтому, пожалуйста, не будьте слишком строги ко мне; я все еще учусь 😉

Настройка сети:

172.21.0.1 – сервер с управлением трафиком.

172.21.0.2 – второй сервер, хранящий файлы, запрашиваемые клиентами через HTTP.

172.21.0.6 и 172.21.0.7 – два клиентских устройства.

Я пытаюсь настроить управление трафиком для клиентов WireGuard:

tc qdisc add dev wg0 parent root handle 1:0 hfsc default 10

# Корневая класс
tc class add dev wg0 parent 1: classid 1:1 hfsc sc rate 1gbit ul rate 1gbit

# Зарезервированный трафик
# Гарантированная пропускная способность 500 Мбит/с и максимум 1 Гбит/с
tc class add dev wg0 parent 1:1 classid 1:10 hfsc sc rate 500mbit ul rate 1gbit

# Клиентский трафик
# Гарантированная пропускная способность 500 Мбит/с и максимум 1 Гбит/с
tc class add dev wg0 parent 1:1 classid 1:20 hfsc sc rate 500mbit ul rate 1gbit

# Управление трафиком для отдельного клиента 6
tc class add dev wg0 parent 1:20 classid 1:3006 hfsc sc rate 100kbit ul rate 100kbit
tc filter add dev wg0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.21.0.6/32 flowid 1:3006

# Управление трафиком для отдельного клиента 7
tc class add dev wg0 parent 1:20 classid 1:3007 hfsc sc rate 100kbit ul rate 100kbit
tc filter add dev wg0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.21.0.7/32 flowid 1:3007

tc -pretty filter show dev wg0

filter parent 1: protocol ip pref 2 u32 chain 0
filter parent 1: protocol ip pref 2 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol ip pref 2 u32 chain 0 fh 800::801 order 2049 key ht 800 bkt 0 *flowid 1:3006 not_in_hw
  match IP dst 172.21.0.6/32
filter parent 1: protocol ip pref 2 u32 chain 0 fh 800::802 order 2050 key ht 800 bkt 0 *flowid 1:3007 not_in_hw
  match IP dst 172.21.0.7/32

tc -graph class show dev wg0

+---(1:) hfsc
     +---(1:1) hfsc sc m1 0bit d 0us m2 1Gbit ul m1 0bit d 0us m2 1Gbit
          +---(1:10) hfsc sc m1 0bit d 0us m2 500Mbit ul m1 0bit d 0us m2 1Gbit
          +---(1:20) hfsc sc m1 0bit d 0us m2 500Mbit ul m1 0bit d 0us m2 1Gbit
               +---(1:3007) hfsc sc m1 0bit d 0us m2 100Kbit ul m1 0bit d 0us m2 100Kbit
               +---(1:3006) hfsc sc m1 0bit d 0us m2 100Kbit ul m1 0bit d 0us m2 100Kbit
          |
     |    |

При попытке скачать файл с обоих клиентов одновременно, только один получает 100kbit, в то время как другой получает 0kbit 🙁

Что я делаю не так?
Сервер: Debian 12 на KVM.

P.S.: Ограничение в 100kbit/с просто для тестирования функциональности управления трафиком.

Я также буду признателен за предложения по поводу того, как переписать конфигурацию. Возможно, я делаю это совершенно неправильно, и может быть более оптимальный способ (например, настроить один класс для всей подсети, чтобы все клиенты WireGuard получали индивидуальное ограничение в 100kbit).

Ответ или решение

Вопрос о конфигурации TrafficControl (tc) для WireGuard клиентов

К сожалению, вы столкнулись с классической проблемой в настройке QoS (качество обслуживания) в Linux с помощью tc. Давайте разберёмся, почему только один клиент получает лимит 100 кбит/с, а другой остается с 0 кбит/с, и как вы можете оптимизировать вашу конфигурацию.

Проблема

При использовании tc для управления трафиком клиентам 172.21.0.6 и 172.21.0.7 вы определили два отдельных класса (1:3006 и 1:3007) с одинаковыми ограничениями на скорость. Однако, оба класса находятся под одним родительским классом (1:20), который имеет общий ресурс. Поскольку оба клиента пытаются одновременно использовать полосу в 100 кбит/с и лимит общего трафика на уровне 500 кбит/с класса 1:20, возникает конкуренция за ресурсы. Когда один клиент получает допустимую скорость, второй испытывает нехватку пропускной способности.

Решение

  1. Конфигурация классов:
    Вы можете настроить так, чтобы каждый клиент получал свою собственную полосу, выходящую за пределы общего класса. Это можно сделать с помощью дополнительной иерархии классов.

  2. Создание общего класса для всей подсети:
    Вместо создания отдельных классов для каждого клиента, вы можете использовать один класс для всей подсети и назначить каждому клиенту поток с доступной пропускной способностью, что улучшит управление трафиком.

Приведённая ниже конфигурация является примером:

# Очищаем предыдущее состояние
tc qdisc del dev wg0 root

# Создаем корневой класс
tc qdisc add dev wg0 root handle 1:0 hfsc default 10

# Корневой класс с общей пропускной способностью
tc class add dev wg0 parent 1: classid 1:1 hfsc sc rate 1gbit ul rate 1gbit

# Класс для клиентов с гарантированной пропускной способностью 100kbit
tc class add dev wg0 parent 1:1 classid 1:20 hfsc sc rate 500mbit ul rate 1gbit

# Регулировка класса для клиента 6
tc class add dev wg0 parent 1:20 classid 1:3006 hfsc sc rate 100kbit ul rate 100kbit
tc filter add dev wg0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.21.0.6/32 flowid 1:3006

# Регулировка класса для клиента 7
tc class add dev wg0 parent 1:20 classid 1:3007 hfsc sc rate 100kbit ul rate 100kbit
tc filter add dev wg0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.21.0.7/32 flowid 1:3007

Рекомендации

  • Мониторинг: Используйте команды tc для мониторинга состояния классов и фильтров после внесения изменений, чтобы убедиться, что изменение конфигурации работает как ожидается.

  • Статистика: Проверяйте ресурсы с помощью tc -s class show dev wg0 для получения статистики по каждому классу. Это поможет понять, расходуются ли ресурсы правильно.

  • Тестирование: Запустите тесты с различными потоками данных от клиентов 6 и 7, чтобы убедиться, что оба клиента получают свою пропускную способность одновременно.

С правильной конфигурацией вы должны получить возможность одновременно ограничивать скорость обоих клиентов до 100 кбит/с без взаимных конфликтов. Эта настройка обеспечит баланс между клиентами и корректную работу системы управления трафиком.

Оцените материал
Добавить комментарий

Капча загружается...