Jump to content
Калькуляторы

Проблема с выравниванием трафика и установкой приоритетов.. Подскажите, как разрулить?

Раздаю (продаю) Интернет по указанной схеме (см. рис). У вышестоящего прова покупаю полосу 2 Мбит. Вкратце работает так: юзер авторизуется на NAS-е (radius+mpd+ng_car), получает "серый" IP, который в дальнейшем натится в Инет на Linux роутере. Индивидуальный шейпинг организован на том же NAS-е. Здесь проблем нет. Существует три типа тарифных планов - помегабайтный и два "подтипа" безлимитных. Первый - "нормальный" анлим (в плане соотношения цена/скорость) и один "соцпакет" - дешевый низкоскоростной (очень "низко.."). Вот из-за наличия этого последнего ТП возникла общеизвестная проблема - загрузка полосы пользователями этого тп (до 30%) и соотв. снижение качества сервиса на др. тп. Т.о. встала задача сделать приоритеты на каждый тип тп. путем "нарезки" 2М канала на три неравных полосы и завернуть трафик каждого "типа" в соотв. полосу. На рутере каждый из трех типов тп. различается только номером подсети. Например, "пометровщики" - 172.16.0.0/16, "широкий анлим" - 172.17.0.0/16 и "соцпакет" - 172.18.0.0/16.

Принцип реализации вроде бы понятен - маркируем в iptables пакеты соотв. подсетей и "раскладываем" их по соотв. подготовленным "классам" tc. А вот как сиё реализовать на конкретной схеме, увы - полный туман.. :( На какой/какие конкретно интерфейсы "навешивать" очереди?? Есть подозрение, что в данной схеме реализовать желаемое (конкретно на linux роутере) вообще невозможно. Если это так, то что и как необходимо изменить?

И второе - по причине того, что провайдер "режет" мне полосу рейт-лимитом, вылезла еще одна проблема - заметные потери при средней загрузке полосы около 70%. Отсюда хотелось бы еще решить задачу с "выравниванием" входящего от провайдера трафа. Навскидку это вроде как реализуемо той же tc на eth1, но тут другая загвоздка - как выделить в отдельную полосу на eth1 трафик от провайдера? Дело в том, что на NAS-е кроме собственно сервера доступа работают другие сервисы (WEB,MySQL, etc..), которые также доступны через IP на eth1 и резать их крайне нежелательно..

sheet.JPG

Share this post


Link to post
Share on other sites

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

В классы загонять основываясь на том на какой ip приходит трафик (на ifb это будет match ip dst), нужно будет минимум 3 реальных адреса чтобы классифицировать однозначно какой группе адресован трафик. Ваши серые сетки соответственно натить на эти три разных адреса.

 

Пример нужен?

Share this post


Link to post
Share on other sites
В вашем случае нужно заворачивать входящий трафик из интернет на ifb девайс, после чего вешать на него необходимую конструкцию классов.

В классы загонять основываясь на том на какой ip приходит трафик (на ifb это будет match ip dst), нужно будет минимум 3 реальных адреса чтобы классифицировать однозначно какой группе адресован трафик. Ваши серые сетки соответственно натить на эти три разных адреса.

Три реал IP найду. Собственно два уже есть - на eth0 и eth1 уже есть, ну и на em0 соотв. тоже. А вот в принцип, как разрулить пока что-то никак не врубаюсь.. :(
Пример нужен?
Да не отказался бы. ;)

Share this post


Link to post
Share on other sites

А как сочетаются mpd + ng_car на NASе, на котором по вашим словам происходит шейпинг индивидуальный, с iptables + tc ?

 

Я так и не понял - где все же у вас пользователь шейпится ?

 

Не ясен смысл выноса НАСа на машину с ФРЕй. Почему бы в вашем случае не сделать его на роутере пограничном ? Так проще будет. и трафик прямее ходить станет.

Edited by DiM_TauRus

Share this post


Link to post
Share on other sites
А как сочетаются mpd + ng_car на NASе, на котором по вашим словам происходит шейпинг индивидуальный, с iptables + tc ?
Да никак не сочетаются.. На НАС-е фря, которая про iptables и tc и не слыхивала :)
Я так и не понял - где все же у вас пользователь шейпится ?

 

Не ясен смысл выноса НАСа на машину с ФРЕй. Почему бы в вашем случае не сделать его на роутере пограничном ? Так проще будет. и трафик прямее ходить станет.

Пользователь шейпится индивидуально на НАС-е. Во время авторизации радиус посылает mpd пары такого вот вида
mpd-limit +="in#1=all shape 256000 16000 pass", mpd-limit +="out#1=all shape 256000 16000 pass"

Эти пары "вешаются" на нг_кар интерфейс, создаваемый для каждого юзера и все жужжит прям как пчелка :)

На роутере было-бы конечно логичнее, но.. Было оно уже там - не понравилось. Приходилось писать костыль на bash+php для загрузки/выгрузки кучи правил tc и iptables.. На фряхе все красиво, удобно и надежно без всяких костылей. Ну прям как на циске! ;)

Вот поэтому и такие "извраты" на первый взгляд.

Share this post


Link to post
Share on other sites
а зачем тогда еще один шейп на линухе?
...Т.о. встала задача сделать приоритеты на каждый тип тп. путем "нарезки" 2М канала на три неравных полосы и завернуть трафик каждого "типа" в соотв. полосу.

Share this post


Link to post
Share on other sites
dummynet/queue на выходном интерфейсе с фри.
А вот этого не надо! (с) "Бриллиантовая рука" :)

Во-первых, те кто это реализовывал, не советуют, а во-вторых очень слабо представляю эту "связку", т.к. с фрей мало работал.. :( Хотелось бы все же на линухе..

Share this post


Link to post
Share on other sites

Собственно я как раз сам и ест сторонник ФРИ, но не хотел насильно раскручивать вариант с ней ))

"

dummynet/queue на выходном интерфейсе с фри.

"

собственно так бы и сделал в вашем случае. У меня практически аналогичная есть машинка с старенькой Фрей, есть нарезка нескольких полос + индивидуальный шейпинг на нг интерфейсах. Почитайте man ipfw -там в принципе достаточно примеров и описания для составления своего шейпера.

Share this post


Link to post
Share on other sites
disappointed, жду примерчик. Очень!! ;)

Share this post


Link to post
Share on other sites
Собственно я как раз сам и ест сторонник ФРИ, но не хотел насильно раскручивать вариант с ней ))

"

dummynet/queue на выходном интерфейсе с фри.

"

собственно так бы и сделал в вашем случае. У меня практически аналогичная есть машинка с старенькой Фрей, есть нарезка нескольких полос + индивидуальный шейпинг на нг интерфейсах. Почитайте man ipfw -там в принципе достаточно примеров и описания для составления своего шейпера.

А может поделитесь своим примерчиком? А то вот disappointed только надразнил и пропал ;)

Туго у меня с пониманием ipfw после iptables... :(

Share this post


Link to post
Share on other sites
#!/usr/bin/perl

 

# LLC "Delta Telesystems" 2007

 

use strict;

 

.... skip..

Ух ты! Сколько буков! :D

Спасибо! Начинаю вкуривать под себя. Попытаюсь обойтись без доп. вопросов (но не уверен ;) )

 

Share this post


Link to post
Share on other sites

disappointed, не смог без вопросов.. ;)

1. а как сделать "сброс" всему этому? Ну типа "выключить". Написать еще скрипт, где вместо add будет del? Или как-то попроще можно? Хочу побаловаться, покрутить, а машинка боевая, поэтому надо очень быстрый "переключатель", чтобы народ надолго без инета не оставлять.

2. каким образом убедиться, что оно работает? tc show dev ifb1? А что именно должно быть увидено?

3. будет ли вообще работать эта конструкция, учитывая тО, что IP "серые" (172.16.ХХХ.ХХХ)? Будут ли вообще попадать в фильтр эти IP? NAT здесь не помешает?

 

Share this post


Link to post
Share on other sites

1. Убить всю конструкцию tc qdisc del dev ifb1 root

2. Вот вам консольная графическая рисовалка работы всего этого http://spec.oborona.net/pus/data/11406810691763766834.txt (аргумент = ifb девайс)

3. Вся классификация происходит по адресам назначения входящего трафика на _внешнем_ фейсе в интернет. Там натом и не пахнет.

Я поэтому и подчеркнул что без нескольких реальников вы не сможете сделать то что хотите.

Share this post


Link to post
Share on other sites
1. Убить всю конструкцию tc qdisc del dev ifb1 root

2. Вот вам консольная графическая рисовалка работы всего этого http://spec.oborona.net/pus/data/11406810691763766834.txt (аргумент = ifb девайс)

3. Вся классификация происходит по адресам назначения входящего трафика на _внешнем_ фейсе в интернет. Там натом и не пахнет.

Я поэтому и подчеркнул что без нескольких реальников вы не сможете сделать то что хотите.

А я этот момент как-то упустил.. Вернее недопонял.. :( Сейчас еще раз перечитал первый пост и вроде как дошлО. :)

Но на всякий случай все же спрошу, так ли я понимаю, что мне потребуется добавить пару "белых" IP на интерфейс, смотрящий в "мир" (алиасами, наверное) и НАТ-ить на каждый соответственно VPN подсети? Тогда непонятно, как "завернуть" на ifb1 три интерфейса (eth0, eth0:1 и eth0:2)??

 

Share this post


Link to post
Share on other sites
как "завернуть" на ifb1 три интерфейса (eth0, eth0:1 и eth0:2)
Интерфейс физический только первый, дальше вы указали просто алиасы.

 

Заворачивайте только eth0, у вас весь трафик будет там, включая тот что на алиасы.

И натье на эти белые адреса ваши группы серых.

 

 

Edited by disappointed

Share this post


Link to post
Share on other sites
Заворачивайте только eth0, у вас весь трафик будет там, включая тот что на алиасы.

И натье на эти белые адреса ваши группы серых.

Вот тут еще один вопрос возник - по поводу НАТ-а и роутинга. Дело в том, что у меня не SNAT, а MASQUERADING, который НАТ-ить может только по интерфейсу
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth0 -j MASQUERADE

На eth0 "висит" белый IP/30, по нему мой пров маршрутизирует еще одну маленькую подсеть /29. Вот из этой /29 я и прицепил на eth0:1, дефолтный шлюз роутера из подсети /30. Отсюда еще два вопроса:

1. будут ли работать корректно такие конструкции

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o eth0:1 -j MASQUERADE

Или лучше переделать на SNAT?

2. будет ли корректно маршрутизироваться трафик второй "конструкции", учитывая то, что дефолтный шлюз из /30, а IP этой "конструкции" (на eth0:1) из подсети /29? К тому же на eth1 и em0 IP из той же самой /29. Не получится тут "заварушки"??

Share this post


Link to post
Share on other sites

eth0:1 - не ФИЗИЧЕСКИЙ интерфейс

не стоит его использовать в iptables

это тот же самый eth0

Share this post


Link to post
Share on other sites
eth0:1 - не ФИЗИЧЕСКИЙ интерфейс

не стоит его использовать в iptables

это тот же самый eth0

Ну тут вопрос интересный - не нашел нигде, что iptables работает только с физическим интерфейсом. Но рисковать не стал, сделал SNAT (тем более, что дока iptables утверждает, что SNAT меньше грузит проц, нежели MASQUERADE). Вообщем, тут все прошло без проблем. С роутингом тоже вроде все нормально и скрипт вроде как работает, но при старте на что-то матюгается вот таким матюком
RTNETLINK answers: No such file or directory
Action 4 device ifb1 ifindex 99

Не могу понять, где.. Какой файл ядро не находит? Синтаксических ошибок вроде как нет. На всякий случай выложу "свой" вариант скрипта

#!/usr/bin/perl

use strict;

my $bw = 3.072;
my $gw1 = "XXX.XXX.XXX.XXX";
my $gw2 = "YYY.YYY.YYY.YYY";

system("ip link set dev ifb1 up");
system("ifconfig ifb1 up");

## Redirect traffic from uplink to ifb
system("/sbin/tc qdisc del dev eth0 ingress");
system("/sbin/tc qdisc add dev eth0 ingress");
system("/sbin/tc filter add dev eth0 parent ffff: protocol ip prio 10 u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb1");


# UPLINK INGRESS
system("/sbin/tc qdisc del dev ifb1 root");
system("/sbin/tc qdisc add dev ifb1 root handle 1: htb default 2000");
system("/sbin/tc class add dev ifb1 parent 1: classid 1:10 htb rate ".$bw."Mbit");


##
##
## metered clients, and VERY HIGH PRORITY services, games etc :)
system("/sbin/tc class add dev ifb1 parent 1:10 classid 1:15 htb rate ".$bw * 0.65."Mbit ceil ".$bw."Mbit prio 0");
system("/sbin/tc qdisc add dev ifb1 parent 1:15 handle 15: sfq perturb 10");
system("/sbin/tc filter add dev ifb1 parent 1:0 protocol ip prio 40 u32 match ip protocol 1 0xff flowid 1:15");
system("/sbin/tc filter add dev ifb1 parent 1:0 protocol ip prio 40 u32 match ip protocol 47 0xff flowid 1:15");
system("/sbin/tc filter add dev ifb1 parent 1:0 protocol ip prio 40 u32 match ip sport 53 0xffff flowid 1:15");
system("/sbin/tc filter add dev ifb1 parent 1:0 protocol ip prio 50 u32 match ip dst ".$gw1." flowid 1:15");
##
##
## unlimited clients, and MIDDLE PRORITY services
system("/sbin/tc class add dev ifb1 parent 1:10 classid 1:16 htb rate ".$bw * 0.30."Mbit ceil ".$bw."Mbit");
#
system("/sbin/tc qdisc add dev ifb1 parent 1:16 handle 16: sfq perturb 10");
system("/sbin/tc filter add dev ifb1 parent 1:0 protocol ip prio 60 u32 match ip dst ".$gw2." flowid 1:16");
## Other traffic (VERY LOW PRORITY)
system("/sbin/tc class add dev ifb1 parent 1:10 classid 1:100 htb rate ".$bw * 0.05."Mbit ceil ".$bw."Mbit prio 3");
system("/sbin/tc qdisc add dev ifb1 parent 1:100 handle 100: sfq perturb 10");
system("/sbin/tc filter add dev ifb1 parent 1:0 protocol ip prio 90 u32 match ip dst 0.0.0.0/0 flowid 1:100");

Что тут может быть не так?? Может матюгается из-за отсутствия описания "default"??

Share this post


Link to post
Share on other sites

Скорее всего это

RTNETLINK answers: No such file or directory
следствие этого

system("/sbin/tc qdisc del dev ifb1 root");

которого нет. Что есть нормально само по себе.

 

вьюер то нормально все классы и прохождение трафика рисует?

 

На classid 1:16 prio не указали. Кстати имейте ввиду очень сильно влияет на класс несмотря на rate. Лучше расставить по классам точно и подбирать вручную.

 

Edited by disappointed

Share this post


Link to post
Share on other sites
Скорее всего это
RTNETLINK answers: No such file or directory
следствие этого

system("/sbin/tc qdisc del dev ifb1 root");

которого нет. Что есть нормально само по себе.

Ага, так оно и есть. Закомментировал строку и все стало путём. Вообщем-то я уже об этом и сам догадался, но были сомнения. ;)
вьюер то нормально все классы и прохождение трафика рисует?
Судя по всему, что правильно. Вот "скриншот"

   Сбт Дек  6 22:02:50 2008

        Mode: HTB        ^C to QUIT


1:10                 <   3072Kbit -   3072Kbit >   2082.5 kbit/s  (331pps)
    1:100                <  153592bit -   3072Kbit >      0.0 kbit/s  (  0pps)
    1:15                 <   1997Kbit -   3072Kbit >   1739.8 kbit/s  (265pps)
    1:16                 <  921600bit -   3072Kbit >    342.8 kbit/s  ( 66pps)

Спасибо за скрипт, да и еще раз за помощь!

На classid 1:16 prio не указали. Кстати имейте ввиду очень сильно влияет на класс несмотря на rate. Лучше расставить по классам точно и подбирать вручную.
Зевнул.. :( Я убрал из вашего скрипта "детенышей" (16А и 16С), а про "родителя" и забыл. Вернее даже сказать - не заметил.. Поставил "1" сейчас.

Ну и вопрос уж тогда насчет prio - а каким образом подбирать приоритеты? На что обращать внимание?

И еще - а default не требуется описывать?

Edited by AlKov

Share this post


Link to post
Share on other sites
default не требуется описывать?

Да конечно. У вас же весь остальной трафик будет безконтрольно проходить, или там более ничего нет?

 

3072Kbit
Вас ровно так рейтлимитят? уменьшайте на 5% у себя если часто цепляете потолок.

 

 

Share this post


Link to post
Share on other sites
3072Kbit
Вас ровно так рейтлимитят? уменьшайте на 5% у себя если часто цепляете потолок.

Подрезал. На 4%, на 5% рука не поднялась - жалко байтиков, а вдруг не дропнут "сверху".. ;)

Распилил полосу на 3 части, разглядываю результат. Пока, тьфу-тьфу-тьфу, вроде все путем. :)

Share this post


Link to post
Share on other sites
Подрезал. На 4%, на 5% рука не поднялась - жалко байтиков, а вдруг не дропнут "сверху".. ;)

У вас всё равно будут короткие выбросы входящего трафика, нечего там жалеть, важно под дроп не попасть.

С этого запаса будет видна огромная разница в отработке приоритетов при "полке".

 

 

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this