Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ PtokaX под *nix _ Отдаем Ptokax Гарантированную Часть Интернет Канала

Автор: mariner 26.1.2009, 18:34

Есть такая отличная штука на линукс, как пакет IpRoute2 -> http://mydc.ru/r/?http://lartc.org/ <-
Сейчас данный пакет входит в состав ядра (версия 2.6, в 2.4 его не было, необходимо было накатывать модулем). Так вот, с помошью этого пакета можно задать необходимую вам скорость отдачи данных и\или приема на каждый порт. Задача может быть жесткая (то бишь тока определенная скорость), либо динамическая. Ошишу свою ситуацию - есть хаб, кроме того сервер с хабом раздает файлы по dc++, torrent и http протоколу. И в результате траффик хаба перекрывался другим траффиком (в основном от вэбсервера, что вызывало дикие тормоза чата на хабе). Тогда решил озаботиться этой проблемой и начал "шэйпить" траффик.

Для этого написал скрипт и добавил в автозапуск. Как это сделать не буду писать, ибо это проблемы каждого человека, что и как он будет автозапускать.... bad_smile.gif

Код
#!/bin/bash
# переменные, меняем если надо.
ETHERNET_DEVICE="ppp0" # линк к провайдеру
LINK_SPEED_PROV="100000Kbit" # максимальная скорость по линку
UPLOAD_SPEED1="8000Kbit" # скорость первого типа траффика (это вэбсервер)
UPLOAD_SPEED2="3000Kbit" # скорость второго типа траффика (это хаб)
UPLOAD_SPEED3="9000Kbit" # скорость для остального траффика
PORT1="80" # порт для первого типа
PORT2="411" # порт для второго типа

# удаляем предыдущие фильтры
tc qdisc del dev $ETHERNET_DEVICE root

# создаем корневую маску интерфейса
tc qdisc add dev $ETHERNET_DEVICE root handle 1: htb default 12

# задаем максимальную скорость интерфейса
tc class add dev $ETHERNET_DEVICE parent 1: classid 1:1 htb rate $LINK_SPEED_PROV

# задаем классы "шейпинга"
# тут надо поподробней. Как мы видим, у классвов есть номера. К примеру [b]classid 1:10[/b]
# по ним в дальнейшем будут задаваться вильтры.
# Кроме того, у каждого класса есть rate - это скорость, минимальная для данного класса.
# То есть, при полной занятости канала,  эта скорость будет только у данного типа траффика.
# А вот ceil задает максимально возможную скорость. То есть представьте, что у вас вдруг вырос остальной траффик
#(3ий подвид), а траффика вэбсервера нет или он ниже 8ми мегабит. Тогда остатока канала будет отдан траффику 3его вида.
# И так везде. То есть канал будет максимально забит, но проблем с чатом хаба или отдачей не будет возникать :)
# Добавление: по умолчанию, , если ceil не задан, то ceil=rate! В классах задаются приоритеты - от 0 до 7 (7 - самый низкий)
tc class add dev $ETHERNET_DEVICE parent 1:1 classid 1:10 htb rate $UPLOAD_SPEED1 ceil $LINK_SPEED_PROV prio 1
tc class add dev $ETHERNET_DEVICE parent 1:1 classid 1:11 htb rate $UPLOAD_SPEED2 ceil $LINK_SPEED_PROV prio 0
# create our REST class for unutilized bandwidth
tc class add dev $ETHERNET_DEVICE parent 1:1 classid 1:12 htb rate $UPLOAD_SPEED3 ceil $LINK_SPEED_PROV prio 2

# Задание фильтров и привязка их к нужным портам. Так же здесь задается приоритеты траффика (это цифра после [b]prio[/b])
tc filter add dev $ETHERNET_DEVICE protocol ip parent 1:0 prio 1 u32 match ip sport $PORT1 0xffff flowid 1:10
tc filter add dev $ETHERNET_DEVICE protocol ip parent 1:0 prio 1 u32 match ip sport $PORT2 0xffff flowid 1:11

#Определяем краевые классы.
/sbin/tc qdisc add dev ppp0 parent 1:10 handle 10: pfifo limit 5
/sbin/tc qdisc add dev ppp0 parent 1:11 handle 20: pfifo limit 5
/sbin/tc qdisc add dev ppp0 parent 1:12 handle 30: sfq perturb 10

# Сообщение о завершении работы скрипта.
echo "Shaper loaded!"


Собственно все. Можно добавлять много фильтров. Заметно больше. Можно рулить траффиком компьютеров внутри локальной сети, находящейся за сервером. Но об этом нужно читать на -> http://mydc.ru/r/?http://lartc.org/ <- или http://mydc.ru/r/?http://remizov.pp.ru/ru/trn/doc/manuals/htb-manual (по русски)

PS Ну как, полезно? victory.gif

PPS обновил и кое-что добавил

Автор: Jaska 26.1.2009, 20:48

Спасибо. Именно как раз то что мне надо!

Автор: mariner 26.1.2009, 21:15

как бэ пиши, если чо надо big_smile.gif подскажу ;)

Автор: intlive 27.1.2009, 7:46

А под Win2003 можно трафиком порулить? exciting.gif

Автор: mariner 27.1.2009, 12:30

хз, под венду НИЧЕГО такого не видел. Если и есть программное решение - то скорее всего оно нехило грузит компа и оперативку есть.

Автор: hkk 3.2.2009, 17:44

добрый вечер
подскажите пожалуйста
мне надо ограничить скорость п2п клиента microdc2 порт 16099 - udp

#!/bin/bash
# переменные, меняем если надо.
ETHERNET_DEVICE="eth0" # линк к провайдеру
LINK_SPEED_PROV="1000000Kbit" # максимальная скорость по линку
UPLOAD_SPEED1="8000Kbit" # скорость первого типа траффика (это вэбсервер)
UPLOAD_SPEED2="2000Kbit" # скорость второго типа траффика (это хаб)
UPLOAD_SPEED3="9000Kbit" # скорость для остального траффика
PORT1="80" # порт для первого типа
PORT2="16099" # порт для второго типа

tc qdisc del dev $ETHERNET_DEVICE root

tc qdisc add dev $ETHERNET_DEVICE root handle 1: htb default 12

tc class add dev $ETHERNET_DEVICE parent 1: classid 1:1 htb rate $LINK_SPEED_PROV

tc class add dev $ETHERNET_DEVICE parent 1:1 classid 1:10 htb rate $UPLOAD_SPEED1 ceil $LINK_SPEED_PROV
tc class add dev $ETHERNET_DEVICE parent 1:1 classid 1:11 htb rate $UPLOAD_SPEED2 ceil $LINK_SPEED_PROV

tc class add dev $ETHERNET_DEVICE parent 1:1 classid 1:12 htb rate $UPLOAD_SPEED3 ceil $LINK_SPEED_PROV

tc filter add dev $ETHERNET_DEVICE protocol ip parent 1:0 prio 1 u32 match ip sport $PORT1 0xffff flowid 1:10
tc filter add dev $ETHERNET_DEVICE protocol ip parent 1:0 prio 1 u32 match ip dport $PORT2 0xffff flowid 1:11
tc filter add dev $ETHERNET_DEVICE protocol ip parent 1:0 prio 1 u32 match ip sport $PORT2 0xffff flowid 1:11

echo "Shaper loaded!"

Не работает почемуто..
Ось SLES 10 SP2

uname -a
Linux LuberNETX1 2.6.16.60-0.34-bigsmp #1 SMP Fri Jan 16 14:59:01 UTC 2009 i686 athlon i386 GNU/Linux

Автор: mariner 3.2.2009, 18:42

вроде как бы так... но, у тебя лишний фильтр.

Код
tc filter add dev $ETHERNET_DEVICE protocol ip parent 1:0 prio 1 u32 match ip sport $PORT2 0xffff flowid 1:11

PS а в слесе есть iproute2 ? точнее, он включен или нет? PPS у тя будет 2 мбита на дц.

Автор: hkk 3.2.2009, 21:06

шота не работает...

rpm - q iproute2
iproute2-2.6.25-2.1

как иго включить ?

Автор: mariner 3.2.2009, 21:46

хм, это модуль ядра. посмотри в консоли команду

Код
tc -help

Автор: hkk 4.2.2009, 0:48

Цитата
tc -help
Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }
tc [-force] -batch file
where OBJECT := { qdisc | class | filter | action | monitor }
OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -b[atch] [file] }


Модуль присутсвует

Автор: mariner 4.2.2009, 1:13

в таком случае я не знаю, почему не работает. PS а в чем нерабочесть выражается. Вы уж простите за глупый вопрос.

Автор: hkk 4.2.2009, 7:55

запустил тот скрипт, а скорость на 1699 порту (этот порт прописан в настройках дц клиента) не ограничивается. скачана с клиента достигает 8 мегабайт\с

Автор: mariner 4.2.2009, 8:37

посмотрика в iotop iftop откуда реально оно качает. PS этот скрипт для tcp любого порта
и кроме того, почитай повнимательнее описание. думаю поймешь,что надо ceil вконце нужного правила убрать

Кроме того дцшка может сама порты открывать случайные, если она в активе!

Автор: mariner 20.4.2009, 12:35

Прошу. Обновил статейку. Добавить приоритеты к классам. Сделал более мягкие переходы. (для этого в конец добавлены определения краевых классов)