Перейти к содержимому
Калькуляторы

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

Раздаю (продаю) Интернет по указанной схеме (см. рис). У вышестоящего прова покупаю полосу 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

Изменено пользователем DiM_TauRus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как сочетаются 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.. На фряхе все красиво, удобно и надежно без всяких костылей. Ну прям как на циске! ;)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а зачем тогда еще один шейп на линухе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

"

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

"

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

disappointed, жду примерчик. Очень!! ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

"

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

"

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#!/usr/bin/perl

 

# LLC "Delta Telesystems" 2007

 

use strict;

 

.... skip..

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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)??

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

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

 

 

Изменено пользователем disappointed

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Заворачивайте только 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. Не получится тут "заварушки"??

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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"??

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

 

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

 

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

 

Изменено пользователем disappointed

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Скорее всего это
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 не требуется описывать?

Изменено пользователем AlKov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.