Автоматическое отключение пользователе&



  • Автоматическое отключение пользователей после превышения лимита в Pfsense 2.0

    делал по этой инструкции http://warelab.ru/node/11

    Для работы биллинга устанавливаем пакеты squid, Lightsquid, cron. Соответственно учитывается только трафик, проходящий через squid.
    В каталоге /usr/local/squid создаем файлы limit и ter.pl
    
    Скрипт блокирования за месяц:
    
    --------------------------------------------------------------------
    #!/usr/bin/perl
    # файл /usr/local/squid/ter.pl
    
    use Sys::Syslog;
    use File::Basename;
    push (@INC,(fileparse($0))[1]);
    
    require "/usr/local/etc/lightsquid/lightsquid.cfg";
    #require "common.pl";
    
    openlog("blocator", "ndelay,pid", "local0");
    syslog(LOG_WARNING,"trafic blocator");
    closelog();
    
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime;
    $year=sprintf("%02d",$year+1900);
    $month=sprintf("%02d",$mon+1);
    
    $filter="$year$month";
    
    @daylist=glob("$reportpath/$filter*");
    
    print "lightsquid blocator\n";
    foreach $daypath (sort @daylist) {
      open FF,"<$daypath/.total";
    #  GetRealName($daypath,"?"); # init realname for day
      while () {
        ($user,$size,$hit)=split;
        $h{$user}{size}+=$size;
        $h{$user}{hit}+=$hit;
      }  
      close FF;
    }
    
      open FF,") {
        ($user,$limit)=split;
        $tt{$user}{limit}=$limit;
      }  
      close FF;
    
        open FF,">","/usr/local/squid/blocked_users";
    
    foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys     %h) {
        print FF ("$user\n") if ($h{$user}{size} > $tt{$user}{limit});
    }
    close FF;
    
    foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys     %h) {
        printf("%20s",   $user);
        printf("%20d",   $h{$user}{size});
        printf("%20d", $tt{$user}{limit});
        printf(" BLOKED")if($h{$user}{size} > $tt{$user}{limit});
        printf("\n");
    }
    exec '/usr/local/sbin/squid -k reconfigure' 
    --------------------------------------------------------------------
    
    Файл /usr/local/squid/limit:
    
    --------------------------------------------------------------------
    yich             500000000
    lvoronova        150000000
    lpopova          500000000 
    --------------------------------------------------------------------
    
    Скрипт запускается каждые 30 минут через cron. При выполнении скрипта формируется файл /usr/local/squid/blocked_users в котором записываются имена пользователей, превысивших свой лимит. Реально израсходованный трафик можно посмотреть в lightsquid.
    
    Соответствующая запись в файле конфигурации cron (xml).
    
    		 <minute>1,31</minute>
    			<hour>8-20</hour>
    			<mday>*</mday>
    			<month>*</month>
    			<wday>*</wday>
    			<who>root</who>
    			<command></command>perl /usr/local/squid/ter.pl 
    
    Имена, представленные в /usr/local/squid/blocked_users блокируются в ACL squid:
    
    acl bl_users proxy_auth_regex -i '/usr/local/squid/blocked_users'
    http_access deny bl_users
    
    Чтобы указанные строки появлялись в /usr/local/etc/squid/squid.conf при изменениях, внесенных в webConfigurator нужно внести изменения в файл /usr/local/pkg/squid.inc:
    
       $conf .= "#Shipilov\n";
       $conf .= "acl bl_users proxy_auth_regex -i '/usr/local/squid/blocked_users'\n";
       $conf .= "http_access deny bl_users\n";
       $conf .= "#Shipilov\n";
    
    вышеуказанные строки должны стоять после строки
    
    "acl password proxy_auth REQUIRED"
    
    и перед строками (1040 строка)
    
    "// Onto the ACLs"
    "password = array('localnet', 'allowed_subnets');"
    ....
       $conf .= "# Default block all to be sure\n";
       $conf .= "http_access deny all\n";
    
    Очень важно положение данной записи в файле /usr/local/etc/squid/squid.conf!
    
    Чтобы все заработало необходимо, чтобы имена совпадали в limit и squid и в первый раз необходимо сохранить изменения в конфигурации squid в webConfigurator.
    
    Проверить работу скрипта можно по наличию сообщения "trafic blocator" в системном логе.
    

    но по всей видимости он написан для версии 1.*
    в скрипте ter.pl я изменил адреса ссылок (но пробовал и с оригинальными)
    при запуске скрипта в консоле выдаёт ошибки

    [2.0-RC1][root@pfsense.localdomain]/root(4): perl /usr/local/etc/squid/ter.pl
    Bareword found where operator expected at /usr/local/etc/squid/ter.pl line 41, near "/etc/squid"
            (Missing operator before quid?)
    String found where operator expected at /usr/local/etc/squid/ter.pl line 44, near "print FF (""
      (Might be a runaway multi-line "" string starting on line 41)
            (Missing semicolon on previous line?)
    Backslash found where operator expected at /usr/local/etc/squid/ter.pl line 44, near "$user\"
            (Missing operator before \?)
    String found where operator expected at /usr/local/etc/squid/ter.pl line 49, near "printf(""
      (Might be a runaway multi-line "" string starting on line 44)
            (Missing semicolon on previous line?)
    Can't modify pattern match (m//) in local at /usr/local/etc/squid/ter.pl line 41, near "/etc/squid"
    syntax error at /usr/local/etc/squid/ter.pl line 41, near "/etc/squid"
    Unmatched right curly bracket at /usr/local/etc/squid/ter.pl line 54, at end of line
    syntax error at /usr/local/etc/squid/ter.pl line 54, near "}"
    Execution of /usr/local/etc/squid/ter.pl aborted due to compilation errors.
    
    

    кусок кода начиная с 41 строки

        open FF,">","/usr/local/etc/squid/blocked_users";
    
    foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys     %h) {
        print FF ("$user\n") if ($h{$user}{size} > $tt{$user}{limit});
    }
    close FF;
    
    foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys     %h) {
        printf("%20s",   $user);
        printf("%20d",   $h{$user}{size});
        printf("%20d", $tt{$user}{limit});
        printf(" BLOKED")if($h{$user}{size} > $tt{$user}{limit});
        printf("\n");
    }
    exec '/usr/local/sbin/squid -k reconfigure' 
    

    пробовал его редактировать, но в файл блокер_юсерс пользователи не добавлялись (для теста я использовал лимит в 1 и 1024 байт)
    на файл blocked_users ставил права на редактирование любым пользователем, пробовал запускать и без этого файла
    подскажите куда копать?
    и вообще работает ли этот скрип если прокси работает в прозрачном режиме (то есть будут ли записывать не имена, а ипы) ?



  • помогите пожалуйста  ::)



  • попробуй изменить 41 строку
    open(FF,"> /usr/local/squid/blocked_users");



  • спасибо, сейчас попробуемс)



  • как успехи ?
    отпишись plz



  • Извините, что не сразу ответил

    пробовал
    open(FF,"> /usr/local/squid/blocked_users");
    open(FF,"> /usr/local/etc/squid/blocked_users");

    теперь выдает такие ошибки

    [2.0-RC2][root@pfsense.localdomain]/root(1): perl /usr/local/etc/squid/ter.pl
    String found where operator expected at /usr/local/etc/squid/ter.pl line 44, near "print FF (""
      (Might be a runaway multi-line "" string starting on line 41)
            (Missing semicolon on previous line?)
    Backslash found where operator expected at /usr/local/etc/squid/ter.pl line 44, near "$user\"
            (Missing operator before \?)
    String found where operator expected at /usr/local/etc/squid/ter.pl line 49, near "printf(""
      (Might be a runaway multi-line "" string starting on line 44)
            (Missing semicolon on previous line?)
    syntax error at /usr/local/etc/squid/ter.pl line 41, near "/usr/local"
    Unmatched right curly bracket at /usr/local/etc/squid/ter.pl line 54, at end of line
    syntax error at /usr/local/etc/squid/ter.pl line 54, near "}"
    Execution of /usr/local/etc/squid/ter.pl aborted due to compilation errors.
    
    

    44я строка соответственно
      print FF ("$user\n") if ($h{$user}{size} > $tt{$user}{limit});
    как понимаю он ругается на ввод информации в файл /usr/local/etc/squid/limit
    файлу я на всякий случай присвоил 777 права



  • c.35-40

      open FF,"  while (<ff>) {
        ($user,$limit)=split;
        $tt{$user}{limit}=$limit;
      } 
      close FF;</ff>
    


  • @dvserg:

    c.35-40

      open FF,"  while (<ff>) {
        ($user,$limit)=split;
        $tt{$user}{limit}=$limit;
      } 
      close FF;</ff>
    

    спасибо тебе о великий гуру пфсенса  ;)
    с этим изменением скрипт запускается
    но вроде бы в файл limit всё равно пользователи не добавляются =\ поковыряюсь пока ещё со скриптом

    только не сердитесь, тут велез другой вопрос, который я задавал ранее
    о возможности блокировки пользователей по ипу
    этой строчкой баняться только учетные записи
    _acl bl_users proxy_auth_regex -i '/usr/local/squid/blocked_users'_к сожалению инфы по настройке асл для фряхи я ещё не нашел (но сейчас продолжаю поиск)
    или подскажите какой каким параметром заменить proxy_auth_regex, чтобы блокировался ип?



  • @Clista:

    этой строчкой баняться только учетные записи
    _acl bl_users proxy_auth_regex -i '/usr/local/squid/blocked_users'_к сожалению инфы по настройке асл для фряхи я ещё не нашел (но сейчас продолжаю поиск)
    или подскажите какой каким параметром заменить proxy_auth_regex, чтобы блокировался ип?

    url_regex верно?
    ипы я прописываю вида 192.168.0.х/32



  • В сквиде есть опция

    acl banned_hosts src "/var/squid/acl/banned_hosts.acl"
    

    содержит

    10.10.10.10
    10.100.2.100

    Только опция появляется, если что-то было добавлено в  Proxy server: Access control  > Banned host addresses

    Можно в опции настроек ГУИ добавить фиктивный адрес и потом спокойно использовать указанный файл.



  • ух половину проблемы решили) с такой командой все баняться на отличненько  ;D
    acl bl_users src "/usr/local/squid/blocked_users"
    http_access deny bl_users

    пойду добивать, почему пользователи не добавляются в файл blocked_users



  • @Clista:

    ух половину проблемы решили) с такой командой все баняться на отличненько  ;D
    acl bl_users src "/usr/local/squid/blocked_users"
    http_access deny bl_users

    пойду добивать, почему пользователи не добавляются в файл blocked_users

    Попробуй сквид погасить - может он держит файл.



  • сейчас отключены хавп, сквид и сквидгуард

    результ прежний =(



  • @Clista:

    сейчас отключены хавп, сквид и сквидгуард

    результ прежний =(

    Какие разрешения на файл?



  • пробовал развные, включая 777



  • Если нет необходимости вести лог трафика, а нужно лишь контролировать его лимит, то лучше использовать Captive Portal + Radius.
    Правда, по умолчанию FreeRadius в pfSense не умеет считать трафик, но с помощью командной строки и правки пары конфигурационных файлов его можно этому научить.

    Вместо CP можно использовать PPPoE или PPTP. Причём лучше второе.

    Вариант с радиусом позволяет контролировать весь трафик, а не только тот, который проходит через сквид.

    Если кому интересно, напишу подробнее, что нужно править в конфигурационных файлах.

    Я реализовывал этот вариант на базе 2.0 RC1, но в промышленную эксплуатацию в нашей компании он не пошёл, так как в этом случае не ведётся логирование, т.е. нельзя узнать кто на что этот трафик потратил.
    Можно конечно использовать в дополнение к радиусу что-то типа ntop, но во-первых он у меня не заработал (какие-то там библиотеки кривые), а во-вторых железо слабовато (PF стоит на ALIX).



  • @PlanB:

    Если нет необходимости вести лог трафика, а нужно лишь контролировать его лимит, то лучше использовать Captive Portal + Radius.
    Правда, по умолчанию FreeRadius в pfSense не умеет считать трафик, но с помощью командной строки и правки пары конфигурационных файлов его можно этому научить.

    Вместо CP можно использовать PPPoE или PPTP. Причём лучше второе.

    Такой вариант позволяет контролировать весь трафик, а не только тот, который проходит через сквид.

    Если кому интересно, напишу подробнее, что нужно править в конфигурационных файлах.

    Я реализовывал этот вариант на базе 2.0 RC1, но в промышленную эксплуатацию в нашей компании он не пошёл, так как в этом случае не ведётся логирование, т.е. нельзя узнать кто на что этот трафик потратил.
    Можно конечно использовать что-то типа nmap, но во-первых он у меня не заработал (какие-то там библиотеки кривые), а во-вторых железо слабовато (PF стоит на ALIX).

    если можно расскажи по подробней плиз очень интересно



  • @PlanB:

    Правда, по умолчанию FreeRadius в pfSense не умеет считать трафик, но с помощью командной строки и правки пары конфигурационных файлов его можно этому научить.

    Считает вроде без шаманства? что за правки? если не секрет -)

    Отредактировано: Считает вроде без шаманства. что за правки? если не секрет -)



  • Отлично всё работает. Как уже говорилось, для блокирования по ip забиваем через гуи фиктивный адрес, а потом используем файл /var/squid/acl/banned_hosts.acl
    Нюансы:

    1. нужно пропускать первые 2 строки в файле .total:
          $totaluser=<ff>;chomp $totaluser;$totaluser=~s/^user: //;
          $totalsize=<ff>;chomp $totalsize;$totalsize=~s/^size: //;
      while (<ff>) {
        ($user, $size, $hit) = split;
        $h{$user}{size}+=$size;
        $h{$user}{hit}+=$hit;

    2. Если пока никто не забанен, то получается пустой файл, поэтому через скрипт прописываем тот же фиктивный ip в файл banned_hosts.acl:
        open FF,">","/var/squid/acl/banned_hosts.acl";
        print FF ("фиктивный ip\n");
      foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys    %h) {
        print FF ("$user\n") if ($h{$user}{size} > $tt{$user}{limit});

    3. Так как скрипт пользуется результатами работы скрипта /usr/local/www/lightsquid/lightparser.pl то более логично дописать весь этот функционал именно в него.</ff></ff></ff>


Log in to reply