URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 44028
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Скрипт для распределения пропускной способности средствами iproute2 в Linux"

Отправлено auto_tips , 25-Сен-08 06:38 
Скрипт опробован в Debian Etch с установленными пакетами tc, iproute2 и bc.
Задача скрипта равномерное распределения пропускной способности канала среди пользователей
и повышения приоритета dns, ssh, smtp.

SOME_IMPORTANT_IP, SOME_OTHER_IMPORTANT_IP, IMPORTANT_IP - нужно заменить на IP
важного сервера во внутренней сети.


#!/bin/bash
EXT_IFACE="eth0"
INT_IFACE="eth1"
TC="tc"
UNITS="kbit"
LINE="10000" # максимальная фактическая скорость внешнего (ext) линка
LIMIT="5000" # максимально скорость, которую мы можем допустить

# Переменные определеяющие скорость для индивидуальных классов трафика
# для ограничения внутреннего трафика, проходящего через интерфейс eth0;
CLS1_RATE="200" # гарантировано 200kbit
CLS2_RATE="300" # гарантировано 300kbit
CLS3_RATE="4500" # на всех 4500kbit (низкий приоритет)

# Переменные определеяющие скорость для индивидуальных классов трафика
# для ограничения трафика, проходящего через внешний интерфейс eth1;
INT_CLS1_RATE="1000" #Priority
INT_CLS2_RATE="4000" #Bulk

# Чистим содержимое qdiscs
${TC} qdisc del dev ${INT_IFACE} root
${TC} qdisc del dev ${EXT_IFACE} root

# Создаем корневые qdiscs, используя HTB, привязываем к интерфейсу и ставим метку "1:0"
${TC} qdisc add dev ${INT_IFACE} root handle 1:0 htb
${TC} qdisc add dev ${EXT_IFACE} root handle 1:0 htb

# Создаем корневые классы и выставляем максимально-допустимый лимит скорости
# eth1
${TC} class add dev ${INT_IFACE} parent 1:0 classid 1:1 htb rate ${LIMIT}${UNITS} ceil ${LIMIT}${UNITS}
# eth0
${TC} class add dev ${EXT_IFACE} parent 1:0 classid 1:1 htb rate ${LIMIT}${UNITS} ceil ${LIMIT}${UNITS}


# Создаем дочерние классы, маркируем их меткой "1:2", "1:3", в зависимости от лимита, для eth1
${TC} class add dev ${INT_IFACE} parent 1:1 classid 1:2 htb rate ${INT_CLS1_RATE}${UNITS} ceil ${LIMIT}${UNITS}

${TC} class add dev ${INT_IFACE} parent 1:1 classid 1:3 htb rate ${INT_CLS2_RATE}${UNITS} ceil ${INT_CLS2_RATE}${UNITS}

# Привязываем лимит для eth1 (для ограничения исходящего трафика)
# Ставим для класса "1:2" гарантированную скорость 200kbit
# с возможностью подъема при свободности канала до 5000kbit
${TC} class add dev ${EXT_IFACE} parent 1:1 classid 1:2 htb rate ${CLS1_RATE}${UNITS} ceil ${LIMIT}${UNITS}


# Ставим для класса "1:3" гарантированную скорость 300kbit
# с возможностью подъема при свободности канала до 4800kbit (5000kbit - 200kbit зарезервированный для 1:2)
${TC} class add dev ${EXT_IFACE} parent 1:1 classid 1:3 htb rate \
   ${CLS2_RATE}${UNITS} ceil `echo ${LIMIT}-${CLS1_RATE}|bc`${UNITS}

# Ставим для менее приоритетного класса "1:4" оставшуюся скорость 4500kbit (5000kbit - 200kbit - 300kbit)
${TC} class add dev ${EXT_IFACE} parent 1:1 classid 1:4 htb rate ${CLS3_RATE}${UNITS} \
   ceil `echo ${LIMIT}-${CLS1_RATE}-${CLS2_RATE}|bc`${UNITS}

# Добавляем pfifo.
${TC} qdisc add dev ${INT_IFACE} parent 1:2 handle 12: pfifo limit 10
${TC} qdisc add dev ${INT_IFACE} parent 1:3 handle 13: pfifo limit 10
${TC} qdisc add dev ${EXT_IFACE} parent 1:2 handle 12: pfifo limit 10
${TC} qdisc add dev ${EXT_IFACE} parent 1:3 handle 13: pfifo limit 10
${TC} qdisc add dev ${EXT_IFACE} parent 1:4 handle 14: pfifo limit 10


### С классами закончили, создаем правила для адресов в сети
# INT_IFACE, настраиваем скорость.
# под dst подразумевается трафик уходящий во внутренний интерфейс eth0, т.е. к локальному IP
# и определяем скорость загрузки с этих адресов.
# адрес SOME_IMPORTANT_IP привязываем к классу 1:2
${TC} filter add dev ${INT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip dst SOME_IMPORTANT_IP/32 flowid 1:2
${TC} filter add dev ${INT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip dst SOME_OTHER_IMPORTANT_IP/32 flowid 1:2
# Все остальные адреса привязываем к классу 1:3 и считаем неприоритетными
${TC} filter add dev ${INT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:3


# EXT_IFACE
# Устанавливаем повышенный приоритет для  DNS запросов
${TC} filter add dev ${EXT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 53 0xffff flowid 1:2
# SSH тоже считаем приоритетным

${TC} filter add dev ${EXT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 22 0xffff flowid 1:2
# SMTP отдаем остатки полосы, но приоритет по сравнению с остальным трафиком поднимаем
${TC} filter add dev ${EXT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 25 0xffff flowid 1:3
# Все остальное - в последнюю очередь, самый низкий приоритет
${TC} filter add dev ${EXT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip src 0.0.0.0/0 flowid 1:4


URL: http://www.adamsinfo.com/bandwith-limiting-with-linux-tc-and.../
Обсуждается: http://www.opennet.me/tips/info/1777.shtml


Содержание

Сообщения в этом обсуждении
"Скрипт для распределения пропускной способности средствами iproute2 в Linux"
Отправлено _Kuzmich , 25-Сен-08 06:38 
pfifo limit 10 размер очереди оч.маленький, будут дропаться пакеты, я ставлю 1000.

"Скрипт для распределения пропускной способности средствами iproute2 в Linux"
Отправлено Аноним , 25-Сен-08 15:37 
Еще один "copy-past"?
Где "отрезается" ПОЛОВИНА пропускной способности канала?
Давайте поспорим, что это "распределение" при работающем torrent в сети захлебнется?

"Скрипт для распределения пропускной способности средствами i..."
Отправлено Макс , 25-Сен-08 22:00 
>Еще один "copy-past"?
>Где "отрезается" ПОЛОВИНА пропускной способности канала?
>Давайте поспорим, что это "распределение" при работающем torrent в сети захлебнется?

Давайте, поспорьте, мне интересна причина захлебывания.



"Скрипт для распределения пропускной способности средствами iproute2 в Linux"
Отправлено hand , 28-Сен-08 19:09 
ну как, проверили?

"Скрипт для распределения пропускной способности средствами i..."
Отправлено Аноним , 02-Авг-09 23:34 
захлебнулись досмерти