Andrey V. Elsukov предложил протестироать патч (ftp://ftp.opennet.ru/pub/FreeBSD/ipfw_bound/) для ipfw, позволяющий задавать правила срабатывающие в зависимости от объема трафика прошедшего в соответвсии с определенным правилом.
Патч (ftp://ftp.opennet.ru/pub/FreeBSD/ipfw_bound/) небольшой, и при желании его функциональность может быть легко
расширена. На данный момент патч делает следующие изменения в системе:- в IPFW добавляется новая опция (см. man ipfw: RULE OPTIONS/MATCH
PATTERNS) bound числовое_значение. Правила с этой опцией проходят
дополнительную проверку. Проверка заключается в сравнении байтового
счётчика правила со значением указанном в bound. Если значение счётчика
меньше значения в bound, то правило срабатывает (конечно при этом
делаются все остальные проверки), иначе - пропускается.- необходимые для поддержки выше описанного изменения в утилите
/sbin/ipfw.
Пример использования:ipfw add 100 allow ip from any to hostA in recv internet bound 10000000
ipfw add 200 deny ip from any to any
Здесь hostA - это хост, у которого лимит входящего траффика ~10 MБайт.
Сотое правило перестанет срабатывать когда лимит будет исчерпан. Можно
придумать и более сложные конструкции.
Установка
Патч писался для FreeBSD 5.4-STABLE, т.е. RELENG_5. Исходя из этого
ставим так:
1. Патчим:
# cd /usr/src
# patch < путь/к/патчу2. Чтобы утилиту ipfw можно было скомпилить, нужно заменить один
заголовочный файл:
# cp /usr/src/sys/netinet/ip_fw.h /usr/include/netinet/3. В зависимости от того как у вас сконфигурирована система, нужно
перекомпилировать и установить либо модуль ядра ipfw.ko, либо само ядро.
Так же утилиту ipfw.
# cd /usr/src/sys/modules/ipfw/ && make depend all install
# cd /usr/src/sbin/ipfw/ && make depend all installURL: ftp://ftp.opennet.ru/pub/FreeBSD/ipfw_bound/
Новость: http://www.opennet.me/opennews/art.shtml?num=5427
А как-нить по прошествию времени это ограничение можно снять автоматически? Или придется самому 1-го числа каждого месяца обнулять счетчики?
>А как-нить по прошествию времени это ограничение можно снять автоматически? Или придется
>самому 1-го числа каждого месяца обнулять счетчики?
ipfw zero N по крону ?
спасибо автору за патч, идея интресна.
Хорошо бы переработать, что бы можно было лимиты хранить в table (или общий на всех лимит), в таком случае не будет громоздких правил.
С таблицами сложнее. Для каждого адреса не ведётся отдельного счётчика, счётчик присутсвует только для "действия" (deny, pass, count, ..). Поэтому тут нужны более существенные изменения.
а если байтовый счётчик обнулен например после перезагрузки ? нужно чтоб счетчик сохранялся еще гдето кроме как в правиле ipfw
сохранять периодически состояния счетчиков, а при запуске IPFW брать параметры обратно.
http://ipa-system.sourceforge.net/
Я конечно может немного и не понимаю чего.... Но зачем все эти телодвижения, если можно написать свой скрипт который подсчитывает байты из ipfw по каким хотите правилам (либо на Си написать программулину) и запускать все это дело по крону...
>Я конечно может немного и не понимаю чего.... Но зачем все эти
>телодвижения, если можно написать свой скрипт который подсчитывает байты из
>ipfw по каким хотите правилам (либо на Си написать программулину) и
>запускать все это дело по крону...Это стремление к блокировке в реалтайм.
За миниту юзер сидящий на 100 Мбит может прокачать сверх лимита почти Гиг траифика.
посоветуйте какими будут правила с использванием ограничений скорости при наборе определенного лимита. К примеру у пользвателя 128, после скачки 10G скорость до конца месяца должна быть 64. Как правильнее написать при использовании патча.
>посоветуйте какими будут правила с использванием ограничений скорости при наборе определенного лимита.
>К примеру у пользвателя 128, после скачки 10G скорость до конца
>месяца должна быть 64. Как правильнее написать при использовании патча.я думаю что то вроди
sysctl net.inet.ip.fw.one_pass=1ipfw add #1 pipe #1 ip from any to ip# out bound 10000000000
ipfw pipe #1 config bw 128kbit/s
ipfw add #2 pipe #2 ip from any to ip# out
ipfw pipe #1 config bw 64kbit/sно учити что тут только входящий трафик учитывается...
зы divert,reg,gred,queue по вкусу
IMHO, вместо bound логичнее реализовать что-то вроде lt/le (less then/less or equal), gt/ge (greater then/greater or equal).
И полезно иметь возможность задавать в k,M,G(default_to_pass)
deny all from any to 1.2.3.4 out xmit $iface gt 10G(default_to_deny)
pass all from any to 1.2.3.4 out xmit $iface le 10Gpipe $M config bw 256Kbytes/s
pipe $N config bw 64Kbytes/s
pipe $M all from any to 1.2.3.4 out xmit $iface le 10G
pipe $N all from any to 1.2.3.4 out xmit $iface gt 10G
>IMHO, вместо bound логичнее реализовать что-то вроде lt/le (less then/less or equal),
>gt/ge (greater then/greater or equal).Возможно, но мои задачи пока этого требуют, разве что позднее ;)
>И полезно иметь возможность задавать в k,M,G
Об этом уже думал, но тоже позднее, если будет время.
Первоначальная задача не подразумевала, что добавление удаление правил будет происходить в "ручном" режиме.
попробовал эту штучку .
Хочу сразу сказать что ситема 5.3
Проблема в том что да это правило(ipfw add 100 allow ip from any to hostA in recv internet bound 10000000 ) считает колво пакетов но не пропускает и правила обробатываются дальше, т.е. если я ставлю
ipfw add 200 deny ip from any to any
то в инет я идтить не могу так как 200 правило всегда отрабатывает.
Может я что-то недопонял ?
Может еще надо что-то прикутить?
>Может я что-то недопонял ?
>Может еще надо что-то прикутить?Да, надо разрешить вашему адресу выходить в инет.
Последняя версия патча доступна на http://butcher.heavennet.ru/
Нужен доброволец для перевода этого текста на английский язык.