Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

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

    Scheduled Pinned Locked Moved Russian
    19 Posts 8 Posters 12.2k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      Clista
      last edited by

      Автоматическое отключение пользователей после превышения лимита в 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 ставил права на редактирование любым пользователем, пробовал запускать и без этого файла
      подскажите куда копать?
      и вообще работает ли этот скрип если прокси работает в прозрачном режиме (то есть будут ли записывать не имена, а ипы) ?

      1 Reply Last reply Reply Quote 0
      • C
        Clista
        last edited by

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

        1 Reply Last reply Reply Quote 0
        • M
          Mr. Boroda
          last edited by

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

          1 Reply Last reply Reply Quote 0
          • C
            Clista
            last edited by

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

            1 Reply Last reply Reply Quote 0
            • T
              Tamriel
              last edited by

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

              AMD Athlon™ XP 1700+
              384MB Ram
              NanoBSD Boot Slice pfsense0 / da0s1
              Platform nanobsd (512mb)
              Version 2.0-RELEASE (i386)
              built on Wed Sep 14 09:08:10 EDT 2011

              1 Reply Last reply Reply Quote 0
              • C
                Clista
                last edited by

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

                пробовал
                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 права

                1 Reply Last reply Reply Quote 0
                • D
                  dvserg
                  last edited by

                  c.35-40

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

                  SquidGuardDoc EN  RU Tutorial
                  Localization ru_PFSense

                  1 Reply Last reply Reply Quote 0
                  • C
                    Clista
                    last edited by

                    @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, чтобы блокировался ип?

                    1 Reply Last reply Reply Quote 0
                    • C
                      Clista
                      last edited by

                      @Clista:

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

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

                      1 Reply Last reply Reply Quote 0
                      • D
                        dvserg
                        last edited by

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

                        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

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

                        SquidGuardDoc EN  RU Tutorial
                        Localization ru_PFSense

                        1 Reply Last reply Reply Quote 0
                        • C
                          Clista
                          last edited by

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

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

                          1 Reply Last reply Reply Quote 0
                          • D
                            dvserg
                            last edited by

                            @Clista:

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

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

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

                            SquidGuardDoc EN  RU Tutorial
                            Localization ru_PFSense

                            1 Reply Last reply Reply Quote 0
                            • C
                              Clista
                              last edited by

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

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

                              1 Reply Last reply Reply Quote 0
                              • D
                                dvserg
                                last edited by

                                @Clista:

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

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

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

                                SquidGuardDoc EN  RU Tutorial
                                Localization ru_PFSense

                                1 Reply Last reply Reply Quote 0
                                • C
                                  Clista
                                  last edited by

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

                                  1 Reply Last reply Reply Quote 0
                                  • P
                                    PlanB
                                    last edited by

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

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

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

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

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

                                    1 Reply Last reply Reply Quote 0
                                    • V
                                      vit2002
                                      last edited by

                                      @PlanB:

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

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

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

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

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

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

                                      1 Reply Last reply Reply Quote 0
                                      • E
                                        Eugene
                                        last edited by

                                        @PlanB:

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

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

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

                                        http://ru.doc.pfsense.org

                                        1 Reply Last reply Reply Quote 0
                                        • D
                                          DVR
                                          last edited by

                                          Отлично всё работает. Как уже говорилось, для блокирования по 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>

                                          1 Reply Last reply Reply Quote 0
                                          • First post
                                            Last post
                                          Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.