[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