Модификация и предложения за вами. Единственно, по-моему нет смысла ставить ограничение на маки, поскольку маки для этого нужно знать, во-вторых, при подключении нового компа его нужно прописывать и в конце концов, юзеры не должны сами менять себе айпи. Предложения и улучшения в студию!
Код: Выделить всё
#!/bin/bash
#
# Что Делает: на роутере при превышении траффика вырубает доступ!
# Суть в чем: в таблицу mangle цепочки FORWARD добавляются правило ACCEPT для каждого IP сети
# это делается командой `./tlimiter.sh on` и делается это для того,чтобы траффик каждого IP считался
# с этого момента. Раз в 5 минут я (cronom) запускаю скрипт `./tlimiter.sh limit`. Эта часть скрипта
# проверяет, не превысил ли кто-нить лимит в 200Мб(счетчик работает от 10Мб до 999Мб ТОЧНО верх.предел не проверял)
# Если кто-нибудь превысил лимит, его переадресует на апач(сами можете сделать что угодно, можете даже нах послать,
#такие сайты есть)
##############
##############
# Установка:
# cp ./tlimiter.sh /root/bin/tlimiter.sh
# chmod +x /root/bin/tlimiter.sh
# for crontab:
# crontab crontab
# где cronfab - файл со строками (Добавляете эти строки)
#########################################
#*/5 * * * * /root/bin/tlimiter.sh limit 1>/dev/null 2>&1
#1 1 * * * /root/bin/tlimiter.sh set0 1>/dev/null 2>&1
#########################################
# все
##############
##############
# Автор Алексей Тарасов
#
#iptables v 1.3.3
#bash v 3.00
#grep v 2.5.1
#awk v 3.1.4
ipt="/usr/sbin/iptables"
#путь до айпитейблс
unlim="192.168.5.25 \
192.168.5.131 \
192.168.5.189 \
192.168.5.81 \
192.168.5.229"
#айпи, на которые лимит не распространяется
apach=9999;
# куда я переадресую превысивших лимит (у меня апач на роутере на 9999 порту, а там страница: В превісили лимит!)
case "$1" in
on)
i=1
while [ $i -le 254 ]
do
$ipt -t mangle -A FORWARD -d 192.168.5.$i -j ACCEPT
i=`expr $i + 1`
done
# создаю свою цепочку каждому айпи в сети
for i1 in $unlim;
do
$ipt -t mangle -D FORWARD -d $i1 -j ACCEPT
done
# убираю цепочки для не облагающихся лимитом
# эти 2 цепочки д.б. одинаковы с разницей -D в последней -A в первой
;;
set0)
$ipt -t mangle -Z
i=1
while [ $i -le 254 ]
do
$ipt -t nat -D PREROUTING -s 192.168.5.$i -p tcp --dport 80 -j REDIRECT --to $apach
i=`expr $i + 1`
done
# ночью все таблицы мангл обнуляются и все лимиты сбрасываются
# то же, что в последней секции
;;
off)
i=1
while [ $i -le 254 ]
do
$ipt -t mangle -D FORWARD -d 192.168.5.$i -j ACCEPT
i=`expr $i + 1`
done
# удаляет все контрольные записи
# д,б, той же что и в секции ON
;;
status)
echo "#########################################################################"
echo "########## Таблица Манглы здесь счетчики ########################"
echo "#########################################################################"
$ipt -L -v -n -t mangle |grep 192.168.5|less
#печатает контрольную таблицу
echo "#########################################################################"
echo "########## Таблица Нат здесь переадресация заблоченных ########"
echo "#########################################################################"
$ipt -t nat -L -v -n |grep $apach |less
#печатает проштрафифшихся на данный момент
;;
limit)
####################################################################### HERE LIMIT IN MB ##########
blocked=`$ipt -L -n -v -t mangle |grep 192.168.5 |awk '{if($2~/M$/){gsub(/M/,x);if($2>200){print $9}}}'`
# здесь вычисляется массив превысивших лимит цифрка 200 здеееееееееееееееееееееееееесь^ это и обозначает
for each in $blocked;
do
$ipt -t nat -D PREROUTING -s $each -p tcp --dport 80 -j REDIRECT --to $apach
# эта строка здесь нужна для того,чтобы не множить это правило, удаляет примененное(если не было выдает ошибку,но робает дальше)
# потом применяет правило строки д.б. одинаковы с точностью до -D -A
$ipt -t nat -A PREROUTING -s $each -p tcp --dport 80 -j REDIRECT --to $apach
#і$ipt -A INPUT -s $each -j DROP
#і$ipt -A FORWARD -s $each -j DROP
# как варианты
done
#проверяет, не превзошел ли кто лимит и если превзошел, то для него применяется правило, его айпи в массиве "blocked"
;;
*)
echo "Usage `basename $0` (on|off|set0|status|limit)"
exit 1
;;
esac