AlKov Опубликовано 10 ноября, 2008 · Жалоба Раздаю (продаю) Интернет по указанной схеме (см. рис). У вышестоящего прова покупаю полосу 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 и резать их крайне нежелательно.. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
disappointed Опубликовано 10 ноября, 2008 · Жалоба В вашем случае нужно заворачивать входящий трафик из интернет на ifb девайс, после чего вешать на него необходимую конструкцию классов. В классы загонять основываясь на том на какой ip приходит трафик (на ifb это будет match ip dst), нужно будет минимум 3 реальных адреса чтобы классифицировать однозначно какой группе адресован трафик. Ваши серые сетки соответственно натить на эти три разных адреса. Пример нужен? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 11 ноября, 2008 · Жалоба В вашем случае нужно заворачивать входящий трафик из интернет на ifb девайс, после чего вешать на него необходимую конструкцию классов.В классы загонять основываясь на том на какой ip приходит трафик (на ifb это будет match ip dst), нужно будет минимум 3 реальных адреса чтобы классифицировать однозначно какой группе адресован трафик. Ваши серые сетки соответственно натить на эти три разных адреса. Три реал IP найду. Собственно два уже есть - на eth0 и eth1 уже есть, ну и на em0 соотв. тоже. А вот в принцип, как разрулить пока что-то никак не врубаюсь.. :(Пример нужен?Да не отказался бы. ;) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
DiM_TauRus Опубликовано 11 ноября, 2008 (изменено) · Жалоба А как сочетаются mpd + ng_car на NASе, на котором по вашим словам происходит шейпинг индивидуальный, с iptables + tc ? Я так и не понял - где все же у вас пользователь шейпится ? Не ясен смысл выноса НАСа на машину с ФРЕй. Почему бы в вашем случае не сделать его на роутере пограничном ? Так проще будет. и трафик прямее ходить станет. Изменено 11 ноября, 2008 пользователем DiM_TauRus Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 11 ноября, 2008 · Жалоба А как сочетаются 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.. На фряхе все красиво, удобно и надежно без всяких костылей. Ну прям как на циске! ;) Вот поэтому и такие "извраты" на первый взгляд. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
mikevlz Опубликовано 11 ноября, 2008 · Жалоба а зачем тогда еще один шейп на линухе? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 11 ноября, 2008 · Жалоба а зачем тогда еще один шейп на линухе? ...Т.о. встала задача сделать приоритеты на каждый тип тп. путем "нарезки" 2М канала на три неравных полосы и завернуть трафик каждого "типа" в соотв. полосу. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
mikevlz Опубликовано 12 ноября, 2008 · Жалоба dummynet/queue на выходном интерфейсе с фри. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 12 ноября, 2008 · Жалоба dummynet/queue на выходном интерфейсе с фри.А вот этого не надо! (с) "Бриллиантовая рука" :)Во-первых, те кто это реализовывал, не советуют, а во-вторых очень слабо представляю эту "связку", т.к. с фрей мало работал.. :( Хотелось бы все же на линухе.. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
DiM_TauRus Опубликовано 12 ноября, 2008 · Жалоба Собственно я как раз сам и ест сторонник ФРИ, но не хотел насильно раскручивать вариант с ней )) " dummynet/queue на выходном интерфейсе с фри. " собственно так бы и сделал в вашем случае. У меня практически аналогичная есть машинка с старенькой Фрей, есть нарезка нескольких полос + индивидуальный шейпинг на нг интерфейсах. Почитайте man ipfw -там в принципе достаточно примеров и описания для составления своего шейпера. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 14 ноября, 2008 · Жалоба disappointed, жду примерчик. Очень!! ;) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 30 ноября, 2008 · Жалоба Собственно я как раз сам и ест сторонник ФРИ, но не хотел насильно раскручивать вариант с ней ))" dummynet/queue на выходном интерфейсе с фри. " собственно так бы и сделал в вашем случае. У меня практически аналогичная есть машинка с старенькой Фрей, есть нарезка нескольких полос + индивидуальный шейпинг на нг интерфейсах. Почитайте man ipfw -там в принципе достаточно примеров и описания для составления своего шейпера. А может поделитесь своим примерчиком? А то вот disappointed только надразнил и пропал ;) Туго у меня с пониманием ipfw после iptables... :( Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 1 декабря, 2008 · Жалоба #!/usr/bin/perl # LLC "Delta Telesystems" 2007 use strict; .... skip.. Ух ты! Сколько буков! :DСпасибо! Начинаю вкуривать под себя. Попытаюсь обойтись без доп. вопросов (но не уверен ;) ) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 3 декабря, 2008 · Жалоба disappointed, не смог без вопросов.. ;) 1. а как сделать "сброс" всему этому? Ну типа "выключить". Написать еще скрипт, где вместо add будет del? Или как-то попроще можно? Хочу побаловаться, покрутить, а машинка боевая, поэтому надо очень быстрый "переключатель", чтобы народ надолго без инета не оставлять. 2. каким образом убедиться, что оно работает? tc show dev ifb1? А что именно должно быть увидено? 3. будет ли вообще работать эта конструкция, учитывая тО, что IP "серые" (172.16.ХХХ.ХХХ)? Будут ли вообще попадать в фильтр эти IP? NAT здесь не помешает? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
disappointed Опубликовано 4 декабря, 2008 · Жалоба 1. Убить всю конструкцию tc qdisc del dev ifb1 root 2. Вот вам консольная графическая рисовалка работы всего этого http://spec.oborona.net/pus/data/11406810691763766834.txt (аргумент = ifb девайс) 3. Вся классификация происходит по адресам назначения входящего трафика на _внешнем_ фейсе в интернет. Там натом и не пахнет. Я поэтому и подчеркнул что без нескольких реальников вы не сможете сделать то что хотите. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 5 декабря, 2008 · Жалоба 1. Убить всю конструкцию tc qdisc del dev ifb1 root2. Вот вам консольная графическая рисовалка работы всего этого http://spec.oborona.net/pus/data/11406810691763766834.txt (аргумент = ifb девайс) 3. Вся классификация происходит по адресам назначения входящего трафика на _внешнем_ фейсе в интернет. Там натом и не пахнет. Я поэтому и подчеркнул что без нескольких реальников вы не сможете сделать то что хотите. А я этот момент как-то упустил.. Вернее недопонял.. :( Сейчас еще раз перечитал первый пост и вроде как дошлО. :)Но на всякий случай все же спрошу, так ли я понимаю, что мне потребуется добавить пару "белых" IP на интерфейс, смотрящий в "мир" (алиасами, наверное) и НАТ-ить на каждый соответственно VPN подсети? Тогда непонятно, как "завернуть" на ifb1 три интерфейса (eth0, eth0:1 и eth0:2)?? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
disappointed Опубликовано 5 декабря, 2008 (изменено) · Жалоба как "завернуть" на ifb1 три интерфейса (eth0, eth0:1 и eth0:2)Интерфейс физический только первый, дальше вы указали просто алиасы. Заворачивайте только eth0, у вас весь трафик будет там, включая тот что на алиасы. И натье на эти белые адреса ваши группы серых. Изменено 5 декабря, 2008 пользователем disappointed Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 6 декабря, 2008 · Жалоба Заворачивайте только 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. Не получится тут "заварушки"?? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
nuclearcat Опубликовано 6 декабря, 2008 · Жалоба eth0:1 - не ФИЗИЧЕСКИЙ интерфейс не стоит его использовать в iptables это тот же самый eth0 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 6 декабря, 2008 · Жалоба 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"?? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
disappointed Опубликовано 6 декабря, 2008 (изменено) · Жалоба Скорее всего это RTNETLINK answers: No such file or directoryследствие этогоsystem("/sbin/tc qdisc del dev ifb1 root"); которого нет. Что есть нормально само по себе. вьюер то нормально все классы и прохождение трафика рисует? На classid 1:16 prio не указали. Кстати имейте ввиду очень сильно влияет на класс несмотря на rate. Лучше расставить по классам точно и подбирать вручную. Изменено 6 декабря, 2008 пользователем disappointed Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 6 декабря, 2008 (изменено) · Жалоба Скорее всего это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 не требуется описывать? Изменено 6 декабря, 2008 пользователем AlKov Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
disappointed Опубликовано 6 декабря, 2008 · Жалоба default не требуется описывать? Да конечно. У вас же весь остальной трафик будет безконтрольно проходить, или там более ничего нет? 3072KbitВас ровно так рейтлимитят? уменьшайте на 5% у себя если часто цепляете потолок. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AlKov Опубликовано 7 декабря, 2008 · Жалоба 3072KbitВас ровно так рейтлимитят? уменьшайте на 5% у себя если часто цепляете потолок. Подрезал. На 4%, на 5% рука не поднялась - жалко байтиков, а вдруг не дропнут "сверху".. ;)Распилил полосу на 3 части, разглядываю результат. Пока, тьфу-тьфу-тьфу, вроде все путем. :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
disappointed Опубликовано 9 декабря, 2008 · Жалоба Подрезал. На 4%, на 5% рука не поднялась - жалко байтиков, а вдруг не дропнут "сверху".. ;) У вас всё равно будут короткие выбросы входящего трафика, нечего там жалеть, важно под дроп не попасть. С этого запаса будет видна огромная разница в отработке приоритетов при "полке". Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...