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

Linux, безопасность, сети и все что с этим связано
Shart
Заглянувший
Сообщения: 6
Зарегистрирован: 19 сен 2007, 21:55
Откуда: Минск, Беларусь
Контактная информация:

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

Сообщение Shart »

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

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

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

Komzpa
Интересующийся
Сообщения: 54
Зарегистрирован: 04 янв 2007, 19:33
Откуда: Мінск
Контактная информация:

Сообщение Komzpa »

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

Shart
Заглянувший
Сообщения: 6
Зарегистрирован: 19 сен 2007, 21:55
Откуда: Минск, Беларусь
Контактная информация:

Сообщение Shart »

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

Аватара пользователя
nab
Фанатеющий
Сообщения: 159
Зарегистрирован: 07 май 2004, 21:42
Откуда: Сталіца

Сообщение nab »

Изображение

Shart
Заглянувший
Сообщения: 6
Зарегистрирован: 19 сен 2007, 21:55
Откуда: Минск, Беларусь
Контактная информация:

Сообщение Shart »

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

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Shart, читать LARTC, можно в переводе. Динамически раскинуть полосу можно.
Опыт растет прямо пропорционально выведенному из строя оборудованию

Shart
Заглянувший
Сообщения: 6
Зарегистрирован: 19 сен 2007, 21:55
Откуда: Минск, Беларусь
Контактная информация:

Сообщение Shart »

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

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

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

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

Аватара пользователя
angor
Интересующийся
Сообщения: 40
Зарегистрирован: 22 сен 2007, 12:08
Откуда: Minsk
Контактная информация:

Сообщение 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% гарантии дать не могу, но нечто подобное и нужно...

Аватара пользователя
angor
Интересующийся
Сообщения: 40
Зарегистрирован: 22 сен 2007, 12:08
Откуда: Minsk
Контактная информация:

Сообщение angor »

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

Shart
Заглянувший
Сообщения: 6
Зарегистрирован: 19 сен 2007, 21:55
Откуда: Минск, Беларусь
Контактная информация:

Сообщение Shart »

Насколько я понял, тут обрезается только входящий трафик. А исходящий как?

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

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

Аватара пользователя
angor
Интересующийся
Сообщения: 40
Зарегистрирован: 22 сен 2007, 12:08
Откуда: Minsk
Контактная информация:

Сообщение angor »

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

Аватара пользователя
cympak
Увлекающийся
Сообщения: 114
Зарегистрирован: 26 окт 2005, 13:38

Сообщение cympak »

Бесплатный совет, не совсем по теме - сменить инет, что бы каждый пользователь платил сам за себя, потому что рано или поздно найдутся недовольные
...а на каком основании ограниченность некоторых делать законом для всех?

Аватара пользователя
angor
Интересующийся
Сообщения: 40
Зарегистрирован: 22 сен 2007, 12:08
Откуда: Minsk
Контактная информация:

Сообщение angor »

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

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

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

Ответить