алгоритм шейпера tc htb
Модератор: SLEDopit
алгоритм шейпера tc htb
Есть 100 пользователей. Есть тарифные пакеты 5шт безлимитка с ограничением скорости от и до, (т.е RATE и CEIL).
Нужно прописать шейпер. Вижу два варианта:
1) один родительский класс + 5 подклассов (создаются во время создания пакетов), то есть каждый тариф - свой подкласс tc.
и при коннекте пользователя проверяется его пакет и с помощью Iptables маркируется трафик на определенный класс.
2) один родительский класс и при создании коннекта для каждого пользователя создаем подкласс, а при отключениии пользователя удаляем этот подкласс.
Какой метод правильный и более рациональный? возможно вообще я не правильно понимаю алгоритм?? Подскажите.
Нужно прописать шейпер. Вижу два варианта:
1) один родительский класс + 5 подклассов (создаются во время создания пакетов), то есть каждый тариф - свой подкласс tc.
и при коннекте пользователя проверяется его пакет и с помощью Iptables маркируется трафик на определенный класс.
2) один родительский класс и при создании коннекта для каждого пользователя создаем подкласс, а при отключениии пользователя удаляем этот подкласс.
Какой метод правильный и более рациональный? возможно вообще я не правильно понимаю алгоритм?? Подскажите.
Re: алгоритм шейпера tc htb
посмотрите здесь:
http://www.opennet.ru/base/net/adsl_qos.txt.html
и здесь:
http://www.opennet.ru/docs/RUS/LARTC/x2755.html
http://www.opennet.ru/base/net/adsl_qos.txt.html
и здесь:
http://www.opennet.ru/docs/RUS/LARTC/x2755.html
Блогосайт - http://www.fateyev.com
Re: алгоритм шейпера tc htb
Прочитал. я вкурсе этого дела, но везде описывается общее разделение трафика, а мне нужно разным людям ограничивать по разному, вот и спрашиваю как это лучше сделать.
Допустим есть
1) 10 чел у которых RATE 10Kbit SEIL 100 Kbit
2) 5 чел у которых RATE 20 Kbit SEIL 100Kbit
3) 25 чел у которых RATE 50Kbit SEIL 500Kbit
Как правильно распределить их чтобы при довалении нового чела не нужно было пересматривать всю систему.
Интернет приходин на ppp0 клиентам уходит по pppX. Думал делать так:
При старте системы
при ip-up
при ip-down
и так для каждого поьзователя.
Умные люди посмотрите пожалуйста, правильный ли ход мыслей? будет ли нормально работать и шейпер и доступ.
Заранее благодарен за помощь.
Допустим есть
1) 10 чел у которых RATE 10Kbit SEIL 100 Kbit
2) 5 чел у которых RATE 20 Kbit SEIL 100Kbit
3) 25 чел у которых RATE 50Kbit SEIL 500Kbit
Как правильно распределить их чтобы при довалении нового чела не нужно было пересматривать всю систему.
Интернет приходин на ppp0 клиентам уходит по pppX. Думал делать так:
При старте системы
Код: Выделить всё
tc qdisc add dev eth0 root handle 1: htb default 1:256
при ip-up
Код: Выделить всё
no=номер клиента (xxx)
// Забиваем три правила для данного клиента
tc class add dev pppX parent 1:0 classid 1:${no}0 htb rate $[$speed_rate*2]kbit ceil $[$speed_ceil*2]kbit prio 0 - icmp (ping)
tc class add dev pppX parent 1:0 classid 1:${no}1 htb rate ${speed_rate}kbit ceil ${speed_ceil}kbit prio 1 - 80 порт
tc class add dev pppX parent 1:0 classid 1:${no}2 htb rate ${speed_rate}kbit ceil ${speed_ceil}kbit prio 2 - все остальное
// фильтры для маркировки по приоретету
tc filter add dev pppX parent 1:0 protocol ip prio 0 handle ${no}0 fw classid 1:{no}0
tc filter add dev pppX parent 1:0 protocol ip prio 1 handle ${no}1 fw classid 1:{no}1
tc filter add dev pppX parent 1:0 protocol ip prio 2 handle ${no}2 fw classid 1:{no}2
// включаем интернет у пользователя
iptables -t nat -A POSTROUTING -s ${ip}/255.255.255.0 -o pppX -j SNAT --to-source xxx.xxx.xxx.xxx
//маркируем icmp пакеты (пинг) на первое правило
iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 0x${no}0
iptables -t mangle -A PREROUTING -p icmp -j RETURN
//маркируем 80 порт на второе правило
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 0x${no}1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
//маркируем все остальное на третье правило
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1024:65535 -j MARK --set-mark 0x${no}2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1024:65535 -j RETURN
при ip-down
Код: Выделить всё
tc qdisc del dev pppX root 2> /dev/null > /dev/null
// отключаем интернет у пользователя
iptables -t nat -D POSTROUTING -s ${ip}/255.255.255.0 -o pppX -j SNAT --to-source xxx.xxx.xxx.xxx
//маркируем icmp пакеты (пинг) на первое правило - удаляем
iptables -t mangle -D PREROUTING -p icmp -j MARK --set-mark 0x${no}0
iptables -t mangle -D PREROUTING -p icmp -j RETURN
//маркируем 80 порт на второе правило - удаляем
iptables -t mangle -D PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 0x${no}1
iptables -t mangle -D PREROUTING -p tcp -m tcp --dport 80 -j RETURN
//маркируем все остальное на третье правило - удаляем
iptables -t mangle -D PREROUTING -p tcp -m tcp --dport 1024:65535 -j MARK --set-mark 0x${no}2
iptables -t mangle -D PREROUTING -p tcp -m tcp --dport 1024:65535 -j RETURN
и так для каждого поьзователя.
Умные люди посмотрите пожалуйста, правильный ли ход мыслей? будет ли нормально работать и шейпер и доступ.
Заранее благодарен за помощь.
Re: алгоритм шейпера tc htb
Если вам гарантированно нужно выделять пропускную способность пользователю, то вам нужно выделять его в отдельный подкласс (чтоб ему доставалась эта гарантированная полоса).
Вроде никаких средств автоматизации типа ("этим пяти пользователям гарантировано по 100кбит") в tc не имеется.
Насчет перенастройки всей системы - вы не правы. Если маркируете соединения от пользователя, то при добавлении нового пользователя нужно лишь добавить набор правил шейпера, и правило для маркировки iptables (все это делается в реалтайме, останавливать или перегружать систему не надо). То же самое, и при удалении пользователя.
Можете посмотреть еще tcng в качестве средства, облегчающего создание правил.
Блогосайт - http://www.fateyev.com
Re: алгоритм шейпера tc htb
немного модифицировал скрипт. потому что предыдущий не расширял полосу ceil
вот пришлось добавить корневой класс
чтобы работал ciel у пользователя, но опять же при такой настройке не будет происходить займ трафика у других при простое, ведь мы работаем с девайсом pppX и у каждого пользователя он разный, т.е ppp1,ppp2,ppp3 и тд.
Как сделать общий корневой класс и уже от него строить классы и фильтры? на какой интерфейс повесить? Что то я никак не пойму.
eth0 - локалка (на ней ppp1-ppp253)
eth1 - интренет (получаем через ppp0)
Может кто может платно помочь? Если так нет желания?
Код: Выделить всё
#!/bin/sh
IP=${5}
if [ -f /var/run/radattr.$1 ]
then
DOWNSPEED=`/usr/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
UPSPEED=`/usr/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
ID=`/usr/bin/awk '/ID-User/ {print $2}' /var/run/radattr.$1`
/sbin/tc qdisc add dev $1 root handle 1: htb default ${ID}2 r2q 1
/sbin/tc class add dev $1 parent 1: classid 1:1 htb rate 300kbit ceil 500kbit
/sbin/tc class add dev $1 parent 1:1 classid 1:${ID}0 htb rate ${DOWNSPEED}kbit ceil 999kbit prio 0 # icmp (ping)
/sbin/tc class add dev $1 parent 1:1 classid 1:${ID}1 htb rate ${DOWNSPEED}kbit ceil 400kbit prio 1 # 80 порт
/sbin/tc class add dev $1 parent 1:1 classid 1:${ID}2 htb rate ${DOWNSPEED}kbit ceil 200kbit prio 2 # все остальное
/sbin/tc qdisc add dev $1 parent 1:${ID}0 handle ${ID}0: sfq perturb 10 quantum 1500
/sbin/tc qdisc add dev $1 parent 1:${ID}1 handle ${ID}1: sfq perturb 10 quantum 1500
/sbin/tc qdisc add dev $1 parent 1:${ID}2 handle ${ID}2: sfq perturb 10 quantum 1500
// фильтры для маркировки по приоретету
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 0 handle ${ID}0 fw classid 1:${ID}0
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 1 handle ${ID}1 fw classid 1:${ID}1
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 2 handle ${ID}2 fw classid 1:${ID}2
fi
# включаем интернет у пользователя
iptables -t nat -A POSTROUTING -s ${IP} -d 0/0 -j MASQUERADE
# маркируем icmp пакеты (пинг) на первое правило
iptables -t mangle -A PREROUTING -o $1 -p icmp -j MARK --set-mark ${ID}0
iptables -t mangle -A PREROUTING -o $1 -p icmp -j RETURN
UNPRIPORTS=1024:65535
# маркируем 80 порт на второе правило
iptables -t mangle -A PREROUTING -s ${IP} -p tcp -m tcp --sport $UNPRIPORTS --dport 80 -j MARK --set-mark ${ID}1
iptables -t mangle -A PREROUTING -s ${IP} -p tcp -m tcp --sport $UNPRIPORTS --dport 80 -j RETURN
# маркируем все остальное на третье правило
#iptables -t mangle -A PREROUTING -s ${IP} -p tcp -m tcp --dport 1024:65535 -j MARK --set-mark ${ID}2
#iptables -t mangle -A PREROUTING -s ${IP} -p tcp -m tcp --dport 1024:65535 -j RETURN
iptables -t mangle -A PREROUTING -s ${IP} -j MARK --set-mark ${ID}1
# Upoad
/sbin/tc qdisc add dev $1 handle ffff: ingress
/sbin/tc filter add dev $1 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${UPSPEED}kbit burst 12k drop flowid :1
вот пришлось добавить корневой класс
Код: Выделить всё
/sbin/tc class add dev $1 parent 1: classid 1:1 htb rate 300kbit ceil 500kbit
чтобы работал ciel у пользователя, но опять же при такой настройке не будет происходить займ трафика у других при простое, ведь мы работаем с девайсом pppX и у каждого пользователя он разный, т.е ppp1,ppp2,ppp3 и тд.
Как сделать общий корневой класс и уже от него строить классы и фильтры? на какой интерфейс повесить? Что то я никак не пойму.
eth0 - локалка (на ней ppp1-ppp253)
eth1 - интренет (получаем через ppp0)
Может кто может платно помочь? Если так нет желания?
Re: алгоритм шейпера tc htb
Насчет разных имен девайса у пользователей - не понял, что вы имеете в виду. Поясните более детально
Т.е. что у вас на локалке, почему куча ppp-интерфейсов?
Я повторяюсь, конечно, но: вы смотрели это? Там расписано все детально, и про использование незанятой полосы, исходя из приоритетов потока.
Вкратце:
a) корневой класс - нужен, строить классы и фильтры от него (в статье детально расписано про это, а также сказано про приоритеты и как берется незанятая полоса для нужд остальных потоков);
b) если ограничивать по скорости исходящие - то вешать на ppp0, если входящий - то на eth0. Можете для каждого интерфейса создать корневой класс, и там разруливать входящий/исходящий.
Блогосайт - http://www.fateyev.com
Re: алгоритм шейпера tc htb
куча ppp - потому что клиенты подключаются через VPN (стоит радиус и авторизация происходи через него)
Второй вариант повесить все на eth0 (смотрит в локалку)
При старте системы
Для каждого клиента
В этом случае если я правильно понимаю не нужно маркировать пакеты. фильтр tc сам выбирает пакеты по ip клиента. Будет ли правильно работать такой алгоритм?
Если в фильтрах не использовать match ip, а использовать маркировку, то как можно выделить конкретного клиента, ведь по сути они все на eth0 сидят.
Второй вариант повесить все на eth0 (смотрит в локалку)
При старте системы
Код: Выделить всё
IP - айпи клиента (VPN)
ID - уникальный номер клиента
/sbin/tc qdisc add dev eth0 root handle 1: htb default 999 r2q 1
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 300kbit ceil 999kbit
/sbin/tc class add dev eth0 parent 1:1 classid 1:999 htb rate 10kbit ceil 999kbit prio 10
/sbin/tc qdisc add dev eth0 parent 1:999 handle 999: sfq perturb 10 quantum 1500
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 999 fw classid 1:999
iptables -t mangle -A PREROUTING -o eth0 -j MARK --set-mark 999
iptables -t mangle -A PREROUTING -o eth0 -j RETURN
# вот тут как правильно промаркировать, потому что в этом примере весь трафик будет идти на 999 а нужно сначало все фильтры пройти а все остальное на 999 посылать.
Для каждого клиента
Код: Выделить всё
/sbin/tc class add dev eth0 parent 1:1 classid 1:${ID}0 htb rate ${DOWNSPEED}kbit ceil 999kbit prio 0 # icmp (ping)
/sbin/tc class add dev eth0 parent 1:1 classid 1:${ID}1 htb rate ${DOWNSPEED}kbit ceil 400kbit prio 1 # 80 порт
/sbin/tc class add dev eth0 parent 1:1 classid 1:${ID}2 htb rate ${DOWNSPEED}kbit ceil 200kbit prio 2 # все остальное
/sbin/tc qdisc add dev eth0 parent 1:${ID}0 handle ${ID}0: sfq perturb 10 quantum 1500
/sbin/tc qdisc add dev eth0 parent 1:${ID}1 handle ${ID}1: sfq perturb 10 quantum 1500
/sbin/tc qdisc add dev eth0 parent 1:${ID}2 handle ${ID}2: sfq perturb 10 quantum 1500
// фильтры для маркировки по приоретету
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src ${IP} 0xffff flowid 1:${ID}0
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip src ${IP} match ip dport 80 0xffff flowid 1:${ID}1
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip src ${IP} 0xffff flowid 1:${ID}2
В этом случае если я правильно понимаю не нужно маркировать пакеты. фильтр tc сам выбирает пакеты по ip клиента. Будет ли правильно работать такой алгоритм?
Если в фильтрах не использовать match ip, а использовать маркировку, то как можно выделить конкретного клиента, ведь по сути они все на eth0 сидят.
Re: алгоритм шейпера tc htb
Без распределение по приорететам, но с ограничением и входящей и исходящей скорости
#При старте
Для каждого
Вопрос
тут какой указывайть айпи? dst или src
я так понимаю что для ppp0 (приходит интернет) нужно указывать dst а для eth0 - src
#При старте
Код: Выделить всё
#шейпер вешается на egress, исходящий траф
tc qdisc add dev ppp0 root handle 1: htb # - ppp0 получает интернет сервак
#на входящий
tc qdisc add dev eth0 root handle 1: htb # подключены клиенты через pppX соединения
#вся труба 999к исходщий
tc class add dev ppp0 parent 1:0 classid 1:1 htb rate 999kbit
#вся труба 888к входящий
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 888kbit
Для каждого
Код: Выделить всё
# исходящий
#могут расти до 999к если сосед в простое
tc class add dev ppp1 parent 1:1 classid 1:${NO} htb rate ${DOWNSPEED}kbit ceil 999kbit
# входящий
#могут расти до 888к если сосед в простое
tc class add dev eth0 parent 1:1 classid 1:${NO} htb rate ${UPSPEED}kbit ceil 888kbit
#это шобы в пользовательской трубочке между сессиями
#было равномерное разделение полосы
#иначе, новые коннекты будут давить старые
tc qdisc add dev ppp0 parent 1:${NO} sfq
tc qdisc add dev eth0 parent 1:${NO} sfq
#самое важное - фильтры, какие пакеты в какой класс посылать
tc filter add dev ppp0 protocol ip parent 1:0 u32 match ip dst ${IP} flowid 1:${NO}
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip dst ${IP} flowid 1:${NO}
Вопрос
Код: Выделить всё
tc filter add dev ppp0 protocol ip parent 1:0 u32 match ip dst ${IP} flowid 1:${NO}
тут какой указывайть айпи? dst или src
я так понимаю что для ppp0 (приходит интернет) нужно указывать dst а для eth0 - src
Re: алгоритм шейпера tc htb
вариант первый - при подключении клиента (и создании интерфейса pppX для клиента), выполнять скрипт, добавляющий специфические правила для клиента (наверно, ваш vpn-сервер позволяет вызывать скрипт при подключении пользователя?)
вариант второй - просто вешать все на eth0.
заранее знаете ip и параметры клиентов, ну и прописываете правила статически.
svip писал(а): ↑27.03.2009 11:17При старте системы
Код: Выделить всё
iptables -t mangle -A PREROUTING -o eth0 -j MARK --set-mark 999 iptables -t mangle -A PREROUTING -o eth0 -j RETURN
Для eth0, можно маркировать по назначению ( -d Internal-IP ), в цепочке postrouting.
Или средствами tc, по классификатору u32, как в другой статье описано:
Код: Выделить всё
tc filter add dev $DEV_IN parent 1:0 prio 3 $U32 $TCP $DST 10.0.0.100 $DPORT 3389 0xffff classid 1:14
svip писал(а): ↑27.03.2009 11:17Код: Выделить всё
# вот тут как правильно промаркировать, потому что в этом примере весь трафик будет идти на 999 а нужно сначало все фильтры пройти а все остальное на 999 посылать.
Для какой цели вы хотите маркировать весь трафик? Если для того, чтобы пустить весь немаркированный трафик по умолчанию через определенный класс, то достаточно объявить нужный класс default-ом, и через него пойдет немаркированный трафик, а маркированный пойдет по соответсвующим цепочкам, которые вы определите.
Если вы хотите маркировать вообще весь трафик 999, маркируйте весь трафик через iptables, а правилами ниже перемаркировывайте в соответствии с правилами. В итоге получится, что некласифицированный трафик будет иметь марку 999 (или какую зададите), а трафик пользователей - марки в соответствии с критериями.
см. выше.
Блогосайт - http://www.fateyev.com
Re: алгоритм шейпера tc htb
Понял спасибо. буду тестировать.
Re: алгоритм шейпера tc htb
вариант первый - при подключении клиента (и создании интерфейса pppX для клиента), выполнять скрипт, добавляющий специфические правила для клиента (наверно, ваш vpn-сервер позволяет вызывать скрипт при подключении пользователя?)
да скрипт при коннекте запуска, но опять же моя первая проблема выскакивает если вещать правила на pppX клиентов
нужно определить корневой класс
tc qdisc add dev pppX root handle 1: htb
он должен быть одинаковый для всех клиентов чтобы проходил займ трафика, но как указать интерфейс? ведь для каждого клиента свой ppp(1-253). на eth0 вещать нельзя в моем случае, потому что траф тогда идет мимо vpn соединия, а должно по нему идти.
Может все повесить на ppp0 (выход сервака в интернет) и плясать от него?????
для всех
Код: Выделить всё
/sbin/tc qdisc add dev ppp0 root handle 1: htb default ${ID}2 r2q 1
/sbin/tc class add dev ppp0 parent 1:0 classid 1:1 htb rate 999kbit
для каждого
Код: Выделить всё
/sbin/tc class add dev ppp0 parent 1:1 classid 1:${ID}0 htb rate ${DOWNSPEED}kbit ceil 999kbit prio 0 # icmp (ping)
/sbin/tc class add dev ppp0 parent 1:1 classid 1:${ID}1 htb rate ${DOWNSPEED}kbit ceil 400kbit prio 1 # 80 порт
/sbin/tc class add dev ppp0 parent 1:1 classid 1:${ID}2 htb rate ${DOWNSPEED}kbit ceil 200kbit prio 2 # все остальное
/sbin/tc qdisc add dev ppp0 parent 1:${ID}0 handle ${ID}0: sfq perturb 10 quantum 1500
/sbin/tc qdisc add dev ppp0 parent 1:${ID}1 handle ${ID}1: sfq perturb 10 quantum 1500
/sbin/tc qdisc add dev ppp0 parent 1:${ID}2 handle ${ID}2: sfq perturb 10 quantum 1500
// фильтры для маркировки по приоретету
/sbin/tc filter add dev ppp0 parent 1:0 protocol ip prio 0 u32 match ip dst ${IP} 0xffff flowid 1:${ID}0
/sbin/tc filter add dev ppp0 parent 1:0 protocol ip prio 1 u32 match ip dst ${IP} match ip dport 80 0xffff flowid 1:${ID}1
/sbin/tc filter add dev ppp0 parent 1:0 protocol ip prio 2 u32 match ip dst ${IP} 0xffff flowid 1:${ID}2
???
Re: алгоритм шейпера tc htb
Сделал полный шейпер на занрузку и выгрузку. Работает как часы. Кому нужно пользуйтесь
НО свою проблему так и не решил. Клиенты подключаются по VPN (pppX), радиус раздает им айпи из 192.168.0.0/24
Получается то при создании vpn соединения весь трафик идет через него и с вышеприведенным скриптом попадает в
как быть????? Уже голова кипит. Видимо без IMQ не решить данный вопрос?? Люди помогите.
Код: Выделить всё
#!/bin/bash
#-------------------------------------------------------------------------------
# DOWNLOAD
#-------------------------------------------------------------------------------
DEVDN="eth0"
RATEDN=300
#Ingress traffic flow limitation
#ip link set dev $DEV qlen 30
tc qdisc add dev $DEVDN root handle 1:0 htb default 255
tc class add dev $DEVDN parent 1:0 classid 1:1 htb rate ${RATEDN}kbit
#Добавление классов для каждого пользователя
tc class add dev $DEVDN parent 1:1 classid 1:10 htb rate $[$RATEDN/3]kbit ceil ${RATEDN}kbit
tc class add dev $DEVDN parent 1:1 classid 1:11 htb rate $[$RATEDN/3]kbit ceil ${RATEDN}kbit
tc class add dev $DEVDN parent 1:1 classid 1:255 htb rate $[$RATEDN/3]kbit ceil ${RATEDN}kbit
tc qdisc add dev $DEVDN parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEVDN parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev $DEVDN parent 1:255 handle 255: sfq perturb 10
#Для маркировки в iptables
tc filter add dev $DEVDN parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev $DEVDN parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11
tc filter add dev $DEVDN parent 1:0 prio 0 protocol ip handle 255 fw flowid 1:255
#Добавляем новый канал в iptables
iptables -t mangle -N MYSHAPER-DOWN
iptables -t mangle -I POSTROUTING -o $DEVDN -j MYSHAPER-DOWN
#Маркируем все с айпи клиента
iptables -t mangle -A MYSHAPER-DOWN -d 10.0.0.1 -j MARK --set-mark 10
iptables -t mangle -A MYSHAPER-DOWN -d 10.0.0.2 -j MARK --set-mark 11
#все остальные пакеты
iptables -t mangle -A MYSHAPER-DOWN -m mark --mark 0 -j MARK --set-mark 255
echo "DOWNLOAD шейпер добавлен на интерфейс $DEVDN. Rate: ${RATEDN}kbit/sec."
#-------------------------------------------------------------------------------
# UPLOAD
#-------------------------------------------------------------------------------
DEVUP="ppp0"
RATEUP=200
#Ingress traffic flow limitation
#ip link set dev $DEV qlen 30
#Add root queue HTB
tc qdisc add dev $DEVUP root handle 1:0 htb default 255
#Connection speed limitation on class
tc class add dev $DEVUP parent 1:0 classid 1:1 htb rate ${RATEUP}kbit
#Adding subclasses
tc class add dev $DEVUP parent 1:1 classid 1:10 htb rate $[$RATEUP/4]kbit ceil ${RATEUP}kbit
tc class add dev $DEVUP parent 1:1 classid 1:11 htb rate $[$RATEUP/4]kbit ceil ${RATEUP}kbit
tc class add dev $DEVUP parent 1:1 classid 1:255 htb rate $[$RATEUP/4]kbit ceil ${RATEUP}kbit
#Conecting queue disciplines to HTB classes
tc qdisc add dev $DEVUP parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEVUP parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev $DEVUP parent 1:255 handle 255: sfq perturb 10
#Redirect traffic to classes about FWMARK field
tc filter add dev $DEVUP parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev $DEVUP parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11
tc filter add dev $DEVUP parent 1:0 prio 0 protocol ip handle 255 fw flowid 1:255
#Add a new chain to iptables
iptables -t mangle -N MYSHAPER-UP
iptables -t mangle -I POSTROUTING -o $DEVUP -j MYSHAPER-UP
#-------------------------------------Traffic MARK with iptables
iptables -t mangle -A MYSHAPER-UP -s 10.0.0.1 -j MARK --set-mark 10
iptables -t mangle -A MYSHAPER-UP -s 10.0.0.2 -j MARK --set-mark 11
#All other packets
iptables -t mangle -A MYSHAPER-UP -m mark --mark 0 -j MARK --set-mark 255
echo "UPLOAD шейпер добавлен на интерфейс $DEVUP. Rate: ${RATEUP}kbit/sec."
НО свою проблему так и не решил. Клиенты подключаются по VPN (pppX), радиус раздает им айпи из 192.168.0.0/24
Получается то при создании vpn соединения весь трафик идет через него и с вышеприведенным скриптом попадает в
Код: Выделить всё
iptables -t mangle -A MYSHAPER-UP -m mark --mark 0 -j MARK --set-mark 255
как быть????? Уже голова кипит. Видимо без IMQ не решить данный вопрос?? Люди помогите.
Re: алгоритм шейпера tc htb
пересобрал ядро с IMQ и новый iptables c поддержкой IMQ. вроде все работает. перенаправил все ppp1-ppp200 (входящие пакеты) c помощью iptables на imq0 а исходящие на imq1.
где DEV - ppp1-ppp200
прописан NAT:
iptables -t nat -A POSTROUTING -s 192.168.0.1 -j MASQUERADE #ppp1
.....................
iptables -t nat -A POSTROUTING -s 192.168.0.200 -j MASQUERADE #ppp200
создается при коннекте ppp И удаляются при дисконекте.
шейпер
......
tc filter add dev imq0 parent 1:0 protocol ip prio 2 u32 match ip dst 192.168.0.1/32 flowid 1:10
tc filter add dev imq1 parent 1:0 protocol ip prio 2 u32 match ip src 192.168.0.1/32 flowid 1:10
...............
tc filter add dev imq0 parent 1:0 protocol ip prio 2 u32 match ip dst 192.168.0.200/32 flowid 1:2000
tc filter add dev imq1 parent 1:0 protocol ip prio 2 u32 match ip src 192.168.0.200/32 flowid 1:2000
НО скорость выгрузки всегда в два раза меньше заданной, а скорость загрузки плавает прилично.
Специалисты подскажите в чем может быть проблема?
Код: Выделить всё
iptables -t mangle -A PREROUTING -i $DEV -j IMQ --todev 0
iptables -t mangle -A POSTROUTING -o $DEV -j IMQ --todev 1
где DEV - ppp1-ppp200
прописан NAT:
iptables -t nat -A POSTROUTING -s 192.168.0.1 -j MASQUERADE #ppp1
.....................
iptables -t nat -A POSTROUTING -s 192.168.0.200 -j MASQUERADE #ppp200
создается при коннекте ppp И удаляются при дисконекте.
шейпер
......
tc filter add dev imq0 parent 1:0 protocol ip prio 2 u32 match ip dst 192.168.0.1/32 flowid 1:10
tc filter add dev imq1 parent 1:0 protocol ip prio 2 u32 match ip src 192.168.0.1/32 flowid 1:10
...............
tc filter add dev imq0 parent 1:0 protocol ip prio 2 u32 match ip dst 192.168.0.200/32 flowid 1:2000
tc filter add dev imq1 parent 1:0 protocol ip prio 2 u32 match ip src 192.168.0.200/32 flowid 1:2000
НО скорость выгрузки всегда в два раза меньше заданной, а скорость загрузки плавает прилично.
Специалисты подскажите в чем может быть проблема?