Jump to content

Recommended Posts

Posted (edited)

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

 

Реализована простейшая схема: один IP на класс обслуживания с фиксированной полосой пропускания. В качестве источника данных может быть использована любая SQL-база, поддерживаемая Perl DBI. Для классификации трафика используются наиболее оптимальные методы: фильтр flow в связке с ipset или хэширующие фильтры u32 (по выбору). Для u32 реализованы шейпинг и полисинг. Загрузка и синхронизация правил для тысяч IP-адресов происходит за секунды благодаря использованию пакетных режимов tc и ipset.

 

Страница проекта на Sourceforge: http://sourceforge.net/projects/sc-tool/

Зеркало проекта на Bitbucket: http://bitbucket.org/sky/sc/src

Edited by photon
  • Replies 573
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

  • 7 months later...
Posted

sub is_ip
{
        my $ip = shift;

        if ($ip =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/ixms) {
                if ($1 >  0 && $1 <  255 && $2 >= 0 && $2 <= 255 &&
                        $3 >= 0 && $3 <= 255 && $4 >= 0 && $4 <  255) {
                        return $ip;
                }
        }
        return 0;
}

 

проверка некорректная. предполагается, что 4й октет не достигает значения 255, однако в общем случае это может произойти (например, при клиентской маске /23 - 172.16.0.255/23 вполне нормальный адрес хоста).

под убунтой hardy не запускается -

"GetOptionsFromArray" is not exported by the Getopt::Long module
Can't continue after import errors at /usr/local/sbin/sc line 6
BEGIN failed--compilation aborted at /usr/local/sbin/sc line 6.

все пакеты установлены, как сказано в README.

 

 

Posted

а если нужно однозначно определять classid по всем 4м октетам ip-адреса?

Максимальное число классов -- 0xFFFF, а IP-адресов -- 0xFFFFFFFF, поэтому взаимно-однозначного соответствия не получится. Для частного случая можно придумать какие-то фильтры с арифметическими операциями: http://forum.nag.ru/forum/index.php?showto...st&p=428578 . С другой стороны, с помощью фильтра u32 можно строить вложенные хэши по 256 записей и тоже покрыть необходимые адреса.

Posted (edited)

Уважаемый photon, вы пробовали sch_flow под нагрузкой? Производительность сопоставима с хэшфильтрами?

Производительность flow немного лучше (не в разы, softirq снизилось процентов на 10 в пиках). С другой стороны, использование u32 hf позволяет обойтись без ipset и iptables для блокирования должников, т.к. трафик можно дропать с помощью filter policies в дочерних фильтрах. На этом тоже можно сэкономить, но с такой конфигурацией я не сравнивал. Наверное в скрипте стоит реализовать оба варианта: flow и u32 hashing filters, чтобы можно было выбирать.

Edited by photon
Posted

фильтры то может и покроешь, а вот как быть конкретно с tc class id? ведь их больше чем 0xFFFF не сделаешь, хоть какими операциями

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

Posted (edited)

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

Edited by photon
Posted

Имеет, очень часто встречаются конфигурации сетей вроде таких:

 

85.x.x.x/20

и

172.24.x.x/16

 

и тех и других надо шейпить, аксесить и т.д.

 

Posted

85.x.x.x/20 и 172.24.x.x/16

Ну это потому что люди не перешли полностью на белые адреса, и таким образом сами себе создали проблему. Один только NAT чего стоит. Но, наверное, все сети с этого начинают, поэтому смысл действительно есть.

Posted

Ну а если 2 и более диапазона белых адресов? например 85.x.x.x/20 и 89.x.x.x/19 и еще в придачу 213.x.x.x/19

 

в наше время не IPподсети по оборудование подстараивают, а наоборот.

Posted

Вообщем возможность "генератор вложенных хэширующих фильтров, чтобы можно было классифицировать нескольких подсетей по /16" была бы крайне полезной.

Posted (edited)

Ну, само вычисление classid, ключей и номеров хэш-фильтров и генератор правил получаются, почему бы нет. Но я иногда сталкиваюсь со странным багом в tc. После массового создания вложенных хэш-фильтров и пары-тройки классов, команда tc class show dev eth0 иногда начинает показывать какой-то мусор: кучу классов со случайными id и значениями скоростей, которые я явно не создавал. Причем, это на новых версиях tc и ядра. Надо по этому поводу багрепорт настрочить.

Edited by photon
Posted

а я вот думаю распилить скажем 10.0.0.0/8 на 255 ifb по /16 маске и там уже понавешать классов, а фильтр завернуть через flow map, дабы потом скриптом только классы добавлять-удалять, а filter даже не трогать

Posted (edited)
Может баг с отображением или классы реально создаются?
Оказывается, это я забыл, что в crontab был настроен автозапуск синхронизации правил с базой. (:

Скрипт почти готов, скоро выложу. Классифицировать теперь можно из нескольких подсетей с одинаковыми двумя последними октетами, но классов все равно не должно быть более ffff. Кстати, я также реализовал схему "несколько IP на один класс", но для этого надо явно указывать либо сам classid, либо IP-адрес, из которого он будет вычислен.

Edited by photon

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.