Динамический шейпер
-
- Заглянувший
- Сообщения: 6
- Зарегистрирован: 19 сен 2007, 21:55
- Откуда: Минск, Беларусь
- Контактная информация:
Динамический шейпер
Есть компьютер (Celeron 500, 128 RAM, 160GB HDD) с двумя сетевыми платами. К одной подключен анлим интернет (128кб/с), к другой - домашняя сеть (5 компов).
Задача - сделать динамический шейпер с разделением на тип соединения (http, ftp и т.д....хотя можно и просто по порту), на IP назначения и исходящий адрес
Т.е. если в сети только один человек сидит в интернете, то ему отдаётся весь канал.
Если сидит два человека, но один качает файл, а другой ползает по интернету, то приоритет интернета больше, т.е. во время загрузки интернет-страниц ему отдаётся весь, или почти весь канал.
При этом на некоторые IP-адреса отдаётся весь канал (т.к. на них канал 2мбит).
Каким образом это можно организовать? Какие программы лучше/проще использовать? Где можно найти статьи по сабжу?
Задача - сделать динамический шейпер с разделением на тип соединения (http, ftp и т.д....хотя можно и просто по порту), на IP назначения и исходящий адрес
Т.е. если в сети только один человек сидит в интернете, то ему отдаётся весь канал.
Если сидит два человека, но один качает файл, а другой ползает по интернету, то приоритет интернета больше, т.е. во время загрузки интернет-страниц ему отдаётся весь, или почти весь канал.
При этом на некоторые IP-адреса отдаётся весь канал (т.к. на них канал 2мбит).
Каким образом это можно организовать? Какие программы лучше/проще использовать? Где можно найти статьи по сабжу?
- angor
- Интересующийся
- Сообщения: 40
- Зарегистрирован: 22 сен 2007, 12:08
- Откуда: Minsk
- Контактная информация:
вот и я добрался
спасибо Llama
есть похожий скриптик, сам воевал, исправь под свои нужды...
тут, правда, приоритеты (а вдруг полезно?)
100% гарантии дать не могу, но нечто подобное и нужно...

есть похожий скриптик, сам воевал, исправь под свои нужды...
тут, правда, приоритеты (а вдруг полезно?)
для твоей ситуации базовая конструкция будет иметь примерно такой вид:#!/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
-
- Заглянувший
- Сообщения: 6
- Зарегистрирован: 19 сен 2007, 21:55
- Откуда: Минск, Беларусь
- Контактная информация:
Насколько я понял, тут обрезается только входящий трафик. А исходящий как?
И как поступать в случае с бесплатными ресурсами на бОльшей скорость (2мбит). Я думаю, надо сделать в HTB два класса: первый для бесплатных ресурсов (там ничего не режется), второй для интернет (а там подклассы и т.д.)
P.S. Извините, может с терминологией чуть ошибся
И как поступать в случае с бесплатными ресурсами на бОльшей скорость (2мбит). Я думаю, надо сделать в HTB два класса: первый для бесплатных ресурсов (там ничего не режется), второй для интернет (а там подклассы и т.д.)
P.S. Извините, может с терминологией чуть ошибся

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