forum.bitel.ru
http://forum.bitel.ru/

FreeBSD Manad, использующий таблицы
http://forum.bitel.ru/viewtopic.php?f=7&t=4820
Страница 1 из 2

Автор:  vdd [ 23 ноя 2010, 20:15 ]
Заголовок сообщения:  FreeBSD Manad, использующий таблицы

Кто-то уже сделал?

Автор:  borisk [ 24 ноя 2010, 10:19 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Я вот как раз сейчас этим и озадачиваюсь, хочу перевести свою сеть с pptp на прямые адреса и manad, до тех пор пока не появится isg или что-то подобное. Но сразу же встает очень острый вопрос - поддержка актуальности, а именно как восстановить актуальность таблиц в случае перезагрузки роутера?

Автор:  vdd [ 24 ноя 2010, 12:14 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Нас пока устраивает та актуальность, которая есть в манаде сейчас. Нас перестает устраивать производительность ipfw на большом количестве правил.

Автор:  borisk [ 24 ноя 2010, 12:33 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Может я что-то не дочитал, но как таковой актуальности то в манаде я и не увидел. В случае перезагрузки роутера все правила будут сброшены и возможности актуализировать нет. Или я не прав?

Автор:  vdd [ 24 ноя 2010, 12:40 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

borisk писал(а):
Может я что-то не дочитал, но как таковой актуальности то в манаде я и не увидел. В случае перезагрузки роутера все правила будут сброшены и возможности актуализировать нет. Или я не прав?

Нас это устраивает на текущий момент и в обозримом будущем.

Автор:  vdd [ 25 ноя 2010, 13:39 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

FreeBSD manad с поддержкой таблиц и с обеспечением совместимости со старым вариантом (с правилами) проходит тестовую эксплуатацию под реальной нагрузкой. Если кому-то срочно интересно, то могу выложить сюда, иначе будет через месяц выложен на вики.

Автор:  borisk [ 25 ноя 2010, 14:43 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Интересно. Как раз сейчас пишу свой, смысл тогда изобретать велосипед :)

Автор:  vdd [ 25 ноя 2010, 14:51 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

borisk писал(а):
Интересно. Как раз сейчас пишу свой, смысл тогда изобретать велосипед :)

За основу взят стандартный манад, который не устраивает вас своей "неактуальностью". ;)
Все равно выкладывать?

Автор:  borisk [ 25 ноя 2010, 14:53 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

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

Автор:  vdd [ 25 ноя 2010, 15:08 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

За основу взят http://wiki.bgbilling.ru/index.php/FreeBSD_manad,_понимающий_изменения_правил_в_тарифах
Обеспечена совместимость со старым вариантом.
Коротко об алгоритме:
Используются теги [OPEN], [CLOSE], но, в отличие от Линуксового манада, эти теги обрабатывает скрип шлюза, а не манад.
При использовании данного манада без тегов [OPEN], [CLOSE] на манад, в команде remove, будут отправлены все правила, но манад, при обработке remove, понимает только команды table. Докручивание обработчика remove до уровня понимания других команд ipfw без использования [OPEN], [CLOSE] черевато.

IPFW:
Код:
34500 pipe tablearg ip from any to table(1) out
34500 pipe tablearg ip from table(2) to any in
34500 skipto 60000 ip from table(1) to any
59999 deny ip from any to any via vlan90 out


Команды:

Код:
[DEFAULT]
[OPEN]
pipe {PA} config bw ${speed}
pipe {PB} config bw ${speed}
<LOOP>
table 1 delete {A}
table 2 delete {A}
table 1 add {A} {PA}
table 2 add {A} {PB}
</LOOP>
[/OPEN]
[CLOSE]
<LOOP>
table 1 delete {A}
table 2 delete {A}
</LOOP>
[/CLOSE]
[/DEFAULT]


Скрипт:
Код:
import java.io.*;
import java.net.*;
import java.util.*;
import bitel.billing.common.module.ipn.*;
import bitel.billing.server.ipn.bean.*;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.*;
 
protected void doSync()
{
        host = gate.getHost();
        port = gate.getPort();
        gid = gate.getId();
 
        if ( log.isDebugEnabled() )
        {
            log.debug( gid + " gate: " + host + ":" + port );
        }
 
 
        try
        {
                socket = new Socket( host, port );
                out = new PrintWriter( socket.getOutputStream(), true );
                isr = new InputStreamReader( socket.getInputStream() );
                in = new BufferedReader( isr );
            log.info("I test Manad");
                out.println( "testRID" );
                kods = in.readLine();

        if ( log.isDebugEnabled() )
        {
            log.debug( gid + " Test => " + kods + "\n" );
        }
            log.info( gid + " Test => " + kods + "\n" );
 
                // список открытых договоров с шлюза
                gateRules = new HashMap( 5, 5 );
                st = new StringTokenizer( kods );
                while ( st.hasMoreTokens() )
                {
                  sp=st.nextToken().split("-");
                  if(sp.length==2) gateRules.put( new Integer( sp[0] ),(sp[1]==null)?null:new Integer(sp[1]) );
                  else gateRules.put( new Integer( sp[0] ),null);
                }
 
                for( i = 0; i < statusList.size(); i++ )
                {
                        status = statusList.get(i);
                        cid = status.contractId;
 
                        // флаг того то правило есть на шлюзе
                        flag = false;
                   ruleChanged=false;
                        // правило для этого договора есть на шлюзе
                        if ( gateRules.containsKey( cid ) )
                        {
                                //      если правило есть а юзер заблокирован - удаляем правило
                                if ( status.status > 0 )
                                {
                                        rule = generateRule( status ,false);
                                        command = "remove\t" + cid.intValue() + "\t" + rule;
                                        out.println( command );
                                     if ( log.isDebugEnabled() ) {
                                     log.debug( gid + " " + command );
                                        }
                              log.info( gid + " " + command );
                                 }else{
                           // правило есть и юзер открыт - проверяем тип правила
                           rid=gateRules.get(cid);
                           if(rid!=null && status.ruleType==null) ruleChanged=true;
                           if(rid==null && status.ruleType!=null) ruleChanged=false; // совместимость со старым manad
                           if(rid!=null && status.ruleType!=null && !rid.equals(status.ruleType.getId())) ruleChanged=true;
                           if(ruleChanged){
                                     if ( log.isDebugEnabled() ) {
                                     log.debug( gid + " rule changed");
                                        }
                                 log.info( gid + " rule changed");
                           }
                           }                                               
 
                                flag = true;
                                gateRules.remove( cid );
                        }
 
                        // правила нет, а юзер открыт, правило есть, но было изменение типа правила
                        if ( (!flag &&
                                status.status == IPNContractStatus.STATUS_OPEN ) ||(ruleChanged && status.status == IPNContractStatus.STATUS_OPEN ))
                        {
                                rule = generateRule( status, true);
 
                                command = "add\t" + cid.intValue() + "\t" + rule; // в случае изменения manad затрет старые правила ipfw
                          if( status.ruleType != null ) command+=" // RULE"+status.ruleType.getId();
                  
                                out.println( command );
 
                            if ( log.isDebugEnabled() )
                {
                    log.debug( gid + " " + command );
                }
   log.info( gid + " " + command );


                        }
                }
 
                in.close();
                out.close();
                socket.close();
        }
        catch ( e )
        {
                throw new RuntimeException ( e );
        }
}
 
private generateRule( status ,open)
{
        rule = null;
 
        // пользовательское правило, без типа
        if( status.ruleType == null )
        {
                rule = status.rule.getRuleText();
        }
        // типизированное правило
        else
        {       
 
                ruleText = GateCommandUtil.getRule( status.gateType, status.ruleType );
                rule =  GateCommandUtil.generateRule( ruleText,  status.rule.getRuleText(), null, status.ruleType );                     
        }
 
 
        rule = rule.replaceAll( "\r", "" );
        rule = rule.replaceAll( "\n", "|" );
 if(open){
   ib=rule.indexOf("[OPEN]")+7;
    ie=rule.indexOf("[/OPEN]")-1;
   if(ib>-1&&ie>-1) rule=rule.substring(ib,ie);
}else{
   ib=rule.indexOf("[CLOSE]")+8;
    ie=rule.indexOf("[/CLOSE]")-1;
   if(ib>-1&&ie>-1) rule=rule.substring(ib,ie);
}
        return    rule;
}


Манад:
Код:
#!/usr/bin/perl

use POSIX;
use IO::Socket;
use IO::Select;
use Socket;
use Fcntl;
use Tie::RefHash;


$debug = 1;
$port = 4444;
$ipfw = "/sbin/ipfw";
$rule_start = 35000;
$pipe_start = 800;
$set = 10;

# База данных правил клиентов
%CLRULE = ();
%CLRULE_ID = ();

# База данных используемых номеров правил
%USERULEN = ();
%CLUSERULEN = ();

# База данных используемых номеров труб
%USEPIPEN = ();
%CLUSEPIPEN = ();

# Начать с пустыми буферами
%inbuffer   = ();
%outbuffer   = ();
%ready      = ();

tie %ready, 'Tie::RefHash';

# Прослушивать порт
$server = IO::Socket::INET->new( LocalPort => $port, Listen => 10 )
   or die "Can`t make server socket: $@\n";

nonblock( $server );

$SIG{INT} = sub { $server->close(); exit( 0 ); };

$select = IO::Select->new( $server );

$pid = getpid();

open(FILE, ">/var/run/manad.pid");
print FILE $pid;
close(FILE);

# Устанавливаем новый root каталог для процесса
# chroot( $homedir ) or die "Couldn`t chroot to $homedir: $!\n";

# Главный цикл: проверка чтения/принятия, проверка записи,
# проверка готовности к работе

while( 1 )
{
   my $client;
   my $rv;
   my $data;

   # Проверить наличие новой информации на имеющихся подключениях

   # Есть ли что-нибудь для чтения или подтверждения?   
   foreach $client ( $select->can_read( 1 ) )
   {
      if ( $client == $server )
      {
         # Принять новое подключение
         $client = $server->accept();
         $select->add( $client );
         nonblock( $client );
      }      
      else
      {
         # Прочитать данные
         $data = '';
         $rv = $client->recv( $data, POSIX::BUFSIZ, 0 );

         unless( defined( $rv ) && length $data )
         {
            # Это должен быть конец файла, поэтому закрываем клиента
            delete $inbuffer{$client};
            delete $outbuffer{$client};
            delete $ready{$client};

            $select->remove( $client );
            close $client;
            next;
         }

         $inbuffer{$client} .= $data;

         # Проверить, говорят ли данные в буфере или только что прочитанные
         # данные о наличии полного запроса, ожидающего выполнения. Если да -
         # заполнить $ready{$client} запросами, ожидающими обработки.
         while( $inbuffer{$client} =~ s/(.*\n)// ) { push( @{$ready{$client}}, $1 ) }
      }
   }
   
   # Есть ли полные запросы для обработки?
   foreach $client ( keys %ready ) { handle( $client ); }

   # Сбрасываем буферы?
   foreach $client ( $select->can_write( 1 ) )
   {
      # Пропустить этого слиента, если нам нечего сказать
      next unless $outbuffer{$client};
                block( $client );
      $rv = $client->send( $outbuffer{$client}, 0 );
      nonblock( $client );
      unless( defined $rv )
      {
         # Пожаловаться, но следовать дальше
         warn "I was told I could write? but I can`t.\n";
         next;
      }
      if ( $rv == length $outbuffer{$client} || $! == POSIX::EWOULDBLOCK )
      {
         substr( $outbuffer{$client}, 0, $rv ) = '';
         delete $outbuffer{$client} unless length $outbuffer{$client};
      }
      else
      {
         # Не удалось записать все данные и не из-за блокировки.
         # Очистить буферы и следовать дальше.
         delete $inbuffer{$client};
         delete $outbuffer{$client};
         delete $ready{$client};

         $select->remove($client);
         close($client);
         next;
      }
   }
}

# handle( $socket ) обрабатывает все необработанные запросы
# для клиента $client
sub handle
{
   # Запрос находится в $ready{$client}
   # Отправить вывод в $outbuffer{$client}
   my $client = shift;
   my $request;

   foreach $request ( @{$ready{$client}} )
   {
      print "\nrequest=".$request if ( $debug == 1 );

      if ( $request =~ /^testRID/ )
      {
         my $open_client = "";
         foreach my $kod ( keys %CLRULE )
            { $open_client .= $open_client eq "" ? $kod : " ".$kod;
            ($CLRULE_ID{$kod} ne "")?$open_client.="-".$CLRULE_ID{$kod}:"";
            }
         $outbuffer{$client} .= $open_client."\n";
      }
      elsif ( $request =~ /^test/ )
      {
         my $open_client = "";
         foreach my $kod ( keys %CLRULE )
            { $open_client .= $open_client eq "" ? $kod : " ".$kod;}
         $outbuffer{$client} .= $open_client."\n";
      }
      elsif ( $request =~ /^add\t([0-9]+)\t(.*)/ )
      {
         my ($skip,$rid)=split /RULE/,$2;
         print "\n=rule".$rid."\n" if ( $debug == 1 );
         my ($kod, $rule) = ($1, $2);
         &delete_rule( $kod ) if ( exists $CLRULE{$kod} );
         &add_rule( $kod, $rule,$rid ) if ( !exists $CLRULE{$kod} );
      }
      elsif ( $request =~ /^remove\t([0-9]+)\t(.*)/ )
      {
         &delete_rule( $1,$2 ) if ( exists $CLRULE{$1} );
      }
   }

   delete $ready{$client};
}

# nonblock( $socket ) переводит сокет в неблокирующий режим
sub nonblock
{
   my $socket = shift;
   my $flags;

   $flags = fcntl( $socket, F_GETFL, 0 )
      or die "Can`t get flags for socket: $!\n";
   fcntl( $socket, F_SETFL, $flags | O_NONBLOCK )
      or die "Can`t make socket nonblocking: $!\n";
}

sub block
{
   my $socket = shift;
   my $flags;

   $flags = fcntl( $socket, F_GETFL, 0 )
      or die "Can`t get flags for socket: $!\n";
   fcntl( $socket, F_SETFL, $flags ^ O_NONBLOCK )
      or die "Can`t make socket nonblocking: $!\n";
}

sub add_rule
{
   my $kod = $_[0];
   my $rule = $_[1];
   my $rid = $_[2];
   my %N = ();
   my %P = ();

   $CLRULE{$kod} = $rule;
   $CLRULE_ID{$kod} = $rid;

   while ( $rule =~ /\{N([AB0-9]+)\}/ )
   {
      my $n = $1;
      my $i = $rule_start - 1;
      my $j = 0;
      while( 1 )
      {
         while( 1 )
         {
            $i++;
            last if ( !exists $USERULEN{$i} );
         }
         $j++;
         last if ( $j == $n );
         last if ( $n == 0 );
      }
      $USERULEN{$i} = $kod;
      $N{$n} = $i;
      $rule =~ s/\{N$n\}/$N{$n}/g;
   }

   while ( $rule =~ /\{P([AB0-9]+)\}/ )
   {
      my $p = $1;
      my $i = $pipe_start - 1;
      my $j = 0;
      while( 1 )
      {
         while( 1 )
         {
            $i++;
            last if ( !exists $USEPIPEN{$i} );
         }
         $j++;
         last if ( $j == $p );
         last if ( $p == 0 );
      }
      $USEPIPEN{$i} = $kod;
      $P{$p} = $i;
      $rule =~ s/\{P$p\}/$P{$p}/g;
   }

   foreach my $i ( keys %N ) { $CLUSERULEN{$kod} .= exists $CLUSERULEN{$kod} && $CLUSERULEN{$kod} ne "" ? " ".$N{$i} : $N{$i}; }
   foreach my $i ( keys %P ) { $CLUSEPIPEN{$kod} .= exists $CLUSEPIPEN{$kod} && $CLUSEPIPEN{$kod} ne "" ? " ".$P{$i} : $P{$i}; }

   $rule =~ s/\|pipe/; \/sbin\/ipfw -q pipe /g;
   $rule =~ s/\|table/; \/sbin\/ipfw -q table /g;
   $rule =~ s/\|add ([0-9]+)/; \/sbin\/ipfw -q add $1 set $set /g;
        $rule =~ s/^pipe/\/sbin\/ipfw -q pipe /g;
        $rule =~ s/^table/\/sbin\/ipfw -q table /g;       
   $rule =~ s/^add ([0-9]+)/\/sbin\/ipfw -q add $1 set $set /g;
   $rule =~ s/\|/;/g;
#   print "$ipfw -q $rule\n" if ( $debug == 1 );
#   $err = `$ipfw -q $rule`;
   print "$rule\n" if ( $debug == 1 );
   $err = `$rule`;

}

sub delete_rule
{
   my $kod = $_[0];
   my $rule= $_[1];

   if ( exists $CLRULE{$kod} )
   {
      $rule =~ s/\|table/; \/sbin\/ipfw -q table /g;
          $rule =~ s/^table/\/sbin\/ipfw -q table /g;       
      $rule =~ s/\|/;/g;
#      print "$ipfw -q $rule\n" if ( $debug == 1 );
#      $err = `$ipfw -q $rule`;
      print "$rule\n" if ( $debug == 1 );
      $err = `$rule`;


      my @N = split( / /, $CLUSERULEN{$kod} );

      foreach my $i ( @N )
      {
         print "$ipfw delete $i\n" if ( $debug == 1 );
         $err = `$ipfw delete $i`;
         delete $USERULEN{$i};
      }

      my @P = split( / /, $CLUSEPIPEN{$kod} );

      foreach my $i ( @P )
      {
         print "$ipfw pipe delete $i\n" if ( $debug == 1 );
         $err = `$ipfw pipe delete $i`;
         delete $USEPIPEN{$i};
      }
      delete $CLUSERULEN{$kod};
      delete $CLUSEPIPEN{$kod};
      delete $CLRULE_ID{$kod};
      delete $CLRULE{$kod};
   }
}

Автор:  borisk [ 25 ноя 2010, 15:11 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Спасибо, поизучаю.

Автор:  vdd [ 25 ноя 2010, 15:15 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

На всякий случай добавил правила IPFW.

Автор:  borisk [ 25 ноя 2010, 16:08 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Я что-то упустил в документации? Вот что будет транслироваться {PA} и {PB} ?
Хотя я вижу у себя немного другую задумку. Есть уже готовый набор pipe, c mask src-ip и mask-dst ip в который направляются соответствующие таблицы. Соответственно задача манада - только передать комманды add table и remove table с соответствующими номерами pipe, задаваемых в типе правила.

Автор:  vdd [ 25 ноя 2010, 16:54 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

borisk писал(а):
Я что-то упустил в документации? Вот что будет транслироваться {PA} и {PB} ?

Номера пайпов
borisk писал(а):
Хотя я вижу у себя немного другую задумку. Есть уже готовый набор pipe, c mask src-ip и mask-dst ip в который направляются соответствующие таблицы. Соответственно задача манада - только передать комманды add table и remove table с соответствующими номерами pipe, задаваемых в типе правила.

Думали об этом. Нас не устроило следующее:
1) Нужно где-то хранить и поддерживать в актуальном состоянии соответствие пайпа и скорости. У нас есть клиенты с персональными скоростями и это тоже придется учитывать;
2) У нас есть клиенты, имеющие больше одного IP.

Автор:  borisk [ 25 ноя 2010, 17:05 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

>Номера пайпов
Ну так я и говорю, что нашел в документации только форму PN - где N цифра, а не буква, поэтому смысл PA и PB не понятен

>Больше одного ip у клиента
У меня тоже. И в этом случае, как я понял из документации на выходе мы получим правило вида
...ip1...|...ip2...|...ip3...

Автор:  vdd [ 25 ноя 2010, 17:09 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

borisk писал(а):
>Номера пайпов
Ну так я и говорю, что нашел в документации только форму PN - где N цифра, а не буква, поэтому смысл PA и PB не понятен

Каюсь, ввел в заблуждение. Это наша примочка: http://wiki.bgbilling.ru/index.php/Изменения_в_manad_для_работы_с_одним_pipe_на_множество_IP_адресов

borisk писал(а):
>Больше одного ip у клиента
У меня тоже. И в этом случае, как я понял из документации на выходе мы получим правило вида
...ip1...|...ip2...|...ip3...

Да, но в нашем случае все три адреса попадут в один пайп. А в вашем на каждый адрес будет склонирован отдельный пайп.

Автор:  borisk [ 25 ноя 2010, 17:16 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

>Да, но в нашем случае все три адреса попадут в один пайп. А в вашем на каждый адрес будет склонирован отдельный пайп.

Ну да, у меня так и задумывалось. Но ход ваших мыслей я понял, спасибо. Теперь буду осмысливать что именно мне надо и как это лучше реализовать.

Автор:  vdd [ 25 ноя 2010, 17:22 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Может быть целесообразнее не дублировать функционал, а сосредоточится на вопросе актуальности?

Автор:  borisk [ 25 ноя 2010, 19:20 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Вопрос актуальности я, для себя, вижу так: с периодичностью N минут таблицы сохраняются в файлы, при старте manad их подгружает. Возможна небольшая потеря актуальности. Другой вариант вообще без потерь - слегка модернизируем скрипт манада, и после каждого изменения конфигурации он сбрасывает содержимое таблиц в файлы.

Автор:  vdd [ 25 ноя 2010, 19:45 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

borisk писал(а):
Вопрос актуальности я, для себя, вижу так: с периодичностью N минут таблицы сохраняются в файлы, при старте manad их подгружает. Возможна небольшая потеря актуальности. Другой вариант вообще без потерь - слегка модернизируем скрипт манада, и после каждого изменения конфигурации он сбрасывает содержимое таблиц в файлы.


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

Наше видение такое: при запуске манад дергает биллинг за ниточку и биллинг выполняет внеочередную синхронизацию шлюза.

Автор:  borisk [ 25 ноя 2010, 19:49 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

А такое возможно? Если да, то такой вариант конечно предпочтительней. Есть еще один вариант - через внешнее хранилище, например mysql. При этом скриптовый шлюз на стороне биллинга вносит туда все изменения, а manad восстанавливает их при загрузке.

Автор:  vdd [ 25 ноя 2010, 20:00 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

1) Можно создать свой action и вызвать его через http. В action вызвать необходимые методы для инициации синхронизации конкретного шлюза.
2) На первое время можно сэмулировать команду клиентского интерфейса "выполнить сейчас" на задаче "Проверка шлюзов IPN" в планировщике.

Автор:  borisk [ 26 ноя 2010, 10:27 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

ну 1й вариант наверное был бы идеальным...

Автор:  vdd [ 26 ноя 2010, 13:40 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

В скрипте шлюза заменили ManadUtils на GateCommandUtil

Автор:  vdd [ 26 ноя 2010, 13:58 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Обнаружилось слабое место обработки open-close на стороне биллинга: все изменения адресов/сетей необходимо проводить при закрытом шлюзе. Иначе не удалятся старые адреса/сети.

Автор:  stark [ 26 ноя 2010, 15:52 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

vdd писал(а):
Обнаружилось слабое место обработки open-close на стороне биллинга: все изменения адресов/сетей необходимо проводить при закрытом шлюзе. Иначе не удалятся старые адреса/сети.


Да..его можно исправить с помощью скиптового шлюза .

Автор:  vdd [ 26 ноя 2010, 16:14 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

stark писал(а):
vdd писал(а):
Обнаружилось слабое место обработки open-close на стороне биллинга: все изменения адресов/сетей необходимо проводить при закрытом шлюзе. Иначе не удалятся старые адреса/сети.


Да..его можно исправить с помощью скиптового шлюза .


Намекните как, хотя бы. Потому как у нас нет идей, откуда взять старые адреса.

Автор:  borisk [ 30 ноя 2010, 11:57 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Я понял одно - действительно универсального решения не существует похоже. Я сделал вариант исключительно под свои нужды. При этом я на стороне manad храню номер договора и ассоциированные с ним правила, в скрипте выполняю проверку на расхождения - если есть, то manad удаляет старые правила и закачивает новые. Решилось сразу две проблемы - первая это актуальность (если перезагрузится manad, значит все правила потеряются и скрипт просто закачает новые), а вторая как раз об open-close.

Автор:  vdd [ 30 ноя 2010, 14:25 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

borisk писал(а):
Решилось сразу две проблемы - первая это актуальность (если перезагрузится manad, значит все правила потеряются и скрипт просто закачает новые),

Оригинальный манад ведет себя точно также. Только он хранит номера договоров.

Автор:  borisk [ 01 дек 2010, 15:02 ]
Заголовок сообщения:  Re: FreeBSD Manad, использующий таблицы

Если хранить только номера договоров, нельзя отследить смену правил в тарифе. Ну то есть фактически на текущий момент я использовал приведенный на wiki вариант, с заточкой исключительно под свои нужды.

Страница 1 из 2 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/