алгоритм шейпера tc htb

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модератор: SLEDopit

Ответить
svip
Сообщения: 9
ОС: ubuntu 7.10

алгоритм шейпера tc htb

Сообщение svip »

Есть 100 пользователей. Есть тарифные пакеты 5шт безлимитка с ограничением скорости от и до, (т.е RATE и CEIL).
Нужно прописать шейпер. Вижу два варианта:
1) один родительский класс + 5 подклассов (создаются во время создания пакетов), то есть каждый тариф - свой подкласс tc.
и при коннекте пользователя проверяется его пакет и с помощью Iptables маркируется трафик на определенный класс.

2) один родительский класс и при создании коннекта для каждого пользователя создаем подкласс, а при отключениии пользователя удаляем этот подкласс.

Какой метод правильный и более рациональный? возможно вообще я не правильно понимаю алгоритм?? Подскажите.
Спасибо сказали:
svip
Сообщения: 9
ОС: ubuntu 7.10

Re: алгоритм шейпера tc htb

Сообщение svip »

Прочитал. я вкурсе этого дела, но везде описывается общее разделение трафика, а мне нужно разным людям ограничивать по разному, вот и спрашиваю как это лучше сделать.
Допустим есть
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


и так для каждого поьзователя.


Умные люди посмотрите пожалуйста, правильный ли ход мыслей? будет ли нормально работать и шейпер и доступ.
Заранее благодарен за помощь.
Спасибо сказали:
Аватара пользователя
danger08
Сообщения: 715
ОС: Linux (CentOS, Ubuntu)
Контактная информация:

Re: алгоритм шейпера tc htb

Сообщение danger08 »

svip писал(а):
26.03.2009 16:58
Прочитал. я вкурсе этого дела, но везде описывается общее разделение трафика, а мне нужно разным людям ограничивать по разному, вот и спрашиваю как это лучше сделать.

Если вам гарантированно нужно выделять пропускную способность пользователю, то вам нужно выделять его в отдельный подкласс (чтоб ему доставалась эта гарантированная полоса).

Вроде никаких средств автоматизации типа ("этим пяти пользователям гарантировано по 100кбит") в tc не имеется.
Насчет перенастройки всей системы - вы не правы. Если маркируете соединения от пользователя, то при добавлении нового пользователя нужно лишь добавить набор правил шейпера, и правило для маркировки iptables (все это делается в реалтайме, останавливать или перегружать систему не надо). То же самое, и при удалении пользователя.

Можете посмотреть еще tcng в качестве средства, облегчающего создание правил.
Блогосайт - http://www.fateyev.com
Спасибо сказали:
svip
Сообщения: 9
ОС: ubuntu 7.10

Re: алгоритм шейпера tc htb

Сообщение svip »

немного модифицировал скрипт. потому что предыдущий не расширял полосу ceil

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

#!/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)

Может кто может платно помочь? Если так нет желания?
Спасибо сказали:
Аватара пользователя
danger08
Сообщения: 715
ОС: Linux (CentOS, Ubuntu)
Контактная информация:

Re: алгоритм шейпера tc htb

Сообщение danger08 »

svip писал(а):
27.03.2009 10:20
чтобы работал ciel у пользователя, но опять же при такой настройке не будет происходить займ трафика у других при простое, ведь мы работаем с девайсом pppX и у каждого пользователя он разный, т.е ppp1,ppp2,ppp3 и тд.

Насчет разных имен девайса у пользователей - не понял, что вы имеете в виду. Поясните более детально :rolleyes:
Т.е. что у вас на локалке, почему куча ppp-интерфейсов?

svip писал(а):
27.03.2009 10:20
Как сделать общий корневой класс и уже от него строить классы и фильтры? на какой интерфейс повесить? Что то я никак не пойму.

eth0 - локалка (на ней ppp1-ppp253)
eth1 - интренет (получаем через ppp0)

Я повторяюсь, конечно, но: вы смотрели это? Там расписано все детально, и про использование незанятой полосы, исходя из приоритетов потока.

Вкратце:
a) корневой класс - нужен, строить классы и фильтры от него (в статье детально расписано про это, а также сказано про приоритеты и как берется незанятая полоса для нужд остальных потоков);

b) если ограничивать по скорости исходящие - то вешать на ppp0, если входящий - то на eth0. Можете для каждого интерфейса создать корневой класс, и там разруливать входящий/исходящий.
Блогосайт - http://www.fateyev.com
Спасибо сказали:
svip
Сообщения: 9
ОС: ubuntu 7.10

Re: алгоритм шейпера tc htb

Сообщение svip »

куча ppp - потому что клиенты подключаются через VPN (стоит радиус и авторизация происходи через него)

Второй вариант повесить все на 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 сидят.
Спасибо сказали:
svip
Сообщения: 9
ОС: ubuntu 7.10

Re: алгоритм шейпера tc htb

Сообщение svip »

Без распределение по приорететам, но с ограничением и входящей и исходящей скорости

#При старте

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

#шейпер вешается на 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
Спасибо сказали:
Аватара пользователя
danger08
Сообщения: 715
ОС: Linux (CentOS, Ubuntu)
Контактная информация:

Re: алгоритм шейпера tc htb

Сообщение danger08 »

svip писал(а):
27.03.2009 11:17
куча ppp - потому что клиенты подключаются через VPN (стоит радиус и авторизация происходи через него)

Второй вариант повесить все на eth0 (смотрит в локалку)

вариант первый - при подключении клиента (и создании интерфейса 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 (или какую зададите), а трафик пользователей - марки в соответствии с критериями.

svip писал(а):
27.03.2009 11:17
Если в фильтрах не использовать match ip, а использовать маркировку, то как можно выделить конкретного клиента, ведь по сути они все на eth0 сидят.

см. выше.
Блогосайт - http://www.fateyev.com
Спасибо сказали:
svip
Сообщения: 9
ОС: ubuntu 7.10

Re: алгоритм шейпера tc htb

Сообщение svip »

Понял спасибо. буду тестировать.
Спасибо сказали:
svip
Сообщения: 9
ОС: ubuntu 7.10

Re: алгоритм шейпера tc htb

Сообщение svip »

вариант первый - при подключении клиента (и создании интерфейса 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


???
Спасибо сказали:
svip
Сообщения: 9
ОС: ubuntu 7.10

Re: алгоритм шейпера tc htb

Сообщение svip »

Сделал полный шейпер на занрузку и выгрузку. Работает как часы. Кому нужно пользуйтесь

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

#!/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 не решить данный вопрос?? Люди помогите.
Спасибо сказали:
svip
Сообщения: 9
ОС: ubuntu 7.10

Re: алгоритм шейпера tc htb

Сообщение svip »

пересобрал ядро с IMQ и новый iptables c поддержкой IMQ. вроде все работает. перенаправил все ppp1-ppp200 (входящие пакеты) c помощью iptables на imq0 а исходящие на imq1.

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

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



НО скорость выгрузки всегда в два раза меньше заданной, а скорость загрузки плавает прилично.

Специалисты подскажите в чем может быть проблема?
Спасибо сказали:
Ответить