Дайте plz готовый скрипт, который бы просто ограничивал скорость в N кбайт/с на таком-то интерфейсе. Без приоритетов, без распределения по адресам и т.д.
> На что влияет ceil я так и не понял, выше установленного в rate прыгнуть не получилось никак...
rate - минимально гарантированная скорость;
ceil - максимально возможная
Немного не понял смысла всех этих твоих движений... Если нужно просто жёстко ограничить скорость, то можно посмотреть в сторону других более приспособленных для этого дисциплин:
#!/bin/sh
lan=eth0
tc=`which tc`
$tc qdisc del dev $lan root
$tc qdisc add dev $lan handle 1:0 root tbf burst 20k limit 20k mtu 1514 rate 2048kbps
Если же нужно зарезервировать канал для сети 192.168.0.0/24 (при этом есть ещё сети), то нужно поменять правила htb, ибо в таком виде, как сейчас при нагруженном канале только 1024kbit и будет.
В данном примере сеть 192.168.0.0/24 имеет приоритет перед остальными адресами. Причём приоритет практически полный:
#!/bin/sh
lan=eth0
tc=`which tc`
$tc qdisc del dev $lan root
$tc qdisc add dev $lan root handle 1: htb default 3
$tc class add dev $lan parent 1: classid 1:1 htb rate 2048kbit
$tc class add dev $lan parent 1:1 classid 1:2 htb rate 2024kbit ceil 2048kbit prio 1
$tc class add dev $lan parent 1:1 classid 1:3 htb rate 24kbit ceil 2048kbit prio 2
$tc filter add dev $lan protocol ip parent 1: u32 match ip dst 192.168.0.0/24 flowid 1:2
P.S. только не забывай, что максимальная скорость, используемая в tc, должна быть немного меньше реальной пропускной способности канала. Иногда с этим "немного меньше" приходится ограничивать макс.скорость до 70% от реальной.
>> tc qdisc add dev $lan handle 1:0 root tbf burst 20k limit 20k mtu 1514 rate 2048kbps >И всё, одна строчка, без filter и class?
И всё. TBF - это безклассовая дисциплина. То есть конечная, или, краевая дисциплина. Поэтому больше ничего и не нужно прописывать. > С классами этими и дисциплинами мозг вывихнуть можно...
Ну... дисциплина - это фактически название алгоритма "нарезки" канала.
Класс - это правило "нарезки" внутри алгоритма.
Для упрощения лепил своё... перловое и негуёвое :). Конфиг в XML, на выходе даёт готовый к запуску bash-скрипт. Похоже на tcng. Велосипед сделал, но свой велосипед, какой мне надо. :)
Кому интересно - выложу где-нить...
./bin/ - исполняемые файлы
ethloop - генератор трафика
gnutc-cgi - формирует страничку с графиками.
gnutc-make-diagram
gnutc-parce-config
gnutc-prepare-test
gnutc-show-trafic-table
Из названий примерно понятно для его оно всё... :)
./cfgs/ - конфиги
main.conf - общий конфиг (пути и т.д.); tc.conf - основной конфиг для tc. Там заданы общие для всех переменные. tc-<dev>.conf - конфиги для каждого интерфейса.
./cgi-bin/
gnutc-cgi - формирует страничку с графиками. дублирует gnutc-cgi из bin. Руки не дошли в порядок привести :)
./doc/
readme.txt - мнэ... "хочешь сильно наказать программера - посади его описывать свои поделки..." Про меня :)
./img/
В этом каталоге создаются графики по результатам тестов.
./out/
Сюда валятся все файлы, которые создаются. По идее временный каталог.
./tests/
Набор правил для формирования тестового трафика
./.htaccess
Если обратиться браузером к нашему каталогу, то отображаем страницу с результатами тестов.
./start.sh
Непосредственно для запуска всего этого добра
./tests.sh
Для запуска тестов.
У меня оно всё лежит в каталоге /var/www/html/gnutc (ЦГИшка в /var/www/cgi-bin). Набираю в браузере http://127.0.0.1/gnutc и вижу результаты тестов. На роутере оно в другом месте, соответственно. запускается только start.sh Оно всё пока не приведено в божеский вид, но если "пойдёт в массы" - сделаю нормально, а не "достаточно для меня".
Пока всё. По созданию XML-конфига под конкретные нужды обращайтесь - либо расскажу, либо пофиксю :)
> локальные порты 2106 7777 8085 - максимальный приоритет для того что на них висит
Это доступ к самому роутеру? Трафик к нему и так выделится в отдельный канал.
Ну представим, что:
- ширина канала у тебя из инета 2048к
- сетевуха eth0 - это сетевуха в локалку.
- ширина канала в инет 1024к
- сетевуха к модему: eth1
- адрес роутера, на котором всё это пускается: 192.168.1.254
- провайдер жёстко ограничил скорости на всё(у меня в инет жёстко ограничено, а на внутренние ресурсы провайдера - на максимально возможной для ADSL).
Тогда:
cfgs/tc.conf:
$PERCENT_DOWN=16%
$eth0_ADSL_RATE=2048kbit
$eth1_ADSL_RATE=1024kbit
$PROVIDER_IP=192.168.91.122, 192.168.89.110, 192.168.92.100
$LAN_NETWORK=192.168.1.0/24
Include tc-eth0.conf
Include tc-eth1.conf
cfgs/tc-eth0.conf:
<DEVICE>
name=eth0
lan_interface=true
description="Сетевая карта в LAN"
queue_length=30
mtu=1500
<CHANNEL>
name=ROOT
description="корневая дисциплина"
default=OTHER
<CHANNEL>
name=LAN
description="Канал 'жирных' хостов"
rate=80mbit
<filter>
ip = 192.168.1.254
</filter>
</CHANNEL>
<CHANNEL>
name=INTERNET
description="Интернет-трафик"
rate=$eth0_INET_RATE
<CHANNEL>
name=SUPERCHANNEL
description="Рабочий канал с высоким приоритетом"
rate=($eth0_INET_RATE/2)
ceil=$eth0_INET_RATE
prio=1
# маленькие пакеты и приоритетные порты и last.fm
<filter>
size = :100
port = tcp:22, 53
src_ip = 87.117.0.0/16
</filter>
</CHANNEL>
<CHANNEL>
name=LAN_NETWORK
description="Канал локальной сети"
rate=$eth0_INET_RATE/4
ceil=$eth0_INET_RATE
prio=2
<filter>
dst_ip = $LAN_NETWORK
</filter>
<CHANNEL>
name=LAN_NETWORK_esfq
description="Справедливая раздача канала"
qdisc=true
type=esfq
params=perturb 10 hash dst
</CHANNEL>
</CHANNEL>
<CHANNEL>
name=OTHER
description="Канал остальных"
rate=$eth0_INET_RATE/4
ceil=$eth0_INET_RATE
prio=3
<CHANNEL>
name=OTHER_esfq
description="Справедливая раздача канала"
qdisc=true
type=esfq
params=perturb 10 hash dst
</CHANNEL>
</CHANNEL>
<CHANNEL>
name=PROVIDER
description="Канал от хостов провайдера"
rate=0
ceil=$eth0_INET_RATE
prio=4
<filter>
src_ip = $PROVIDER_IP
</filter>
<CHANNEL>
name=OTHER_esfq
description="Справедливая раздача канала"
qdisc=true
type=esfq
# трафик поровну между хостами провайдера
params=perturb 10 hash dst
# трафик поровну между "качателями"
# params=perturb 10 hash src
</CHANNEL>
</CHANNEL>
</CHANNEL>
</DEVICE>
cfgs/tc-eth1.conf:
По аналогии с cfgs/tc-eth0.conf. Лениво расписывать.
Примерно так. Если что не понял - уточни.
P.S. Вместо esfq можно использовать и sfq (если нету esfq), но sfq делит поровну между потоками, а esfq - между хостами. Разница в том, что кто-то один может качать в *надцать потоков и перебьёт всем канал.
>> $tc class add dev $lan parent 1:1 classid 1:2 htb rate 1kbit > Почему не "parent 1:" ?
Можно и parent 1:0. Но рекомендовано к дисциплине присоединять один класс, а потом уже из его потомков растить дерево. Два класса к дисциплине присоединяются, если уж очень разные трафики... например, трафик к локальной машине и к провайдеру. Если же логически один канал и просто нужно сделать "доброе дело" отдельным товарищам(как в нашем примере), то желательно в одном канале. >Вот тут тоже, где именно здесь проверяется MARK 1:
>> tc filter add dev $lan parent 1:0 protocol ip handle 1 fw flowid 1:2
А тут почему 1:0? Потому что все фильтры привязываются только к корневой дисциплине. Это жёсткое правило, иначе не сработают. > И ещё почему конструкция с iptables, а не через u32 match src и тому подобное?
Ну... можно и через u32, но я использую iptables для унификации. Например, при классическом "СЕТЬ<->РОУТЕР<->МОДЕМ" сетевой адрес в модем обычно SNATится, u32 при SNATе не срабатывает - только iptables.
Либо захочешь приоритеты по пользователям или программам настраивать - просто tc filter не спасает.
Snitch is a tool for creating tc (traffic control) commands to
configure the built-in packetshaping utilities of Linux. It was
written in conjunction with another project, l7-filter, which consists
of a kernel patch to allow shaping on application-level protocols.
l7-filter can be found at http://sourceforge.net/projects/l7-filter.
Сразу не собрался, надо посмотреть чего там плюсам нехватает
snitch-0.0.1$ make
g++ -Wall -o snitch snitch.cpp
snitch.cpp: In function ‘void GetBandwidthInfo(int&, int&, std::string&, std::string&, std::string&, std::string&, std::ifstream&, int&)’:
snitch.cpp:190: error: ‘strlen’ was not declared in this scope