The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Раздел полезных советов: Скрипт для распределения пропускной способности средствами 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.ru/tips/info/1777.shtml

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру