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

sc: скрипт для управления Linux-шейпером

ждем поддержку prio и ceil. Хотел прикрутить сам, но perl мне чужд.

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

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


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

ждем поддержку prio и ceil. Хотел прикрутить сам, но perl мне чужд.

prio нужно не для шейпинга, а для разных типов трафика (в зависимости от значения DSCP и номера порта). Я уже где-то выше говорил, что это надо делать на отдельной машине. Поддержку ceil достаточно легко сделать с помощью некоторого глобального коэффициента, на который домножаются rate, но не в виде еще одной записи в базе данных. Кстати, я думаю, что базу лучше делать так: таблица должна иметь вид IP*, id тарифа (* -- первичный ключ). Само описание тарифов задано либо в виде отдельной SQL-таблицы (id*, download rate, upload rate, ceil), либо в текстовой форме в sc.conf. Иначе в базе будет храниться много избыточной информации.

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

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


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

prio при шейпинге не нужно

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

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

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


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

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

А, ну если так, то prio тоже нужно. Но тогда prio тоже должно быть одним из полей таблицы с описанием тарифа. Если и делать prio и ceil, то сразу с таблицей для тарифов. Это довольно глобальное изменение, смогу этим заняться месяца через два.
Изменено пользователем photon

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


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

Пытаюсь разобраться в синтаксисе правил, которые генерит sc.

 

"... mask 0x000000ff at 12 link 204:" - это кусок фильтра при инициализации.

 

204 это как бы номер подсети класса С ? В моём случае, я в конфиге указал две подсети /20 и /19.

 

Что означает "at 12" ? На другом интерфейсе этот параметр равен 16.

 

Ещё нашёл вот такую программу на С: http://vcalinus.gemenii.ro/?p=9

 

Там почему-то независимо от интерфейса at 12 генерится.

 

 

 

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


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

Пытаюсь разобраться в синтаксисе правил, которые генерит sc.

 

"... mask 0x000000ff at 12 link 204:" - это кусок фильтра при инициализации.

 

204 это как бы номер подсети класса С ? В моём случае, я в конфиге указал две подсети /20 и /19.

Нет, это номер хэш-фильтра следующего уровня вложенности для хэширования по последнему байту.

 

Что означает "at 12" ? На другом интерфейсе этот параметр равен 16.
Означает чтение двойного слова по смещению 12 и 16. Это source и destination IP. Если интерфейс шейпит исходящий от юзера трафик, то классификация делается по IP источника, если входящий к юзеру, то по IP назначения.

 

Ещё нашёл вот такую программу на С: http://vcalinus.gemenii.ro/?p=9

 

Там почему-то независимо от интерфейса at 12 генерится.

Видимо, потому что она не рассчитана на решение реальных задач.
Изменено пользователем photon

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


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

Пытаюсь разобраться в синтаксисе правил, которые генерит sc.

 

"... mask 0x000000ff at 12 link 204:" - это кусок фильтра при инициализации.

 

204 это как бы номер подсети класса С ? В моём случае, я в конфиге указал две подсети /20 и /19.

Нет, это номер хэш-фильтра следующего уровня вложенности для хэширования по последнему байту.

 

Что означает "at 12" ? На другом интерфейсе этот параметр равен 16.
Означает чтение двойного слова по смещению 12 и 16. Это source и destination IP. Если интерфейс шейпит исходящий от юзера трафик, то классификация делается по IP источника, если входящий к юзеру, то по IP назначения.

 

Ещё нашёл вот такую программу на С: http://vcalinus.gemenii.ro/?p=9

 

Там почему-то независимо от интерфейса at 12 генерится.

Видимо, потому что она не рассчитана на решение реальных задач.

Это я при запуске ошибся. 12 или 16 там будет в зависимости от указания параметра src/dst. С месяц назад знакомый использовал эту прогу для генерации фильтров, говорит, что всё клёво стало :-).

 

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


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

Думаю, что в будущем стоит выделить код для генерации хэш-фильтров по списку подсетей в отдельный модуль и выложить на СPAN.

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

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


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

Ещё столкнулся с такой проблемой:

 

filter replace dev eth1 parent 1: pref 20 handle 200:9 u32 ht 200:9: match ip src 192.168.0.9 flowid 1:1000 - такое правило работает, в тоже время

 

filter replace dev eth1 parent 1: pref 20 handle 200:0 u32 ht 200:0: match ip src 192.168.0.0 flowid 1:1000 - не работает из-за "handle 200:0". Можно не указывать handle - правило добавляется, но работаетили нет пока не могу проверить.

 

В prefixtree.c параметр handle вообще не используется, т.е. где посмотреть, зачем нужен handle и почему он именно такой вид имеет, я не знаю.

 

Скажите, зачем нужен handle ? Почему он имеет такой же вид как ht (номер hash table видимо) ? Как лучше поступить с адресами *.0 ?

 

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


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

Из мана:

 

      add    Add a qdisc, class or filter to a node. For all entities, a parent must be passed, either
             by passing its ID or by attaching directly to the root of  a  device.   When  creating  a
             qdisc  or  a filter, it can be named with the handle parameter. A class is named with the
             classid parameter.

      remove A qdisc can be removed by specifying its handle, which may also be 'root'. All subclasses
             and their leaf qdiscs are automatically deleted, as well as any filters attached to them.

Т.е. handle это такая "ручка", за которую можно взять и удалить именно этот фильтр ? Т.е. просто как название или идентификатор используется и других функций этот параметр не выполняет ?

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


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

Да, это некий идентификатор, по которому осуществляется изменение/удаление фильтра. handle в моих правилах равен ht:key. Я уже не помню, будет ли работать, если выбирать handle по-другому.

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

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


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

Да, это некий идентификатор, по которому осуществляется изменение/удаление фильтра. handle в моих правилах равен ht:key для упрощения вычислений.

У меня не получается делать handle по схеме ht:key для адресов , которые заканчиваются на ноль, т.е. tc не даёт добавить фильтр с ht:0, с другими цифрами в конце даёт, но в огранчиенном диапазоне - ht:ff добавить ещё можно, а ht:101 уже нельзя.

 

Т.е. проблема как бы не в том, что мне нужен handle - добавить можно и без указания handle, проблема в удалении именно этого правила - не удаляется без явного указания handle, даже если удалять в точности так же как добавлял (re[lace -> del). Допустимый синтаксис handle я никгде пока не нашёл. Правила с другими handle добавляются и удаляются по handle номрально.

 

Не подскажете, что делать с адресами, которые заканчиваются на ноль ?

 

Пока я просто не добавляю такие адреса в фильтры. Не знаю, хорошо это или нет :-). Вдруг кто-то догадается заюзать такой адрес, придётся говорить ему, что "нельзя использовать адрес подсети" :-).

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


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

Пока я просто не добавляю такие адреса в фильтры. Не знаю, хорошо это или нет :-). Вдруг кто-то догадается заюзать такой адрес, придётся говорить ему, что "нельзя использовать адрес подсети" :-).

handle тоже не может иметь младший байт больше ff, поэтому придется в скрипте ввести запрет на добавление IP с нулевым последним октетом.

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

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


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

Давно юзаю нулевые адреса, нужно указывать handle как ht:key:800, где 800 ID таблицы для входа в хэш, которая указывается как ht 800:: при создании.

 

Вот мой рабочий пример:

filter replace dev eth0 protocol ip parent 1:0 prio 5 handle 21:00:800 u32 ht 21:00: match ip dst x.x.x.0 classid 1:328
filter replace dev eth1 protocol ip parent 1:0 prio 5 handle 21:00:800 u32 ht 21:00: match ip src x.x.x.0 classid 1:328

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

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


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

Спасибо, учту. Вот ведь бред с этими фильтрами u32: не документировано ничего, приходится наобум делать.

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

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


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

Да, тоже методом тыка нашел. Пробовал и потом смотрел как оно потом отображает этот handle. Документация реально очень отстает :( Подсистема очень важная а доков кот наплакал.

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


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

Сделал багфикс-релиз 1.3.2 по этому поводу.

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


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

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

 

А в целом, очень удачный проект получился.

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


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

Я планирую сделать отдельные модули для генераторов правил (flow.pm и u32.pm), т.к. скрипт уже содержит более 2000 строк кода. Наверное, было бы неплохо еще и поддержку ipfw/dummynet добавить, для полноты картины.

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

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


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

Подскажите, как грамотно внести изменения в программу, чтоб можно было вешать на каждого юзера htb, для приоритезации трафика.

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


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

Подскажите, как грамотно внести изменения в программу, чтоб можно было вешать на каждого юзера htb, для приоритезации трафика.

Это вы зря :) Читайте тут уже были похожие вопросы.

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


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

Я полагаю, что шейпер по возможности лучше делать в виде простого моста, на чистом tc, чтобы не связываться с iptables и его проблемами с блокировками. А всевозможные Netflow и NAT делать на других машинах. В принципе, потом можно будет придумать какую-то опцию для совместного использования u32 и ipset, но сейчас главное получить правильно работающую функцию, которая отображает IP-адреса из указанных сетей на пространства классов и фильтров.

Если честно не очень понял в результате прочтения всего треда, так есть возможность запуска на мосту или нет, а если есть то что настраивается в качестве внутреннего и внешнего интерфейса.

 

Заранне спасибо, ЧихПых.

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


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

Если честно не очень понял в результате прочтения всего треда, так есть возможность запуска на мосту или нет, а если есть то что настраивается в качестве внутреннего и внешнего интерфейса.

 

Заранне спасибо, ЧихПых.

Конечно можно, я его так и использую. QoS-подсистема оперирует очередями, которые привязаны к сетевому устройству и не имеют отношения к IP-адресам. Внутренним называется интерфейс, который смотрит в вашу сеть, где находятся те, кого надо шейпить.
Изменено пользователем photon

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


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

Если честно не очень понял в результате прочтения всего треда, так есть возможность запуска на мосту или нет, а если есть то что настраивается в качестве внутреннего и внешнего интерфейса.

 

Заранне спасибо, ЧихПых.

Конечно можно, я его так и использую. QoS-подсистема оперирует очередями, которые привязаны к сетевому устройству и не имеют отношения к IP-адресам. Внутренним называется интерфейс, который смотрит в вашу сеть, где находятся те, кого надо шейпить.

Ну с этим разобрался, в случае симметричного шейпера собсно совершенно фиолетово какой интерфейс ин какой аут.

Теперь ещё несколько вопросиков на предмет HOWTO.

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

2. Есть ли возможность добавлять не отдельными адресами а сетками, так как некоторые юрики, бывает, пользуют небольшие сеточки на 8-16 адресов.

Просто в мане на сей счёт ничего не сказано.

3. Можно ли выполнять параллельно вызовы нескольких экземпляров sc ?

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

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


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

Ну с этим разобрался, в случае симметричного шейпера собсно совершенно фиолетово какой интерфейс ин какой аут.

Теперь ещё несколько вопросиков на предмет HOWTO.

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

Лучше этого не делать, т.к. придется хранить в базе двусвязный список вместо простого. А с ним работать намного сложнее.

 

2. Есть ли возможность добавлять не отдельными адресами а сетками, так как некоторые юрики, бывает, пользуют небольшие сеточки на 8-16 адресов.

Просто в мане на сей счёт ничего не сказано.

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

 

3. Можно ли выполнять параллельно вызовы нескольких экземпляров sc ?
Зависит от нескольких факторов: от хранилища и реализации доступа к нему в Perl DBI, от того, можно ли запускать одновременно несколько экземпляров tc. Например, в случае PostgreSQL это возможно, а в случае SQLite тупо блокируется файл, и вся база становится недоступна для записи. Насчет нескольких tc, которые будут одновременно создавать правила, я сомневаюсь. Да и смысла в этом немного, и так правила достаточно быстро создаются.
Изменено пользователем photon

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


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

Join the conversation

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

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

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

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

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

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

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