[Comm] Снова про htb

Sergey Ivanov =?iso-8859-1?q?seriv_=CE=C1_parkheights=2Edyndns=2Eorg?=
Пт Дек 2 19:14:50 MSK 2005


Владимир Гусев wrote:

> Здравствуйте!
>
> Кому-нибудь удалось разобраться с htb? Кто-нибудь из участников 
> рассылки  уже применяет htb для управления исходящим траффиком на ADSL 
> ? Поделитесь  опытом и конфигами-образцами.. Никак не могу въехать, 
> хотя теорию вопроса  в принципе понял..
>
Попробую описать, как обстоит дело с htb в Сизифе. Основной инструмент 
для конфигурации - пакет etcnet.
1. Я советую, поставив этот пакет, сначала спрятать куда-нибудь все 
директроии интерфейсов из /etc/net/ifaces (   кроме lo, default и 
unknown) и запустить /etc/net/scripts/initconf. Его выдачу сохранить и 
на основании этой выдачи организовать файл /etc/net/iftab, который 
определит логические имена интерфейсов. Например, одну сетевую карту 
можно из eth0 переименовать в соответствии с её макадресом в wan, другую 
- в lan. Я для себя использовал вместо wan имя провайдера (comcast), а 
вместо lan - придуманное самим имя локального домена своей сети 
192.168.10.0/24 (menlo). Ну и дальше буду их использовать, чтобы не 
ошибиться где-нибудь заменяя их на более нейтральные типа wan и lan. 
Далее создайте директории с именами определёнными в таблице 
/etc/net/iftab, внутри /etc/ifaces. Я создал /etc/net/ifaces/comcast и 
/etc/net/ifaces/comcast. И положил туда нужные мне файлы options. Для 
внешней сети comcast достаточно определить TYPE и BOOTPROTO, я добавил 
строчку MODULE как того рекомендовал initconf:
---
# cat <<EOF >/etc/net/ifaces/comcast/options
TYPE=eth
BOOTPROTO=dhcp
MODULE=tulip
EOF
---
Для интерфейса локальной сети menlo адрес задан статически, так что там 
кроме файла options ещё нужен файл ipv4address:
---
# cat <<EOF >/etc/net/ifaces/menlo/options
TYPE=eth
BOOTPROTO=static
MODULE=natsemi
EOF
# echo "192.168.10.1/24" >/etc/net/ifaces/menlo/ipv4address
---
2. Дальше настраиваете ip-forwarding и nat masquarading. За первый 
отвечает строчка
net.ipv4.ip_forward = 1
в файле /etc/net/sysctl.conf, в то время как другое делается добавлением 
строки
"masquerade out-iface comcast"
в файл /etc/net/ifaces/default/fw/iptables/nat/POSTROUTING:
---
echo "masquerade out-iface comcast" 
 >>/etc/net/ifaces/default/fw/iptables/nat/POSTROUTING
---
После этого ваш раутер после # service network restart уже должен начать 
выполнять свою функцию разделения доступа в интернет.

3. Далее я настраивал распознавание и маркирование пакетов, кторым надо 
было обеспечить гарантированную ширину пропускания канала. Для меня это 
были два телефонных адаптера, которые не искажают звук только если им 
предоставлены 10 килобит в секунду. Эти адаптеры стоят в локальной сети 
и dhcp сервер по их макадресам даёт им статические адреса. Эти адреса я 
и использовал в качестве критерия для маркировки. Маркировка 
обеспечивается следующим образом:
---
#cat <<EOF >/etc/net/ifaces/default/fw/iptables/mangle/PREROUTING
mark 21 if from 192.168.10.21 from-iface menlo
mark 22 if from 192.168.10.5 from-iface menlo
EOF
---
Мысль для себя на будущее: наверно можно было маркировать по мак-адресу, 
и тем самым избежать необходимости настраивать статические адреса 
выдаваемые dhcpd.

4. Ну а теперь остаётся самое настроить qos htb для идущего наружу 
интерфейса comcast.
---
## создаём дисциплину 1
# mkdir -p /etc/net/ifaces/comcast/qos/1

## определяем что эта дисциплина - htb
## и её дефолтный класс для неклассифицированного траффика 77.
# echo "htb default 77" /etc/net/ifaces/comcast/qos/1/qdisc

## создаём корневой класс 1 (1:1)
# mkdir /etc/net/ifaces/comcast/qos/1/1

## определяем ширину пропускания интерфейса (upload)
# echo "htb rate 360kbps" /etc/net/ifaces/comcast/qos/1/1/class

## создаём класс для первого телефонного адаптера
# mkdir /etc/net/ifaces/comcast/qos/1/1/21/

## определяем для него ширину пропускания 80 килобит/сек.
# echo "htb rate 80kbps" >/etc/net/ifaces/comcast/qos/1/1/21/class

## задаём фильтр этого класса, отбирающий для него пакеты с маркой "21"
# echo "protocol ip prio 1 handle 21 fw" 
 >/etc/net/ifaces/comcast/qos/1/1/21/filter

## создаём класс для второго телефонного адаптера
# mkdir /etc/net/ifaces/comcast/qos/1/1/22/

## определяем для него ширину пропускания 80 килобит/сек.
# echo "htb rate 80kbps" >/etc/net/ifaces/comcast/qos/1/1/22/class

## задаём фильтр этого класса, отбирающий для него пакеты с маркой "22"
# echo "protocol ip prio 1 handle 22 fw" 
 >/etc/net/ifaces/comcast/qos/1/1/22/filter


## создаём класс для дефолтного траффика:
# mkdir /etc/net/ifaces/comcast/qos/1/1/77/

## определяем для него ширину пропускания 200 (= 360 - (80 + 80)) 
килобит/сек.
## с возможностью заимствования неиспользуемого в данный момент траффика 
других классов
## вплоть до 360kbps, то есть полной ширины исходящего канала
# echo "htb rate 200kbps ceil 360kbps" 
 >/etc/net/ifaces/comcast/qos/1/1/77/class
---

И, если бы etcnet поддерживал htb, то больше ничего не надо бы делать.
Однако увы, приходится портить его скрипты, так как они не обращают 
внимания на то, что фильтры должны прикрепляться к корню, то есть к 
дисциплине 1:, то есть к директории /etc/net/ifaces/comcast/qos/1, хотя 
и иметь в качестве направления фильтрации именно тот класс в директории 
которого созданы.
Так что берём и заменяем строчку
---
$TC filter add dev $NAME $PARENTNODE `head -1 $NODEDIR/extra.filter 
2>/dev/null` $FILTEREXPR flowid $NODEID
---
в файле /etc/net/scripts/config-qos
на строчку:
---
$TC filter add dev $NAME parent 1\:0 `head -1 $NODEDIR/extra.filter 
2>/dev/null` $FILTEREXPR flowid $NODEID
---
Строчка "parent 1\:0" согласована с тем, что корневую дисциплину этого 
интерфейса я назвал дисциплиной "1".

Теперь телефонам будет предоставляться 80 килобит в секунду как только 
они того потребуют, а если они недоиспользуют эти 80kbps, всё оставшееся 
будет предоставляться другим соединениям.

Других дисциплин, кроме htb, не пробовал. Возможно, что для них 
правильно именно так, как устроено изначально в файле 
/etc/net/scripts/config-qos

-- 
    С уважением,
       Сергей Иванов.







Подробная информация о списке рассылки community