URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 55645
[ Назад ]

Исходное сообщение
"трафик шэйпер на Linux"

Отправлено Denis , 18-Апр-05 12:18 
Есть маршрутизатор на Линуксе с 3 интерфейсами. 1 интерфейс - зарубежный канал, 2 интерфейс - местный трафик, 3 интерфейс - клиентская сеть.
Клиенты 2 типов - 1- отстой 2 - не отстой.
Необходимо сделать так, чтобы клиенты получали не больше 32К зарубежного канала, если они в категории 1 и 64К если в котегории 2 соответственно.

Спасибо.


Содержание

Сообщения в этом обсуждении
"трафик шэйпер на Linux"
Отправлено Quarc , 18-Апр-05 15:40 
>Есть маршрутизатор на Линуксе с 3 интерфейсами. 1 интерфейс - зарубежный канал,
>2 интерфейс - местный трафик, 3 интерфейс - клиентская сеть.
>Клиенты 2 типов - 1- отстой 2 - не отстой.
>Необходимо сделать так, чтобы клиенты получали не больше 32К зарубежного канала, если
>они в категории 1 и 64К если в котегории 2 соответственно.
>
>
>Спасибо.

http://www.opennet.me/base/net/adv_route_qos.txt.html
http://www.opennet.me/base/net/adsl_bandwidth_management.txt...
http://www.opennet.me/base/net/htb_saga.txt.html
http://www.opennet.me/base/net/linux_traffic_qos.txt.html


"трафик шэйпер на Linux"
Отправлено Denis , 18-Апр-05 15:49 
Спасибо. Все это прочитано. Не претендую на звание "самый тупой на этом форуме", но материал достаточно сложен и поэтому, если Вас не затруднит, не могли бы помочь с реализацией.
iproute2 установлен. с iptables работал. Может есть экзамплы ?

Спасибо.


"трафик шэйпер на Linux"
Отправлено jonatan , 18-Апр-05 16:10 
А клиенты выходят в Инет не через VPN (pptp и т.п.)?

"трафик шэйпер на Linux"
Отправлено Denis , 18-Апр-05 16:29 
>А клиенты выходят в Инет не через VPN (pptp и т.п.)?


НЕт.


"трафик шэйпер на Linux"
Отправлено jonatan , 18-Апр-05 17:08 
Если нужно ограничить полосу отдельным хостам из подсети, то я пока не вижу способа, кроме как прописывать для каждого из них qdisc/class/filter. Хорошо бы это реализовать, как в squid.

acl local_net1 src 192.168.1.0/255.255.255.0
delay_pools 1
delay_class 1 2
delay_access 1 allow local_net1
delay_access 1 deny all
delay_parameters 1 -1/-1 4000/4000

т.е. подсеть 192.168.1.0/24 не ограничивается по полосе, но каждый хост получит не более 4Кбайт/сек.
Может у кого есть идеи, как тоже самое реализовать через HTB, CBQ и т.п.?


"трафик шэйпер на Linux"
Отправлено Z0termaNN , 18-Апр-05 16:17 
>Спасибо. Все это прочитано. Не претендую на звание "самый тупой на этом
>форуме", но материал достаточно сложен и поэтому, если Вас не затруднит,
>не могли бы помочь с реализацией.
>iproute2 установлен. с iptables работал. Может есть экзамплы ?
>
>
>Спасибо.

если совсем очень сложно, то не мучайся - бери iptables --limit и режь
трафик, как твоей душе угодно


"трафик шэйпер на Linux"
Отправлено Denis , 18-Апр-05 17:27 
Я так понял тема иссякла. Мне необходимо грамотное решение. Обьем трафика около 150 Мегабит.сек.

"трафик шэйпер на Linux"
Отправлено Асен Тотин , 19-Апр-05 01:06 
Привет,

Грамотное решение - tc. Читайте www.lartc.org. На каждого клиента - свои классы для международного и национального трафика, это не так страшно как кажеться.

Три ступени шейпера:

1. Создаем класс определнной полосы пропускания.
2. Определяем дисциплину очереди (queueing discipline, qdisc)
3. Создаен филтры, по которым данный трафик направляется в нш класс (например, по destination ip)

Идеи над чем подумать:

1. Можно построить шейпер одного уровня, а можно иерархически. Во втором случае вы ставите "общий" класс на Х Mbps международного трафика, а по прошествии через этот клас трафик отправляется по юзерским класса. Преимущество - сами себя ограничиваете.

2. Применяйте HTB вместо CBQ - работает лучше и с управлением проще.

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

WWell,


"трафик шэйпер на Linux"
Отправлено Denis , 19-Апр-05 10:57 
>Привет,
>
>Грамотное решение - tc. Читайте www.lartc.org. На каждого клиента - свои классы
>для международного и национального трафика, это не так страшно как кажеться.
>
>
>Три ступени шейпера:
>
>1. Создаем класс определнной полосы пропускания.
>2. Определяем дисциплину очереди (queueing discipline, qdisc)
>3. Создаен филтры, по которым данный трафик направляется в нш класс (например,
>по destination ip)
>
>Идеи над чем подумать:
>
>1. Можно построить шейпер одного уровня, а можно иерархически. Во втором случае
>вы ставите "общий" класс на Х Mbps международного трафика, а по
>прошествии через этот клас трафик отправляется по юзерским класса. Преимущество -
>сами себя ограничиваете.
>
>2. Применяйте HTB вместо CBQ - работает лучше и с управлением проще.
>
>
>3. В клиентских классах применяйте всега pfifo вместо sfq - это сэокономит
>вам системных ресурсов, а также позволит выставить очереди разной глубины для
>разных классов.
>
>WWell,

Спасибо.
Насколько я понял - это должно выглядеть примерно так:

$TC qdisc add dev $DEVB root handle 1: htb default 30

$TC class add dev $DEVB parent 1: classid 1:1 htb rate 10mbit ceil 10mbit burst 15k
$TC class add dev $DEVB parent 1:1 classid 1:10 htb rate 512kbit ceil 512kbit  burst 15k
$TC class add dev $DEVB parent 1:1 classid 1:20 htb rate 256kbit ceil 256kbit  burst 15k

$TC qdisc add dev $DEVB parent 1:10  sfq perturb 10
$TC qdisc add dev $DEVB parent 1:20  sfq perturb 10

$iptables -A FORWARD -t mangle  -d 192.168.15.128/20 -j MARK --set-mark 20
$tc filter add dev $DEVB protocol ip parent 1:0 prio 2 handle 20 fw classid 1:20

и т.д

Я близок?

Спасибо еще раз.


"трафик шэйпер на Linux"
Отправлено Z0termaNN , 19-Апр-05 11:16 
ну в общем дэвять-десять,
только для начала поставь вместо sfq pfifo 10.

"трафик шэйпер на Linux"
Отправлено Асен Тотин , 19-Апр-05 12:47 
Привет,

>Я близок?

Да, выглядит весьма работающим.

Учтите, что маркеры для fw затрачивают немало CPU и памяти, так как сведения о маркировке хранятся в памяти машины, а не в заголовках пакетов. Возможно, вам будет удобнее маркировать трафик по входящему интерфейсу (DSCP маркер), а затем фильтровать по этому маркеру.

Еще, при классах с большой полосой пропускания установленый tc по умолчанию параметр quantum размером в MTU (т.е. 1500 байтов) является слишком малым и tc будет ворчать - лучше прописать что-то типа "tc class... quantum 15000".

WWell,


"трафик шэйпер на Linux"
Отправлено Denis , 20-Апр-05 10:33 
>Привет,
>
>>Я близок?
>
>Да, выглядит весьма работающим.
>
>Учтите, что маркеры для fw затрачивают немало CPU и памяти, так как
>сведения о маркировке хранятся в памяти машины, а не в заголовках
>пакетов. Возможно, вам будет удобнее маркировать трафик по входящему интерфейсу (DSCP
>маркер), а затем фильтровать по этому маркеру.
>
>Еще, при классах с большой полосой пропускания установленый tc по умолчанию параметр
>quantum размером в MTU (т.е. 1500 байтов) является слишком малым и
>tc будет ворчать - лучше прописать что-то типа "tc class... quantum
>15000".
>
>WWell,
Честное слово - на Линукс с Фрее пересел неделю назад. тяжко дается.
Насколько понял. Я должен отмаркировать местный трафик (есть список местных сетей) iptables -t mangle -A FORWARD -d 159.148.0.0/16 -j MARK --set-mark 20
и т.д
Потом отмаркировать зарубеж. iptables -t mangle -A FORWARD -m mark --mark 20 -j MARK --set-mark 30  (Это местный трафик)
iptables -t mangle -A FORWARD -m mark ! --mark 20 -j MARK --set-mark 40 (Это зарубеж)

Теперь мне нужна Ваша помощь. Мне нужно ограничить как входящий - так и исходящий трафик. Насколько я это понимаю, я могу это сделать повесив фильтр на входящий и исходящий интерфейс. Я прав? подправьте пожалуйста если нет.

По поводу маркеров трафика. Пока не попадалась информация о прожорливости этого процесса. Я предполагал маркировать трафик на зарубеж используя интерфейс на котором висят клиенты. Или мы говорим про разные вещи?

Спасибо.


"трафик шэйпер на Linux"
Отправлено Denis , 20-Апр-05 10:35 
>>Привет,
>>
>>>Я близок?
>>
>>Да, выглядит весьма работающим.
>>
>>Учтите, что маркеры для fw затрачивают немало CPU и памяти, так как
>>сведения о маркировке хранятся в памяти машины, а не в заголовках
>>пакетов. Возможно, вам будет удобнее маркировать трафик по входящему интерфейсу (DSCP
>>маркер), а затем фильтровать по этому маркеру.
>>
>>Еще, при классах с большой полосой пропускания установленый tc по умолчанию параметр
>>quantum размером в MTU (т.е. 1500 байтов) является слишком малым и
>>tc будет ворчать - лучше прописать что-то типа "tc class... quantum
>>15000".
>>
>>WWell,
>Честное слово - на Линукс с Фрее пересел неделю назад. тяжко дается.
>
>Насколько понял. Я должен отмаркировать местный трафик (есть список местных сетей) iptables
>-t mangle -A FORWARD -d 159.148.0.0/16 -j MARK --set-mark 20
>и т.д
>Потом отмаркировать зарубеж. iptables -t mangle -A FORWARD -m mark --mark 20
>-j MARK --set-mark 30  (Это местный трафик)
>iptables -t mangle -A FORWARD -m mark ! --mark 20 -j MARK
>--set-mark 40 (Это зарубеж)
>
>Теперь мне нужна Ваша помощь. Мне нужно ограничить как входящий - так
>и исходящий трафик. Насколько я это понимаю, я могу это сделать
>повесив фильтр на входящий и исходящий интерфейс. Я прав? подправьте пожалуйста
>если нет.
>
>По поводу маркеров трафика. Пока не попадалась информация о прожорливости этого процесса.
>Я предполагал маркировать трафик на зарубеж используя интерфейс на котором висят
>клиенты. Или мы говорим про разные вещи?
>
>Спасибо.

iptables -t mangle -A FORWARD -m mark ! --mark 30 -j MARK --set-mark 40 (Это зарубеж)
Опечатался - вот так правильно.


"трафик шэйпер на Linux"
Отправлено Z0termaNN , 20-Апр-05 11:55 
вообще-то исходящим трафиком управлять не в пример проще чем входящим в
силу отсутствия буфера пакетов у последнего. В случае входящего трафика
возможно только отбрасывание пакетов или их буферизация на промежуточном
устройстве с последующим решением как с ними поступить, но принципиальной
разницы нет, так как пакет в любом случае принимается и занимает полосу, и
только после приема с ним производятся какие-либо манипуляции. для tcp
такой подход в силу алгоритма slow start очень даже вполне, но результаты
для udp и icmp будут сильно зависить от приложения, которое генерирует эти
пакеты.
в любом случае у тебя есть 4 способа:
1. iptables --limit
2. tc ingress
3. буферизация на промежуточном устройстве - imq (подразумевает патч на ядро и iptables),
4. управление на исходящем интерфейсе в локальную сеть.

"трафик шэйпер на Linux"
Отправлено Z0termaNN , 20-Апр-05 12:01 
у тебя достаточно простой случай, маркировать здесь вообще смысла нет,
классифицируй сразу же

tc filter add dev $IF parent 1:0 protocol ip prio 1 \
u32 match ip src 159.148.0.0/15 flowid 1:10

например


"трафик шэйпер на Linux"
Отправлено Denis , 20-Апр-05 12:12 
>у тебя достаточно простой случай, маркировать здесь вообще смысла нет,
>классифицируй сразу же
>
>tc filter add dev $IF parent 1:0 protocol ip prio 1 \
>
>u32 match ip src 159.148.0.0/15 flowid 1:10
>
>например


совсем не простой. У меня есть 16 сетей класса С, 3 интерфейса на пограничном маршрутезаторе. (см. выше) Клиенты делятся на ВИП и не ВИП.
Незарубежных сетей штук 100. заводить на каждую сетку отдельно правило мне кажется неверным решением.

Может не затруднит собрать все в кучу то что мы здесь написали?
Буду весьма признателен.


"трафик шэйпер на Linux"
Отправлено Z0termaNN , 20-Апр-05 12:50 
в любом случае тебе нужно будет классифицировать все эти сети, не важно
каким образом, при помощи iptables или tc filter, количество правил от
этого не изменится.
Опять-таки есть 2 варианта
1. Маркировка внутри линуксового ip стека (то бишь setmark),
2. Маркировка глобальная (например dscp).
преимущество второго способа вполне очевидны, т.к. он позволит значительно
проще опознавать классы пакетов на других компьютерах.

Поэтому давай прежде чем все собирать с кучей давай определимся с
классификацией пакетов (как и что классифицировать).



"трафик шэйпер на Linux"
Отправлено Denis , 20-Апр-05 13:04 
Так как про DSCP mark я впервые услышал в этой дискуссии, мне сложно определяться :)
Либо я беру таймаут на ознакомление, либо придется мне разжевать :)
Второе предпочтительнее по следующим причинам: 1. Я очень ленивый 2. тема хорошая и судя по Вашей отзывчивости она интересна не только мне.


"трафик шэйпер на Linux"
Отправлено Z0termaNN , 22-Апр-05 15:15 
>Так как про DSCP mark я впервые услышал в этой дискуссии, мне
>сложно определяться :)
>Либо я беру таймаут на ознакомление, либо придется мне разжевать :)
>Второе предпочтительнее по следующим причинам: 1. Я очень ленивый 2. тема хорошая
>и судя по Вашей отзывчивости она интересна не только мне.


я бы все таки прочитал rfc, т.к. коротоко изложить все 4 rfc врядли
получится. В общем ситуация следующая - dscp это замена поля tos в
заголовках ip пакетов (6 байт + 2 оставшихся байта ECN, которые напрямую
к dscp не относятся). На основе значения поля dscp обычно строятся классы
сервисов и определяются их характеристики (как то задержка, приоритет,
вероятность отбрасывания пакетов и пр.) как внутри сети, так и между
сетями.


"трафик шэйпер на Linux"
Отправлено Z0termaNN , 19-Апр-05 09:23 
>Я так понял тема иссякла. Мне необходимо грамотное решение. Обьем трафика около
>150 Мегабит.сек.

ну так вполне нормальное решение, какая тебе разница чем трафик режется
iptables или tc ? результат тот же самый.


"трафик шэйпер на Linux"
Отправлено Асен Тотин , 19-Апр-05 12:38 
Привет,

>ну так вполне нормальное решение, какая тебе разница чем трафик режется
>iptables или tc ? результат тот же самый.

Бред полнейший. iptables лимитирует кол-во _пакетов_ са единицу времени, несмотря на их размер. Построить приличный шейпинг на толяко на iptables невозможно - читайте man-ы.

WWell,


"трафик шэйпер на Linux"
Отправлено Z0termaNN , 20-Апр-05 11:45 
>Привет,
>
>>ну так вполне нормальное решение, какая тебе разница чем трафик режется
>>iptables или tc ? результат тот же самый.
>
>Бред полнейший. iptables лимитирует кол-во _пакетов_ са единицу времени, несмотря на их

а то я не знал

>размер. Построить приличный шейпинг на толяко на iptables невозможно -

еще как строится, если ты думаешь, что тот же htb не завязан на средний
размер пакета, то категорически заблуждаешься, кроме того при малых
скоростях и latency ядра в 10ms у него точность очень сильно гуляет.
а при скорости 150mbit вообще результат с iptables будет вполне удовлетвнотельный.

читайте
>man-ы.
>
>WWell,



"трафик шэйпер на Linux"
Отправлено Асен Тотин , 20-Апр-05 12:19 
Привет,

Калпя теории: опознавать пакеты можно разными способами. Два из них:
1. Манипулировать TOS байт заголовки пакета (header).
2. Вести регистр пакетор и их маркировки в самой машине (пока пакет не вышел из нее).

Преимущество первого подхода: маркировка остается и "на потом", т.е. после того, как пакет ушел и за машины (можно пользоваться таким маркированным пакетом и на других машинах); к тому же, не тратиться память под регистр пакетов на самом сервере.

К примеру, у меня международный трафик носит класс af21 (DSCP 0x48), национальный - af22 (DSCP 0x50) и т.д. Наложив такие маркеры на входе сети, затем можно управлять пакетами в любом ее сегменте. Пакеты можно маркировать под Linux через

/sbin/iptables -t mangle -I FORWARD -j DSCP --set-dscp-class af21

и затем классифицировать в tc примерно так:

/sbin/tc filter add dev eth0.1024 parent 1:0 protocol ip prio 7 u32 match ip tos 0x50 0xff flowid 2:1

WWell,


"трафик шэйпер на Linux"
Отправлено deep_admin , 22-Апр-05 09:51 
>Привет,
>
>Калпя теории: опознавать пакеты можно разными способами. Два из них:
>1. Манипулировать TOS байт заголовки пакета (header).
>2. Вести регистр пакетор и их маркировки в самой машине (пока пакет
>не вышел из нее).
>
>Преимущество первого подхода: маркировка остается и "на потом", т.е. после того, как
>пакет ушел и за машины (можно пользоваться таким маркированным пакетом и
>на других машинах); к тому же, не тратиться память под регистр
>пакетов на самом сервере.
>
>К примеру, у меня международный трафик носит класс af21 (DSCP 0x48), национальный
>- af22 (DSCP 0x50) и т.д. Наложив такие маркеры на входе
>сети, затем можно управлять пакетами в любом ее сегменте. Пакеты можно
>маркировать под Linux через
>
>/sbin/iptables -t mangle -I FORWARD -j DSCP --set-dscp-class af21
>
>и затем классифицировать в tc примерно так:
>
>/sbin/tc filter add dev eth0.1024 parent 1:0 protocol ip prio 7 u32
>match ip tos 0x50 0xff flowid 2:1

Ну если на входящий к юзеру трафик можно положить dscp на пограничном роутере, основываясь на интерфейсе который смотрит в соответствующую сеть, то как уважаемыей будет маркировать исходящий от клиента трафик?



"трафик шэйпер на Linux"
Отправлено Асен Тотин , 22-Апр-05 10:49 
Привет,

>Ну если на входящий к юзеру трафик можно положить dscp на пограничном
>роутере, основываясь на интерфейсе который смотрит в соответствующую сеть, то как
>уважаемыей будет маркировать исходящий от клиента трафик?

Сложнее, на первом от юзера интерфейсе. Хотя мне лично приходиться шейпить лишь исходящий международный трафик, но не исходящий национальный... так что вопрос решаеться легко - на исходящем интерфейсе международного роутера стоят шейперы для отдельных клиентов, даже и без маркировки трафика...

WWell,



"трафик шэйпер на Linux"
Отправлено denn , 20-Апр-05 13:20 
>Есть маршрутизатор на Линуксе с 3 интерфейсами. 1 интерфейс - зарубежный канал,
>2 интерфейс - местный трафик, 3 интерфейс - клиентская сеть.
>Клиенты 2 типов - 1- отстой 2 - не отстой.
>Необходимо сделать так, чтобы клиенты получали не больше 32К зарубежного канала, если
>они в категории 1 и 64К если в котегории 2 соответственно.
>
>
>Спасибо.

http://www.phantom.atknet.ru/externals/cbq.html