Собственно, нарисовался такой вопрос...
Есть ситуация:
Тариф "Помегабайтный 5000 мегабайт", стоит к примеру 500р.
Абонент подключил этот тариф и подключил на него дополнительные учетные записи (ip-группы). К примеру, 3 (3 компьютера у него).
Он платит 500р в месяц и имеет 5000 мегабайт, которые учитывются со ВСЕХ 3 IP-групп.
Есть второй тариф - "Безлимитный 5000 килобит/с" тоже за 500р.
Если сделать автоматический перевод на этот тариф, то абонент платя 500р в месяц будет иметь 5000 кбит/с на КАЖДУЮ ip-группу.
Приходится заставлять их приходить в офис по этому поводу и писать заяву, а потом вручную удалять IP-группы и создавать для каждой отдельный тариф. В результате, абонент или платит 1500 за три тарифа, либо оставляет себе 1 IP-группу за 500р. Ну, или ставит себе роутер.
Суть вопроса такова, как сделать общую полосу на всю услугу, чтобы независимо от количества ip-групп, общая скорость не была больше заданной.
-----
Первая мысль была - IPFW, но там ограничение на кол-во таблиц (128), потом побумал про pf, в принципе на нем это можно сделать, но при большом количестве таблиц не помогут даже anchors, и он начнет сильно проседать..
Вот, интересно, может кто сталкивался с подобной задачей и успешно ее решил?
Заранее спасибо!
Общая полоса на услугу с несколькими IP группами.
-
- Сообщения: 309
- Зарегистрирован: Сб апр 16, 2005 11:44
Можно сделать двумя таблицами на ipfw. Как вы, наверно, помните, у таблиц в ipfw есть хитрая штука - аргументы. Так вот, закрепите на трубу (pipe) очередь (queue), сделайте очередь динамическую с маской, и номер очереди прицепите в таблице к IP адресу как аргумент. Это трафик в одну сторону. В другую труба другая и очередь у нее своя, и номер очереди соответственно другой. Поэтому второе соответствие хранится во второй таблице. А после того queue tablearg all from table\(1\) to any out в нужном месте и всё работает на ура (в обратную сторону так же, только номер таблицы другой). Очереди поделят скорость из трубы поровну на все активные адреса, и вся группа выше установленной скорости безлимита уже не прыгнет, даже если будет качать изо всех сил.
Вот только номер трубы придется хранить в правилах фаервола в биллинге. Иначе никак, то есть заводить группу и сажать туда этого одного пользователя с тремя-четырьмя адресами и в правила открыть-закрыть писать его персональную трубу. Все равно заморочка.
Вот только номер трубы придется хранить в правилах фаервола в биллинге. Иначе никак, то есть заводить группу и сажать туда этого одного пользователя с тремя-четырьмя адресами и в правила открыть-закрыть писать его персональную трубу. Все равно заморочка.
-
- Сообщения: 309
- Зарегистрирован: Сб апр 16, 2005 11:44
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
В одной таблице не должно быть повторяющихся адресов с разными аргументами. В первой таблице должен быть адрес с одним аргументом, во второй - тот же адрес с другим аргументом. Иначе логика сломается.
Кроме того, не надо гонять по очередям пакеты со статусом in, а лучше поймать их на другом интерфейсе, где они будут out. Маску лучше все единицы поставить. В остальном все правильно.
Кроме того, не надо гонять по очередям пакеты со статусом in, а лучше поймать их на другом интерфейсе, где они будут out. Маску лучше все единицы поставить. В остальном все правильно.
-
- Сообщения: 309
- Зарегистрирован: Сб апр 16, 2005 11:44
-
- Сообщения: 7
- Зарегистрирован: Чт авг 14, 2008 10:13