"Что это и зачем нужно?"

width-patch - "примочка" к встроенному в linux kernel файрволу, обеспечивающая дополнительные функции:

1. Проверку, превышает ли текущее количество запущеных процессов заданное число (numrun match)
2. Проверку, превышает ли нагрузка на канал заданное число (width match)
3. Изменение (в меньшую сторону) TCP window проходящих пакетов.

"Ну и зачем?"

Создавалось это произведение хэкерского искуства :) для решения вполне конкретных задач:

1. "Мягкий" shaping. Сочетание 2 и 3 фич позволяет ограничивать нагрузку на канал до заданной величины. При этом не жрется память и CPU (сложность обработки пакета не зависит от интенсивности трафика, в отличие от всех остальных алгоритмов шейпинга).
2. Throttling - ограничение нагрузки на процессор. Фича номер 1 определяет, насколько нагружен сервер в данный момент, и в зависимости от этого можно производить некоторые действия: приостанавливать доступ к сервису сетевому (DROP), перенаправлять данные на другой сервер: приостанавливать активность сервиса (задав окно размера 0 через target TCPWIN).

Однако, по ходу использования придумываются и другие предназначения, например, выделить офису лимит 300 кб в минуту, что вполне достаточно для серфинга, но не позволяет йузерам обнаглеть и начать качать музыку или порно. Использование данного решения здесь намного удобнее, чем обычное, недискретное, ограничение ширины канала.

Установка системы.

Для установки необходимы исходники iptables, patch-o-matic (то и другое - на netfilter.org) и исходники ядра.

1. Файлы width-patch из width.tar.gz копируются в подкаталог extra каталога, куда развернут match-o-matic.
2. Запускается ./runme --batch extra/width.patch. Ядро должно пропатчится.
3. В программе конфигурации ядра (make menuconfig) включаются опции
a. Code maturity options -> prompt for development and/or incomplete code/drivers
b. Networking options -> IP netfilter configuration -> bandwidth match support
c. Networking options -> IP netfilter configuration -> numrun match support
d. Networking options -> IP netfilter configuration -> TCPWIN target support
4. Ядро компилируется и устанавливается

Теперь нужно сделать iptables, поддерживающие управление новым ядром. Для этого содержимое каталога extensions из width.tar.gz копируется в одноименный каталог с исходниками iptables. Iptables собираются и устанавливаются.

"И как пользоваться?"

1. match numrun имеет всего один параметр: --num

Выполняется, когда количество "running" процессов превысит значение этого параметра

2. match width

--divisor - интервал, в течение которого значение счетчика обнуляется (на самом деле оно не обнуляется, там чуток более сложный алгоритм, кому интересно - добро пожаловать в исходники). единицы интервала - jiffies. Если у вас обычный intel, то 1 секунда - это 100 jiffies. Дефолтовое значение параметра - 1 сек, так что, если вы не знаете, скольким jiffies соответствует одна секунда - посмотрите дефолтовое значение :)

--bytes - собственно количество байт, при котором матч выполняется.

3. TCPWIN target - один параметр: --set-win

Target работает только для TCP-протокола, что нужно явно указать в настройках правила через -p TCP. У проходящих TCP-пакетов значение window уменьшается до значения, заданного значением параметра. Если значение окна меньше значения параметра, то пакет не изменяется


"А у меня нифига не пашет, не ставится, етц"

Так и задумано! :) Пиши на alienhard@mail.ru, не стесняйся.