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