Общая полоса на услугу с несколькими IP группами.

Технические вопросы по UTM 5.0
Ответить
Wishmaster
Сообщения: 309
Зарегистрирован: Сб апр 16, 2005 11:44

Общая полоса на услугу с несколькими IP группами.

Сообщение Wishmaster »

Собственно, нарисовался такой вопрос...

Есть ситуация:

Тариф "Помегабайтный 5000 мегабайт", стоит к примеру 500р.

Абонент подключил этот тариф и подключил на него дополнительные учетные записи (ip-группы). К примеру, 3 (3 компьютера у него).
Он платит 500р в месяц и имеет 5000 мегабайт, которые учитывются со ВСЕХ 3 IP-групп.

Есть второй тариф - "Безлимитный 5000 килобит/с" тоже за 500р.
Если сделать автоматический перевод на этот тариф, то абонент платя 500р в месяц будет иметь 5000 кбит/с на КАЖДУЮ ip-группу.

Приходится заставлять их приходить в офис по этому поводу и писать заяву, а потом вручную удалять IP-группы и создавать для каждой отдельный тариф. В результате, абонент или платит 1500 за три тарифа, либо оставляет себе 1 IP-группу за 500р. Ну, или ставит себе роутер.

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

-----

Первая мысль была - IPFW, но там ограничение на кол-во таблиц (128), потом побумал про pf, в принципе на нем это можно сделать, но при большом количестве таблиц не помогут даже anchors, и он начнет сильно проседать..

Вот, интересно, может кто сталкивался с подобной задачей и успешно ее решил?

Заранее спасибо!

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Можно сделать двумя таблицами на ipfw. Как вы, наверно, помните, у таблиц в ipfw есть хитрая штука - аргументы. Так вот, закрепите на трубу (pipe) очередь (queue), сделайте очередь динамическую с маской, и номер очереди прицепите в таблице к IP адресу как аргумент. Это трафик в одну сторону. В другую труба другая и очередь у нее своя, и номер очереди соответственно другой. Поэтому второе соответствие хранится во второй таблице. А после того queue tablearg all from table\(1\) to any out в нужном месте и всё работает на ура (в обратную сторону так же, только номер таблицы другой). Очереди поделят скорость из трубы поровну на все активные адреса, и вся группа выше установленной скорости безлимита уже не прыгнет, даже если будет качать изо всех сил.

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

Wishmaster
Сообщения: 309
Зарегистрирован: Сб апр 16, 2005 11:44

Сообщение Wishmaster »

JAO писал(а):Можно сделать двумя таблицами на ipfw. Как вы, наверно, помните, у таблиц в ipfw есть хитрая штука - аргументы. Так вот, закрепите на трубу (pipe) очередь (queue), сделайте очередь динамическую с маской, и номер очереди прицепите в таблице к IP адресу как аргумент. Это трафик в одну сторону. В другую труба другая и очередь у нее своя, и номер очереди соответственно другой. Поэтому второе соответствие хранится во второй таблице. А после того queue tablearg all from table\(1\) to any out в нужном месте и всё работает на ура (в обратную сторону так же, только номер таблицы другой). Очереди поделят скорость из трубы поровну на все активные адреса, и вся группа выше установленной скорости безлимита уже не прыгнет, даже если будет качать изо всех сил.

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

Шикарная идея! Огромное спасибо!

Вот, попробовал реализовать, посмотрите пожалуйста, я правильно понял, что вы предложили?

Код: Выделить всё

Клиент 1
#тариф 5000 килобит

192.168.1.20
192.168.1.30
192.168.1.40

Клиент 2
#тариф 7000 килобит

192.168.1.120
192.168.1.130
192.168.1.140

ipfw table 1 add 192.168.1.20 1000
ipfw table 1 add 192.168.1.30 1000
ipfw table 1 add 192.168.1.40 1000
ipfw table 1 add 192.168.1.20 2000
ipfw table 1 add 192.168.1.30 2000
ipfw table 1 add 192.168.1.40 2000

ipfw table 2 add 192.168.1.120 1100
ipfw table 2 add 192.168.1.130 1100
ipfw table 2 add 192.168.1.140 1100
ipfw table 2 add 192.168.1.120 2100
ipfw table 2 add 192.168.1.130 2100
ipfw table 2 add 192.168.1.140 2100

ipfw pipe 10 config bw 5000Kbit/s
ipfw pipe 20 config bw 5000Kbit/s

ipfw pipe 30 config bw 7000Kbit/s
ipfw pipe 40 config bw 7000Kbit/s

#входящий
ipfw queue 1000 config pipe 10 mask src-ip 0x00000000
#исходящий
ipfw queue 1100 config pipe 20 mask dst-ip 0x00000000

#входящий
ipfw queue 2000 config pipe 30 mask src-ip 0x00000000
#исходящий
ipfw queue 2100 config pipe 40 mask dst-ip 0x00000000

ipfw add 100 queue tablearg all from table\(1\) to any via IFACE out 
ipfw add 200 queue tablearg all from any to table\(2\) via IFACE in 

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

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

Кроме того, не надо гонять по очередям пакеты со статусом in, а лучше поймать их на другом интерфейсе, где они будут out. Маску лучше все единицы поставить. В остальном все правильно.

Wishmaster
Сообщения: 309
Зарегистрирован: Сб апр 16, 2005 11:44

Сообщение Wishmaster »

Огромное спасибо! Все работает, то, что нужно!!!

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Всегда пожалуйста.

turchinsky
Сообщения: 7
Зарегистрирован: Чт авг 14, 2008 10:13

Сообщение turchinsky »

а возможно реализовать тот же функционал на циске?

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Не знаю. Единственно что могу посоветовать - это почитать цискину документацию на предмет traffic-shape и rate-limit.

Ответить