Вопрос или проблема
К сожалению, у меня не так много опыта в системном администрировании и настройке систем 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, возникает конкуренция за ресурсы. Когда один клиент получает допустимую скорость, второй испытывает нехватку пропускной способности.
Решение
-
Конфигурация классов:
Вы можете настроить так, чтобы каждый клиент получал свою собственную полосу, выходящую за пределы общего класса. Это можно сделать с помощью дополнительной иерархии классов. -
Создание общего класса для всей подсети:
Вместо создания отдельных классов для каждого клиента, вы можете использовать один класс для всей подсети и назначить каждому клиенту поток с доступной пропускной способностью, что улучшит управление трафиком.
Приведённая ниже конфигурация является примером:
# Очищаем предыдущее состояние
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 кбит/с без взаимных конфликтов. Эта настройка обеспечит баланс между клиентами и корректную работу системы управления трафиком.