[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Необычное ограничение скорости [offtop]



Здравствуйте.

Прошу прощения за оффтопик, но в других доступных источниках мне
не удалось найти решение.

Встала такая вот задача:

Есть канал 10Мбит.
Мне из него надо выделить 5Мбит на определенные IP-адреса, но выделить так,
чтобы у каждого пользователя из этой подсетки, было еще и "свое" ограничение
скорости. Т.е. если мы возьмем пару десятков пользователей с ограничением
256Кбит, и еще десяток с ограничением 128Кбит, то общая их скорость не
должна превышать 5Мбит. Да, я в курсе что будут потери и так делать не хорошо,
но это надо сделать. При свободном канале (скажем 10 пользователей со
"своим" ограничением в 128Кбит) скорость должна быть ограничена этим "своим"
ограничением.

Надеюсь объяснил понятно. Если есть вопросы - я попробую описать более подробно в деталях.

В инете не смог найти примеров решения данной задачи.
Как это можно реализовать?

В описаниях работы tc приводятся примеры с разграничиванием полос пропускания
по портам, однако сделать тоже самое, но по IP у меня не получилось.

Пробовал делать так:
{

TC=/sbin/tc
# eth0 - "внешка"
# eth1 - клиенты
DEV_OUT=eth0
DEV_IN=eth1

echo "clean"
$TC qdisc del dev $DEV_OUT root 2> /dev/null > /dev/null
$TC qdisc del dev $DEV_IN root 2> /dev/null > /dev/null
echo "starting..."
$TC qdisc add dev $DEV_OUT root handle 1:0 htb
$TC class add dev $DEV_OUT parent 1:0 classid 1:1 htb rate 100mbit
$TC class add dev $DEV_OUT parent 1:1 classid 1:10 htb rate 160kbit ceil 256kbit prio 2

$TC qdisc add dev $DEV_IN root handle 1: htb
$TC class add dev $DEV_IN parent 1: classid 1:1 htb rate 100mbit
$TC class add dev $DEV_IN parent 1:1 classid 1:10 htb rate 160kbit ceil 256kbit prio 2

USR_ID=100
USR_IP=10.4.0.2
USR_SPEED=160kbit
$TC class add dev $DEV_OUT parent 1:10 classid 1:$USR_ID htb rate $USR_SPEED
$TC qdisc add dev $DEV_OUT parent 1:$USR_ID handle $USR_ID: pfifo limit 5
$TC filter add dev $DEV_OUT protocol ip parent 1:0 prio 1 u32 match ip src $USR_IP flowid 1:$USR_ID

$TC class add dev $DEV_IN parent 1:10 classid 1:$USR_ID htb rate $USR_SPEED
$TC qdisc add dev $DEV_IN parent 1:$USR_ID handle $USR_ID: pfifo limit 5
$TC filter add dev $DEV_IN protocol ip parent 1:0 prio 1 u32 match ip dst $USR_IP flowid 1:$USR_ID

USR_ID=101
USR_IP=10.4.0.3
USR_SPEED=160kbit
$TC class add dev $DEV_OUT parent 1:10 classid 1:$USR_ID htb rate $USR_SPEED
$TC qdisc add dev $DEV_OUT parent 1:$USR_ID handle $USR_ID: pfifo limit 5
$TC filter add dev $DEV_OUT protocol ip parent 1:0 prio 1 u32 match ip src $USR_IP flowid 1:$USR_ID

$TC class add dev $DEV_IN parent 1:10 classid 1:$USR_ID htb rate $USR_SPEED
$TC qdisc add dev $DEV_IN parent 1:$USR_ID handle $USR_ID: pfifo limit 5
$TC filter add dev $DEV_IN protocol ip parent 1:0 prio 1 u32 match ip dst $USR_IP flowid 1:$USR_ID

echo "done"
}

На двоих по данным iptraf получается 320Кбит при полной загрузке.
Данные подтвеждаются и скоростью скачаивания на компах.
Загрузку обеспечивал ввиде скачивания больших файлов с двумя хостами
в несколько потоков.
Задача - этим 2 хостам дать "общий" канал от 160Кбит до 256кбит, но при
загрузке с 1 хоста скорость должна быть 160Кбит.

Если ткнете в доку/ссылку - буду благодарен.

Заранее спасибо.

-- 
Best regards,
         Mihail
Bart-mdv- @ SolarNet
IRC: irc.solarnet.ru
WWW: http://www.solarnet.ru/

--
Самое главное - выглядеть совершенно естественно; но для этого нужно очень
много косметики.
		-- Кельвин Кляйн

Reply to: