Скрипт для ограничения траффика юзеров (LINUX)

bash, perl, python и прочие интерпретируемые скрипты

Moderator: Gen1us2k

Post Reply
User avatar
Raven
Бородатый сис
Бородатый сис
Posts: 2791
Joined: 03 Mar 2010, 15:12
ОС: RHEL 8
Location: Из серверной

Скрипт для ограничения траффика юзеров (LINUX)

Post by Raven » 31 Mar 2010, 11:10

Самый простой скриптик для ограничения объема скачанного траффика.
Модификация и предложения за вами. Единственно, по-моему нет смысла ставить ограничение на маки, поскольку маки для этого нужно знать, во-вторых, при подключении нового компа его нужно прописывать и в конце концов, юзеры не должны сами менять себе айпи. Предложения и улучшения в студию!

Code: Select all

#!/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
Я не злопамятный, я просто часто ковыряю логи
sim
Эникейщик
Эникейщик
Posts: 251
Joined: 16 Mar 2010, 21:01
ОС: MSDOS
Location: с марса

Re: Скрипт для ограничения траффика юзеров (LINUX)

Post by sim » 03 May 2010, 22:44

спасибо
SSD хочу
Post Reply