| « BIND 9.6.0-P1 и TTL | 25 пунктов об админах... » |
Общий принцип классификации исходящего трафа с помощью TC/HTB таков:
1. Определяем классы трафика. Можно вложенные, деревом. Т.е. создав некий класс в корневом классе устройства, можно в нем сделать дополнительное разделение.
2. Назначаем SFQ как тип очереди каждому из классов. Это нужно для честного распределения потоков внутри класса.
3. Определяем фильтры, которые будут ассоциировать трафик с классами. Очень удобно делать это на связке с iptables, потому что у iptables есть действие classify, закидывающее пакет в определенный класс.
Далее - небольшой примерчик, на базе которого все очевидно:
...
Скрипт конфигурации TC:
#!/bin/bash
# Базовый шейпер
# устройство
DEV=eth0
# пропускная способность, кбит (рекомендуется чуть занизить)
BW=1000
# квант (не уверены - не трогайте)
BWQ=2000
# процентное пропорциональное соотношение трафика для классов при 100% нагрузке всех классов
CP1 = 15
CP2 = 60
CP3 = 25
# верхний порог трафика для классов при 100% нагрузке класса (в процентах от пропускной способности)
CC1 = 25
CC2 = 100
CC3 = 80
# удаляем существующий шейпинг
/sbin/tc qdisc del dev $DEV root 2> /dev/null > /dev/null
# добавляем корневой класс. 4 определяет номер класса для неклассифицированного трафика
/sbin/tc qdisc add dev $DEV root handle 1: htb default 4
/sbin/tc class add dev $DEV parent 1: classid 1:1 htb rate ${BW}kbit ceil ${BWQ}kbit quantum ${BWQ}
# создаем наши классы
/sbin/tc class add dev $DEV parent 1:1 classid 1:2 htb rate $[$BW*$CP1/100]kbit ceil $[$BW*$CC1/100]kbit quantum $[$BWQ*$CP1/100]
/sbin/tc class add dev $DEV parent 1:1 classid 1:3 htb rate $[$BW*$CP2/100]kbit ceil $[$BW*$CC2/100]kbit quantum $[$BWQ*$CP2/100]
/sbin/tc class add dev $DEV parent 1:1 classid 1:4 htb rate $[$BW*$CP3/100]kbit ceil $[$BW*$CC3/100]kbit quantum $[$BWQ*$CP3/100]
# назначаем SFQ
/sbin/tc qdisc add dev $DEV parent 1:2 handle 12: sfq
/sbin/tc qdisc add dev $DEV parent 1:3 handle 13: sfq
/sbin/tc qdisc add dev $DEV parent 1:4 handle 14: sfq
iptables для iptables-restore:
# таблица mangle
*mangle
:POSTROUTING ACCEPT [0:0]
:SHAPING - [0:0]
:SET-CLASS-2 - [0:0]
:SET-CLASS-3 - [0:0]
:SET-CLASS-4 - [0:0]
# *** основной поток после маршрутизации ***
# +++ шейпер +++
-A POSTROUTING -o lo -j RETURN
-A POSTROUTING -g SHAPING
# *** цепочка SHAPING ***
# шейпы по процессам
-A SHAPING -p icmp -m icmp --icmp-type any -g SET-CLASS-2
-A SHAPING -p tcp --tcp-flags SYN SYN -m length --length :64 -g SET-CLASS-2
-A SHAPING -p tcp --tcp-flags ACK ACK -m length --length :64 -g SET-CLASS-2
-A SHAPING -p tcp --tcp-flags RST RST -m length --length :64 -g SET-CLASS-2
-A SHAPING -p tcp --tcp-flags FIN FIN -m length --length :64 -g SET-CLASS-2
-A SHAPING -p tcp -m tcp --sport 80 -g SET-CLASS-3
-A SHAPING -m mark --mark 0 -g SET-CLASS-4
-A SHAPING -j RETURN
# маркировочные таблицы (убийство при большом количестве классов, но надо :)
-A SET-CLASS-2 -j CLASSIFY --set-class 1:2
-A SET-CLASS-2 -j RETURN
-A SET-CLASS-3 -j CLASSIFY --set-class 1:3
-A SET-CLASS-3 -j RETURN
-A SET-CLASS-4 -j CLASSIFY --set-class 1:4
-A SET-CLASS-4 -j RETURN
# пишем изменения в MANGLE
COMMIT
Кратенько поясню. ICMP закидываем в класс 2. Вместе с ним - SYN, ACK, RST и FIN, длиной до 64 байт (бывают ACK+данные, их не надо). HTTP (к примеру Web-сервер, источник - порт 80) - в класс 3. Все остальное - в класс 4.
CP3 = 60
CP4 = 25
и
CC2 = 25
CC3 = 100
CC4 = 80
минус единицу у каждой переменной, ибо дальше в скрипте адействованны переменные с номерами с 1 по 3.
В целом, статья требует обновления - HTB на >10Мбит нормально не работает, сейчас HFSC правильнее, и конфигурируется проще.