Страница 1 из 2

Динамический шейпер

Добавлено: 20 сен 2007, 17:56
Shart
Есть компьютер (Celeron 500, 128 RAM, 160GB HDD) с двумя сетевыми платами. К одной подключен анлим интернет (128кб/с), к другой - домашняя сеть (5 компов).
Задача - сделать динамический шейпер с разделением на тип соединения (http, ftp и т.д....хотя можно и просто по порту), на IP назначения и исходящий адрес

Т.е. если в сети только один человек сидит в интернете, то ему отдаётся весь канал.
Если сидит два человека, но один качает файл, а другой ползает по интернету, то приоритет интернета больше, т.е. во время загрузки интернет-страниц ему отдаётся весь, или почти весь канал.
При этом на некоторые IP-адреса отдаётся весь канал (т.к. на них канал 2мбит).

Каким образом это можно организовать? Какие программы лучше/проще использовать? Где можно найти статьи по сабжу?

Добавлено: 20 сен 2007, 18:41
Komzpa
Squid + transparent proxying. Можно это сделать даже на одной сетевушке, если народ в сети честный и не будет менять гейтвей на адрес модема. А на таких объёмах острой необходимости шейпинга не вижу.

Добавлено: 20 сен 2007, 18:49
Shart
Что значит "на таких объёмах"...128кбит это же мало для 5 юзверей :( . А сквид только для http, а у нас есть люди, которые могут занять весь канал линейкой какой-нибудь

Добавлено: 20 сен 2007, 20:37
nab

Добавлено: 20 сен 2007, 21:08
Shart
Насколько я понял, там идёт речь о статическом шейпинге...а мне нужен динамический....ну и что-нибудь по-проще :roll:

Добавлено: 20 сен 2007, 22:56
Llama
Shart, читать LARTC, можно в переводе. Динамически раскинуть полосу можно.

Добавлено: 23 сен 2007, 17:48
Shart
Почитал в интернете лартц.... Думаю, что реально это сделать на HTB. Но есть вопрос: есть ли какая-нибудь беслатная программа/скрипт для его настройки?

P.S. И справится ли мой сервер с это нагрузкой (5 человек в сети :? )?

Добавлено: 23 сен 2007, 17:56
Llama
Shart,
1) Для настройки - есть - tc и опциональной iptbales - там же ж написано все в LARTC. Ну и примеры там есть... Ну еще htb.init можно посмотреть, не знаю, в каком он нынче состоянии...
2) Железка с нагрузкой справится.

Добавлено: 23 сен 2007, 21:28
angor
вот и я добрался :) спасибо Llama
есть похожий скриптик, сам воевал, исправь под свои нужды...
тут, правда, приоритеты (а вдруг полезно?)
#!/bin/sh

IPTABLES=/sbin/iptables
TC=/sbin/tc
DEV_IN=eth0
#actually 256
#для того, чтобы реально управлять с приоритетом пришлось резать канал примерно на 25%
RATE_IN=192

case "$1" in
start)
########################## IN #############################
$TC qdisc add dev $DEV_IN root handle 1:0 htb default 99

$TC class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${RATE_IN}kbit ceil ${RATE_IN}kbit

$TC class add dev $DEV_IN parent 1:1 classid 1:10 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/2]kbit prio 0
$TC class add dev $DEV_IN parent 1:1 classid 1:25 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/2]kbit prio 1
$TC class add dev $DEV_IN parent 1:1 classid 1:50 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 2
$TC class add dev $DEV_IN parent 1:1 classid 1:75 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 3
$TC class add dev $DEV_IN parent 1:1 classid 1:99 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 4

$TC qdisc add dev $DEV_IN parent 1:10 handle 10: pfifo limit 5
$TC qdisc add dev $DEV_IN parent 1:25 handle 25: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:50 handle 50: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:75 handle 75: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:99 handle 99: sfq perturb 10


#### Маркировка пакетов

# добавить цепочку MYSHAPER-IN в таблицу mangle - сейчас мы настроим таблицу,которую будем
# использовать для фильтрациии установки fwmark
iptables -t mangle -N MYSHAPER-IN
iptables -t mangle -I POSTROUTING -o $DEV_IN -j MYSHAPER-IN

# маркируем пакеты с помощью fwmark - устанавливаем значения 10-99 в зависимости от
# нужного класса. Высший приоритет - 10.

# Низкоприоритетный трафик
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 0:1024 -j MARK --set-mark 99
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 0:1024 -j MARK --set-mark 99

# порт ftp-data, низкий приоритет
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 20 -j MARK --set-mark 99

# интернет-пейджер aol
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 5190 -j MARK --set-mark 75

# irc
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 6667 -j MARK --set-mark 75
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 9944 -j MARK --set-mark 75

#pptp
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 1723 -j MARK --set-mark 75
iptables -t mangle -A MYSHAPER-IN -p gre -j MARK --set-mark 75

# ICMP (ping) - высокий приоритет,
# будем удивлять друзей
iptables -t mangle -A MYSHAPER-IN -p icmp -j MARK --set-mark 25

# распознавание имен DNS (маленькие пакеты)
iptables -t mangle -A MYSHAPER-IN -p udp -j MARK --set-mark 25

# secure shell
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 22 -j MARK --set-mark 10
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 22 -j MARK --set-mark 10

# telnet (ew...)
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 23 -j MARK --set-mark 25
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 23 -j MARK --set-mark 25

# маленькие пакеты, скорее всего ACK-пакеты
iptables -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j MARK --set-mark 25
#тут ускрил шефа :)
iptables -t mangle -A MYSHAPER-IN -d 10.1.1.7 -j MARK --set-mark 10


# избыточно - смаркировать все неотмаркированые пакеты как 99 (низкий проиритет)
iptables -t mangle -A MYSHAPER-IN -m mark --mark 0 -j MARK --set-mark 99

$TC filter add dev $DEV_IN parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
$TC filter add dev $DEV_IN parent 1:0 prio 1 protocol ip handle 25 fw flowid 1:25
$TC filter add dev $DEV_IN parent 1:0 prio 2 protocol ip handle 50 fw flowid 1:50
$TC filter add dev $DEV_IN parent 1:0 prio 3 protocol ip handle 75 fw flowid 1:75
$TC filter add dev $DEV_IN parent 1:0 prio 4 protocol ip handle 99 fw flowid 1:99

echo "Shaper on $DEV_IN started ($RATE_IN kbit/s)"
;;
stop)
tc qdisc del dev $DEV_IN root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_OUT root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV_OUT -j MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV_IN -j MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-IN 2> /dev/null > /dev/null

echo "Shaper removed"
;;
restart)
$0 stop
$0 start
;;
status)

echo "[qdisc IN]"
$TC -s qdisc show dev $DEV_IN
echo "[class IN]"
$TC -s class show dev $DEV_IN
echo "[filter IN]"
$TC -s filter show dev $DEV_IN
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac

exit 0
для твоей ситуации базовая конструкция будет иметь примерно такой вид:

Код: Выделить всё

$TC qdisc add dev $DEV_IN root handle 1:0 htb default 50

$TC class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${RATE_IN}kbit ceil ${RATE_IN}kbit
#гарантируем каждому 1/5 канала
$TC class add dev $DEV_IN parent 1:1 classid 1:10 htb rate $[$RATE_IN/5]kbit ceil ${RATE_IN}kbit
$TC class add dev $DEV_IN parent 1:1 classid 1:20 htb rate $[$RATE_IN/5]kbit ceil ${RATE_IN}kbit
$TC class add dev $DEV_IN parent 1:1 classid 1:30 htb rate $[$RATE_IN/5]kbit ceil ${RATE_IN}kbit
$TC class add dev $DEV_IN parent 1:1 classid 1:40 htb rate $[$RATE_IN/5]kbit ceil ${RATE_IN}kbit
$TC class add dev $DEV_IN parent 1:1 classid 1:50 htb rate $[$RATE_IN/5]kbit ceil ${RATE_IN}kbit

$TC qdisc add dev $DEV_IN parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:40 handle 40: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:50 handle 50: sfq perturb 10

....firewall....
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.10 -j MARK --set-mark 10
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.20 -j MARK --set-mark 20
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.30 -j MARK --set-mark 30
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.40 -j MARK --set-mark 40
#и необязательно
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.50 -j MARK --set-mark 50
100% гарантии дать не могу, но нечто подобное и нужно...

Добавлено: 23 сен 2007, 21:30
angor
Shart писал(а):P.S. И справится ли мой сервер с это нагрузкой (5 человек в сети :? )?
у меня селерон-600, 256 памяти с клиентами на openvpn не напрягался при 20 юзерах.

Добавлено: 24 сен 2007, 21:50
Shart
Насколько я понял, тут обрезается только входящий трафик. А исходящий как?

И как поступать в случае с бесплатными ресурсами на бОльшей скорость (2мбит). Я думаю, надо сделать в HTB два класса: первый для бесплатных ресурсов (там ничего не режется), второй для интернет (а там подклассы и т.д.)

P.S. Извините, может с терминологией чуть ошибся :roll:

Добавлено: 24 сен 2007, 23:10
angor
тут важно понять, что входящий траффик как таковой резать нельзя, можно пользоваться лишь св-вами протокола tcp. Посему входящий траффик есть исходящий для локального интерфейса. Проделай аналогичное для исходящего на if что смотрит на модем/инет.
А для бесплатных ресурсов ты прав. Только не забудь повысить глобальный rate для htb. Это может быть очередной класс. rate родителя должен быть >= сумме rate потомков, помни об этом.
зы стучи в асю (111707305)/irc (server:irc.bynets.org) - кину полное что есть, или доки, по которым все это клепал

Добавлено: 25 сен 2007, 14:23
cympak
Бесплатный совет, не совсем по теме - сменить инет, что бы каждый пользователь платил сам за себя, потому что рано или поздно найдутся недовольные

Добавлено: 26 сен 2007, 17:26
angor
Как сказал пульсар - наша основная проблема, что мы не можем договориться. Ведь вместе у нас будет гораздо круче инет и дешевле мы будем за него платить.
+1 к пульсару
-1 к сумраку

Добавлено: 26 сен 2007, 17:31
Llama
angor, когда будут сожать на кол за незаконное предпринимательство, укланение от уплаты налогов и предоставление услуг без лицензии - тогда у тебя плюсы и минусы поменяются местами. А домосети это такой гадюшник, в котором нахождение суки - вопрос роста, т.е. - времени.