Патч, позволяющий строить правила во FreeBSD IPFW2 для ограничения трафика с использованием счётчиков файрвола Патч состоит из двух частей: * ipfw_bound.patch - добавляет две опции к IPFW2 - bound и check-bound. - bound VALUE, где VALUE - это число, указывающее границу в байтах для счётчика правила, после превышения которой, правило не будет работать. Число байт можно задавать используя суффиксы K, M, G (соответсвенно, Кило-, Мега-, Гигабайт). Утилита /sbin/ipfw по-умолчанию выводит величину bound с применением суффиксов, там где это возможно. Такое поведение можно отменить, указав в параметрах коммандной строки ключ -H. Пример использования: # ipfw add 100 allow ip from any to any bound 10K # ipfw add 200 deny ip from any to any В данном примере, сотое правило будет срабатывать до тех пор, пока его байтовый счётчик не превысит величину в 10 КБайт. После превышения правило начнёт пропускаться. - check-bound NUM, где NUM - это номер правила, содержащего ограничение bound. При просмотре правил файрвол будет проверять, не превышает ли счётчик правила NUM величину его ограничения bound. Примечание: правило NUM должно находиться после правила с check-bound. Для уменьшения времени поиска желательно, чтобы правило с check-bound находилось как можно ближе к правилу bound. Пример: # ipfw add 100 allow ip from A.B.C.D to any out xmit internet check-bound 200 # ipfw add 200 allow ip from any to A.B.C.D in recv internet bound 100M # ipfw add 300 deny ip from any to any via internet В данном примере, правила 100 и 200 будут работать пока пользователь с адреса A.B.C.D не получит 100 МБайт входящего трафика на интерфейс internet. После получения 100 Мбайт трафика, пользователю будет запрещён доступ как для исходящего так и для входящего трафика. * bound_change.patch - добавляет к IPFW2 управляющий вызов для изменения ограничения bound без сброса счётчиков правила. Предварительно должен быть применён патч ipfw_bound.patch. Синтаксис: # ipfw bound RULE_NUM [set N] change NEW_BOUND RULE_NUM - это номер правила с ограничением bound; N - номер набора правил, по умолчанию используется нулевой набор; NEW_BOUND - новое значение для ограничения. Патч доступен для: * FreeBSD-CURRENT, проверялось 23.05.2005 http://butcher.heavennet.ru/ipfw_bound/CURRENT/ipfw_bound.patch http://butcher.heavennet.ru/ipfw_bound/CURRENT/bound_change.patch * FreeBSD 5.4-STABLE (RELENG_5), проверялось 23.05.2005 http://butcher.heavennet.ru/ipfw_bound/RELENG_5/ipfw_bound.patch http://butcher.heavennet.ru/ipfw_bound/RELENG_5/bound_change.patch * FreeBSD 5.4-RELEASE (RELENG_5_4) http://butcher.heavennet.ru/ipfw_bound/RELENG_5_4/ipfw_bound.patch http://butcher.heavennet.ru/ipfw_bound/RELENG_5_4/bound_change.patch Установка Для установки патча нужно скачать файлы для соответсвующей системы, после чего, стандартная процедура (если исходники вашей системы находятся в /usr/src): # cd /usr/src # patch < /path/to/ipfw_bound.patch # patch < /path/to/bound_change.patch Дальше компиляция. Для bound_change в любом случае требуется перекомпиляция ядра. Для первого, если у вас используется загружаемый модуль ipfw, то достаточно пересобрать его и утилиту ipfw. При сборке утилиты ipfw может понадобиться заменить некоторые заголовочные файлы. Либо при компиляции указать дополнительный каталог для поиска заголовочных файлов: env CFLAGS=-I/usr/src/sys/netinet Изменяемые файлы: sbin/ipfw/ipfw2.c sys/netinet/ip_fw.h sys/netinet/ip_fw2.c sys/netinet/in.h sys/netinet/raw_ip.c PS. Возможно, что патчи для первых двух веток через некоторое время для применения потребуют исправлений, т.к. эти ветки постоянно изменяются. (C) Andrey V. Elsukov, bu7cher[at]yandex.ru