# QoS (Quality of Service) в VyOS

> Настройка QoS в VyOS: Traffic Policy, приоритизация трафика, bandwidth shaping, queuing дисциплины и классификация пакетов для Yandex Cloud и VK Cloud

Source: https://opennix.org/docs/vyos/qos/


VyOS предоставляет мощные механизмы Quality of Service (QoS) для управления полосой пропускания, приоритизации трафика и контроля задержек в сетевых соединениях.

## Концепция QoS

### Основные задачи QoS

**Quality of Service решает:**
- Приоритизация критичного трафика (VoIP, видеоконференции)
- Ограничение полосы пропускания для некритичных сервисов
- Предотвращение перегрузки каналов связи
- Гарантирование минимальной пропускной способности
- Управление задержками и джиттером
- Контроль burst трафика

**Основные метрики:**
- **Bandwidth (пропускная способность)**: Объем данных за единицу времени
- **Latency (задержка)**: Время доставки пакета
- **Jitter (джиттер)**: Вариация задержки
- **Packet loss (потери пакетов)**: Процент потерянных пакетов

### Компоненты QoS в VyOS

**Traffic Policy:**
- Определение правил обработки трафика
- Классификация пакетов по различным критериям
- Применение действий к классифицированному трафику

**Queueing Disciplines (очереди):**
- FIFO (First In First Out)
- Priority Queue
- Class-based Queue
- Fair Queue
- Random Early Detection (RED)

**Traffic Shaping vs Policing:**
- **Shaping**: Сглаживание трафика с использованием буферов
- **Policing**: Отбрасывание превышающего трафика

## Traffic Policy Types

### 1. Shaper (Traffic Shaping)

Ограничение исходящего трафика с возможностью приоритизации:

```bash
configure

# Создание shaper policy
set traffic-policy shaper WAN-OUT bandwidth '100mbit'
set traffic-policy shaper WAN-OUT default bandwidth '10mbit'
set traffic-policy shaper WAN-OUT default ceiling '50mbit'
set traffic-policy shaper WAN-OUT default priority '7'

# Класс для VoIP (высокий приоритет)
set traffic-policy shaper WAN-OUT class 10 bandwidth '20mbit'
set traffic-policy shaper WAN-OUT class 10 ceiling '30mbit'
set traffic-policy shaper WAN-OUT class 10 priority '1'
set traffic-policy shaper WAN-OUT class 10 match voip ip dscp 'ef'

# Класс для видео
set traffic-policy shaper WAN-OUT class 20 bandwidth '30mbit'
set traffic-policy shaper WAN-OUT class 20 ceiling '40mbit'
set traffic-policy shaper WAN-OUT class 20 priority '2'
set traffic-policy shaper WAN-OUT class 20 match video ip protocol 'udp'
set traffic-policy shaper WAN-OUT class 20 match video destination port '1935,5004,5005'

# Применение на интерфейс
set interfaces ethernet eth0 traffic-policy out 'WAN-OUT'

commit
save
```

### 2. Limiter (Rate Limiting)

Ограничение входящего трафика:

```bash
configure

# Создание limiter policy
set traffic-policy limiter LAN-IN bandwidth '1gbit'

# Класс для guest сети (ограничение 10 Mbps)
set traffic-policy limiter LAN-IN class 10 bandwidth '10mbit'
set traffic-policy limiter LAN-IN class 10 match guest-net source address '192.168.100.0/24'

# Класс для torrents (ограничение 5 Mbps)
set traffic-policy limiter LAN-IN class 20 bandwidth '5mbit'
set traffic-policy limiter LAN-IN class 20 match torrent destination port '6881-6889'
set traffic-policy limiter LAN-IN class 20 priority '7'

# Класс по умолчанию
set traffic-policy limiter LAN-IN default bandwidth '100mbit'

# Применение на интерфейс
set interfaces ethernet eth1 traffic-policy in 'LAN-IN'

commit
save
```

### 3. Priority Queue

Строгая приоритизация трафика:

```bash
configure

# Создание priority queue policy
set traffic-policy priority-queue PRIORITY-OUT

# Очередь 1 (высший приоритет) - VoIP
set traffic-policy priority-queue PRIORITY-OUT class 1 queue-limit '100'
set traffic-policy priority-queue PRIORITY-OUT class 1 match voip ip dscp 'ef'

# Очередь 2 - интерактивный трафик (SSH, DNS)
set traffic-policy priority-queue PRIORITY-OUT class 2 queue-limit '200'
set traffic-policy priority-queue PRIORITY-OUT class 2 match ssh destination port '22'
set traffic-policy priority-queue PRIORITY-OUT class 2 match dns destination port '53'

# Очередь 3 - веб трафик
set traffic-policy priority-queue PRIORITY-OUT class 3 queue-limit '500'
set traffic-policy priority-queue PRIORITY-OUT class 3 match http destination port '80,443'

# Очередь по умолчанию (низший приоритет)
set traffic-policy priority-queue PRIORITY-OUT default queue-limit '1000'

# Применение на интерфейс
set interfaces ethernet eth0 traffic-policy out 'PRIORITY-OUT'

commit
save
```

### 4. Fair Queue (SFQ)

Справедливое распределение полосы пропускания:

```bash
configure

# Создание fair queue policy
set traffic-policy fair-queue FAIR-QUEUE queue-limit '127'

# Применение на интерфейс
set interfaces ethernet eth2 traffic-policy out 'FAIR-QUEUE'

commit
save
```

### 5. Random Early Detection (RED)

Предотвращение перегрузки очередей:

```bash
configure

# Создание random-detect policy
set traffic-policy random-detect RED-QUEUE bandwidth '100mbit'

# Настройка параметров RED
set traffic-policy random-detect RED-QUEUE precedence 0 minimum-threshold '10'
set traffic-policy random-detect RED-QUEUE precedence 0 maximum-threshold '20'
set traffic-policy random-detect RED-QUEUE precedence 0 mark-probability '10'

# Применение на интерфейс
set interfaces ethernet eth0 traffic-policy out 'RED-QUEUE'

commit
save
```

### 6. Drop Tail

Простое отбрасывание пакетов при заполнении очереди:

```bash
configure

# Создание drop-tail policy
set traffic-policy drop-tail DROP-TAIL queue-limit '1000'

# Применение на интерфейс
set interfaces ethernet eth3 traffic-policy out 'DROP-TAIL'

commit
save
```

## Классификация трафика

### По IP адресам

```bash
# Source address
set traffic-policy shaper WAN-OUT class 10 match users source address '192.168.1.0/24'

# Destination address
set traffic-policy shaper WAN-OUT class 20 match servers destination address '10.0.0.0/8'

# Конкретный хост
set traffic-policy shaper WAN-OUT class 30 match host source address '192.168.1.100'
```

### По портам и протоколам

```bash
# TCP порты
set traffic-policy shaper WAN-OUT class 10 match http destination port '80,443'
set traffic-policy shaper WAN-OUT class 10 match http protocol 'tcp'

# UDP порты (range)
set traffic-policy shaper WAN-OUT class 20 match rtp destination port '10000-20000'
set traffic-policy shaper WAN-OUT class 20 match rtp protocol 'udp'

# Source порт
set traffic-policy shaper WAN-OUT class 30 match ephemeral source port '32768-61000'
```

### По DSCP/TOS маркировке

```bash
# DSCP маркировка
set traffic-policy shaper WAN-OUT class 10 match voip ip dscp 'ef'
set traffic-policy shaper WAN-OUT class 20 match video ip dscp 'af41'
set traffic-policy shaper WAN-OUT class 30 match data ip dscp 'af21'

# TOS поле
set traffic-policy shaper WAN-OUT class 40 match priority ip tos '0x10'
```

### По интерфейсу

```bash
# Входящий интерфейс
set traffic-policy shaper WAN-OUT class 10 match lan interface 'eth1'
```

### По MAC адресу

```bash
# MAC source
set traffic-policy shaper WAN-OUT class 10 match device mac source '00:11:22:33:44:55'
```

## DSCP Маркировка

### Установка DSCP меток

```bash
configure

# Маркировка VoIP трафика
set traffic-policy shaper WAN-OUT class 10 set-dscp 'ef'
set traffic-policy shaper WAN-OUT class 10 match voip destination port '5060,5061'

# Маркировка видео трафика
set traffic-policy shaper WAN-OUT class 20 set-dscp 'af41'
set traffic-policy shaper WAN-OUT class 20 match video destination port '1935'

# Маркировка критичных данных
set traffic-policy shaper WAN-OUT class 30 set-dscp 'af21'
set traffic-policy shaper WAN-OUT class 30 match database destination port '3306,5432'

commit
save
```

### Стандартные DSCP значения

```
EF (Expedited Forwarding): 46 - VoIP
AF41 (Assured Forwarding): 34 - Видео высокого качества
AF31: 26 - Потоковое видео
AF21: 18 - Критичные данные
AF11: 10 - Стандартные данные
BE (Best Effort): 0 - Обычный трафик
```

## Сценарии использования

### 1. Офисный интернет-канал

Приоритизация корпоративного трафика:

```bash
configure

# 100 Mbps WAN канал
set traffic-policy shaper OFFICE-WAN bandwidth '100mbit'

# VoIP (гарантия 10 Mbps, до 20 Mbps)
set traffic-policy shaper OFFICE-WAN class 10 bandwidth '10mbit'
set traffic-policy shaper OFFICE-WAN class 10 ceiling '20mbit'
set traffic-policy shaper OFFICE-WAN class 10 priority '1'
set traffic-policy shaper OFFICE-WAN class 10 match voip ip dscp 'ef'

# Видеоконференции (гарантия 20 Mbps, до 40 Mbps)
set traffic-policy shaper OFFICE-WAN class 20 bandwidth '20mbit'
set traffic-policy shaper OFFICE-WAN class 20 ceiling '40mbit'
set traffic-policy shaper OFFICE-WAN class 20 priority '2'
set traffic-policy shaper OFFICE-WAN class 20 match zoom destination port '8801,8802'
set traffic-policy shaper OFFICE-WAN class 20 match teams destination port '3478-3481'

# Бизнес-приложения (гарантия 30 Mbps)
set traffic-policy shaper OFFICE-WAN class 30 bandwidth '30mbit'
set traffic-policy shaper OFFICE-WAN class 30 ceiling '60mbit'
set traffic-policy shaper OFFICE-WAN class 30 priority '3'
set traffic-policy shaper OFFICE-WAN class 30 match business destination address '10.0.0.0/8'

# Обычный веб-серфинг
set traffic-policy shaper OFFICE-WAN default bandwidth '20mbit'
set traffic-policy shaper OFFICE-WAN default ceiling '80mbit'
set traffic-policy shaper OFFICE-WAN default priority '5'

# Применение
set interfaces ethernet eth0 traffic-policy out 'OFFICE-WAN'

commit
save
```

### 2. Гостевая сеть с ограничениями

```bash
configure

# Ограничение guest WiFi до 10 Mbps
set traffic-policy limiter GUEST-LIMIT bandwidth '10mbit'
set traffic-policy limiter GUEST-LIMIT default bandwidth '10mbit'
set traffic-policy limiter GUEST-LIMIT default priority '7'

# Еще более жесткое ограничение для торрентов
set traffic-policy limiter GUEST-LIMIT class 10 bandwidth '1mbit'
set traffic-policy limiter GUEST-LIMIT class 10 match torrents destination port '6881-6889,51413'
set traffic-policy limiter GUEST-LIMIT class 10 priority '7'

# Применение на guest интерфейс
set interfaces ethernet eth2 traffic-policy in 'GUEST-LIMIT'

commit
save
```

### 3. ISP сценарий - клиентские ограничения

```bash
configure

# Shaper для абонента с тарифом 50 Mbps
set traffic-policy shaper CLIENT-50M bandwidth '50mbit'
set traffic-policy shaper CLIENT-50M default bandwidth '50mbit'
set traffic-policy shaper CLIENT-50M default burst '15k'

# Применение на VLAN клиента
set interfaces ethernet eth1 vif 100 traffic-policy out 'CLIENT-50M'

# Limiter для входящего трафика
set traffic-policy limiter CLIENT-50M-IN bandwidth '50mbit'
set traffic-policy limiter CLIENT-50M-IN default bandwidth '50mbit'
set interfaces ethernet eth1 vif 100 traffic-policy in 'CLIENT-50M-IN'

commit
save
```

### 4. VoIP/Video приоритизация

```bash
configure

# Strict priority для real-time трафика
set traffic-policy shaper RT-TRAFFIC bandwidth '200mbit'

# VoIP - наивысший приоритет
set traffic-policy shaper RT-TRAFFIC class 10 bandwidth '15mbit'
set traffic-policy shaper RT-TRAFFIC class 10 ceiling '20mbit'
set traffic-policy shaper RT-TRAFFIC class 10 priority '1'
set traffic-policy shaper RT-TRAFFIC class 10 queue-type 'priority'
set traffic-policy shaper RT-TRAFFIC class 10 match sip destination port '5060,5061'
set traffic-policy shaper RT-TRAFFIC class 10 match rtp destination port '10000-20000'

# Видеоконференции
set traffic-policy shaper RT-TRAFFIC class 20 bandwidth '50mbit'
set traffic-policy shaper RT-TRAFFIC class 20 ceiling '100mbit'
set traffic-policy shaper RT-TRAFFIC class 20 priority '2'
set traffic-policy shaper RT-TRAFFIC class 20 match webrtc ip dscp 'af41'

# Остальной трафик
set traffic-policy shaper RT-TRAFFIC default bandwidth '100mbit'
set traffic-policy shaper RT-TRAFFIC default ceiling '180mbit'
set traffic-policy shaper RT-TRAFFIC default priority '7'

set interfaces ethernet eth0 traffic-policy out 'RT-TRAFFIC'

commit
save
```

## Интеграция с облачными платформами

### Yandex Cloud

**Особенности:**
- Гарантированная полоса пропускания виртуальных машин
- Лимиты на burst трафик
- QoS для Cloud Interconnect
- Traffic shaping для egress трафика

```bash
configure

# Соответствие тарифу VM в Yandex Cloud
# Например: 2 vCPU = до 1 Gbps
set traffic-policy shaper YC-VM-LIMIT bandwidth '1gbit'
set traffic-policy shaper YC-VM-LIMIT default bandwidth '100mbit'
set traffic-policy shaper YC-VM-LIMIT default ceiling '1gbit'

# Приоритизация API вызовов к Yandex Cloud
set traffic-policy shaper YC-VM-LIMIT class 10 bandwidth '50mbit'
set traffic-policy shaper YC-VM-LIMIT class 10 priority '2'
set traffic-policy shaper YC-VM-LIMIT class 10 match yc-api destination address '84.201.0.0/16'

set interfaces ethernet eth0 traffic-policy out 'YC-VM-LIMIT'

commit
save
```

### VK Cloud

**Особенности:**
- Тарификация egress трафика
- QoS для внутренних сетей
- Приоритизация управляющего трафика

```bash
configure

# Shaping для экономии на egress
set traffic-policy shaper VK-EGRESS bandwidth '500mbit'

# Критичный трафик - полная скорость
set traffic-policy shaper VK-EGRESS class 10 bandwidth '100mbit'
set traffic-policy shaper VK-EGRESS class 10 ceiling '500mbit'
set traffic-policy shaper VK-EGRESS class 10 priority '1'
set traffic-policy shaper VK-EGRESS class 10 match prod source address '10.0.1.0/24'

# Backup трафик - ограничение
set traffic-policy shaper VK-EGRESS class 90 bandwidth '10mbit'
set traffic-policy shaper VK-EGRESS class 90 ceiling '50mbit'
set traffic-policy shaper VK-EGRESS class 90 priority '7'
set traffic-policy shaper VK-EGRESS class 90 match backup source address '10.0.100.0/24'

set interfaces ethernet eth0 traffic-policy out 'VK-EGRESS'

commit
save
```

## Мониторинг QoS

### Команды просмотра

```bash
# Список всех traffic policies
show traffic-policy

# Детальная информация по policy
show traffic-policy shaper WAN-OUT

# Статистика по классам
show queueing ethernet eth0

# Просмотр всех интерфейсов с QoS
show interfaces
```

Пример вывода:
```
vyos@router:~$ show queueing ethernet eth0
eth0 qdisc htb 1: root refcnt 2 r2q 10 default 7 direct_packets_stat 0
 Sent 123456789 bytes 987654 pkt (dropped 123, overlimits 456, requeues 0)

class htb 1:10 parent 1:1 prio 1 rate 20Mbit ceil 30Mbit burst 15k
 Sent 12345678 bytes 98765 pkt (dropped 12, overlimits 45, requeues 0)
```

### Тестирование QoS

```bash
# Генерация тестового трафика с помощью iperf3
# На сервере
iperf3 -s

# На клиенте (через VyOS)
iperf3 -c <server-ip> -t 30 -b 100M

# Проверка DSCP меток
tcpdump -i eth0 -v -n | grep 'tos'
```

## Лучшие практики

### Проектирование QoS

1. **Анализ трафика**: Используйте monitoring для понимания паттернов трафика
2. **Классификация**: Определите 3-5 классов трафика (больше усложняет управление)
3. **Гарантии vs Ceiling**: Гарантируйте минимум для критичного трафика
4. **Оставляйте запас**: Не распределяйте 100% bandwidth между классами
5. **DSCP маркировка**: Используйте стандартные значения для совместимости

### Настройка приоритетов

1. **Priority 1-2**: Real-time трафик (VoIP, video conferencing)
2. **Priority 3-4**: Интерактивный трафик (SSH, DNS, web)
3. **Priority 5-6**: Стандартный трафик (email, file transfer)
4. **Priority 7**: Низкоприоритетный трафик (backup, torrents)

### Производительность

1. **Hardware offload**: Используйте аппаратное ускорение где доступно
2. **Минимальная классификация**: Сложные match правила снижают производительность
3. **Queue size**: Правильно подбирайте размер очередей
4. **Burst размер**: Адекватный burst для предотвращения микро-burst потерь

### Безопасность

1. **DDoS защита**: QoS может помочь минимизировать impact DDoS
2. **Не доверяйте DSCP от клиентов**: Переписывайте входящие метки
3. **Rate limiting**: Ограничивайте нежелательный трафик

## Troubleshooting

### Проблема: QoS не работает

**Симптомы:**
- Traffic policy применен, но трафик не ограничивается

**Решение:**
```bash
# Проверить применение policy на интерфейс
show interfaces ethernet eth0

# Проверить счетчики
show queueing ethernet eth0

# Убедиться что трафик проходит через интерфейс
monitor traffic interface eth0

# Проверить match правила
show traffic-policy shaper WAN-OUT
```

### Проблема: VoIP качество низкое

**Симптомы:**
- Задержки, джиттер, потери пакетов на VoIP

**Решение:**
```bash
# Дать VoIP strict priority
set traffic-policy priority-queue VOIP-PRIORITY class 1 queue-limit '100'
set traffic-policy priority-queue VOIP-PRIORITY class 1 match rtp destination port '10000-20000'

# Минимальный queue-limit для VoIP (уменьшить задержку)
set traffic-policy shaper WAN-OUT class 10 queue-limit '50'

# Использовать DSCP EF
set traffic-policy shaper WAN-OUT class 10 set-dscp 'ef'
```

### Проблема: Высокие задержки

**Симптомы:**
- Ping latency высокий даже при низкой нагрузке

**Решение:**
```bash
# Уменьшить размеры очередей
set traffic-policy shaper WAN-OUT default queue-limit '100'

# Использовать fair-queue для равномерного распределения
set traffic-policy shaper WAN-OUT default queue-type 'fair-queue'

# Включить fq_codel (Flow Queue Controlled Delay)
set traffic-policy shaper WAN-OUT default queue-type 'fq-codel'
```

### Проблема: Неравномерное распределение bandwidth

**Симптомы:**
- Один класс получает больше bandwidth чем другие

**Решение:**
```bash
# Проверить сумму bandwidth всех классов
# Сумма не должна превышать total bandwidth

# Проверить priority значения
show traffic-policy shaper WAN-OUT

# Использовать ceiling для ограничения burst
set traffic-policy shaper WAN-OUT class 10 ceiling '50mbit'
```

## Дополнительные ресурсы

- [VyOS QoS Documentation](https://docs.vyos.io/en/latest/configuration/trafficpolicy/index.html)
- [Linux Traffic Control HOWTO](https://tldp.org/HOWTO/Traffic-Control-HOWTO/)
- [DSCP and TOS Values](https://www.iana.org/assignments/dscp-registry/dscp-registry.xhtml)
- [QoS Best Practices](https://www.cisco.com/c/en/us/td/docs/solutions/Enterprise/WAN_and_MAN/QoS_SRND/QoS-SRND-Book.html)

---

**Примечание**: Конфигурация QoS требует тонкой настройки под конкретные требования. Рекомендуется начинать с простых правил и постепенно усложнять на основе мониторинга трафика.

