Биллинговая система Nodeny

Главная категория => Nodeny 50 => Тема начата: serg_sk от 16 Ноября 2012, 15:14:21



Название: freebsd, pf проблема с доступом
Отправлено: serg_sk от 16 Ноября 2012, 15:14:21
Суть проблемы такая. Есть сателит на фре с pf.nat. Запускаем noserver.pl, который добавляет юзеров в фаерволл и кажется все хорошо, но некоторых пользователей он туда не добавляет. Приходится в биллинге вручную делать юзеру запрет доступа, потом доступ разрешаем и скрипт добавляет в фаерволл.

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

Выкладываю скрипты:

nofire.pl
Цитировать
nas4# cat nofire.pl
#!/usr/bin/perl
# ==============================================================================#
#                              #
#      NoDeny - подпрограммы разрешения/блокировки доступа      #
#                              #
# ==============================================================================#

$FW='/sbin/ipfw -q ';

sub Flush
{
 system("$FW table 1 flush");
 system("$FW table 10 flush");
 system("$FW table 11 flush");
 system("$FW table 12 flush");
 system("$FW table 13 flush");
 system("$FW table 14 flush");

 system("$FW pipe flush");
 
}

sub Deny
{
 my ($p, $id, $num, $main_num, $pipe_in, $pipe_out, $ip);
 $p=$_[0];
 $id=$p->{id};
 $num=$p->{num};
 $main_num=$p->{main_num};
 $ip=$p->{ip};
 $pipe_in=&Get_Pipe_Num($main_num);
 $pipe_out=$pipe_in+1;
 
 $pipe=$Pipe_used{$num};
 &Add_Rule("table 10 delete $ip");
 &Add_Rule("table 11 delete $ip");
 &Add_Rule("table 12 delete $ip");
 &Add_Rule("table 13 delete $ip");
 &Add_Rule("table 14 delete $ip");
 
 if( --$Pipe_count{$pipe}<=0 )
 {
 $pipe2=$pipe+1;
 system("$FW pipe $pipe delete");
 system("$FW pipe $pipe2 delete");
 }
 

}
sub Allow
{
 my($p, $num, $main_num, $id, $ip, $speed_in, $speed_out, $pipe_in, $pipe_out, $auth, $dop_param, $s_in, $s_out, $a_ports, $options, $traf);
 $p=$_[0];

 $num=$p->{num};
 $main_num=$p->{main_num};
 $id=$p->{id};
 $ip=$p->{ip};
 $speed_in=$p->{speed_in};
 $speed_out=$p->{speed_out};
 $auth=$p->{auth};
 $dop_param=$p->{dop_param};
 $s_in=$dop_param->{_speed_in};
 $s_out=$dop_param->{_speed_out};
 $a_ports=$dop_param->{_open_ports};
 $udp=$dop_param->{_udp};
 $alldata=$p->{alldata};
 $d_traf=$p->{traf};
# $options=$alldata->{options};
# $options=$p->{options};

 $pipe_in=&Get_Pipe_Num($main_num);
 $pipe_out=$pipe_in+1;

 $Pipe_used{$num}=$pipe_in;
 $Pipe_count{$pipe_in}++;

 system("$FW pipe $pipe_in config bw ${speed_in}Kbit/s");
 system("$FW pipe $pipe_out config bw ${speed_out}Kbit/s");
# system("$FW pipe $pipe_in config bw 2Mbit/s");
# system("$FW pipe $pipe_out config bw 2Mbit/s");


 if ($s_in>0)
 {
    system("$FW pipe $pipe_in config bw ${s_in}Kbit/s");
    system("$FW pipe $pipe_out config bw ${s_in}Kbit/s");
 }

 #system("$FW table 10 add $ip");
 &Add_Tbl_Rule(10,$ip,0);
 return if $auth eq 'ong';

############UA-IX#####################
foreach $i (2..4)
 {
     $speed=$alldata->{"speed$i"};
     $speed or next;
     $pipe=$pipe_in+$i;
     system("$FW pipe $pipe config bw ${speed}Kbit/s");
#     system("$FW table 13 add $ip $pipe");
#     system("$FW table 14 add $ip $pipe");
      &Add_Tbl_Rule(13,$ip,$pipe);
      &Add_Tbl_Rule(14,$ip,$pipe);
 }
######################################

 
# system("$FW table 11 add $ip $pipe_in");
# system("$FW table 12 add $ip $pipe_out");
&Add_Tbl_Rule(11,$ip,$pipe_in);
&Add_Tbl_Rule(12,$ip,$pipe_out);
}
sub Add_Tbl_Rule
{
# return if $Tbl{$_[1]}{$_[0]};
# $Tbl{$_[1]}{$_[0]}=1;
 $Rules.="table $_[0] add $_[1] $_[2]\n";
}

sub Get_Pipe_Num
{
 return($_[0]*2+1000);
}

#############################################
sub Add_Rule
{
 $Rules.=$_[0]."\n";
 $nRules++;
}
#############################################
sub Add_To_Allow_Ip
{
# &Add_Rule("table 1 add $_[0]");
}
############################################
$Del_Files=1;
sub Run_Ipfw_Rules
{
 return unless $Rules;
  my $fname=$Program_dir.'/addip/'.time();
   if (open(F,">>$fname"))
      {
      print F $Rules;
      close (F);
      $Rules='';
      system("$FW $fname");
      unlink $fname if $Del_Files;
      }
}
############################################
sub Delete_From_Allow_Ip
{
# &Add_Rule("table 1 delete $_[0]");
}

sub Add_To_All_Ip {}
sub Delete_From_All_Ip {}
sub Add_To_Table {}
sub Delete_From_Table {}

1;

Цитировать
nas4# ipfw show
00100            0               0 check-state
00200        15222          865560 allow ip from any to any via lo0
00300    777497647    670981331801 allow ip from me to any keep-state
01100   3596451893   1774843751869 allow ip from table(10) to table(10)
01200    115026104     11258846233 allow ip from table(5) to 172.16.21.124,91.214.163.7
01300     12646486     11223258034 allow ip from 172.16.21.124,91.214.163.7 to table(5)
01310       165688        32798812 skipto 1370 ip from table(5) to table(6)
01500       165688        32798812 allow ip from table(5) to table(6)
01510       159942       113297462 allow ip from table(6) to table(5)
01600 374630847462 298612205697016 allow ip from any to any via vlan5
01700  17116634527  14374602295967 allow ip from any to any via vlan11
01900         2301          214136 allow tcp from any to me dst-port 22
02000          635           50166 allow icmp from any to me
02100            0               0 allow ip from table(5) to me dst-port 161
02300         4563          360026 deny ip from any to me
02400     16439030       986825125 deny ip from table(5) to table(5)
02420       599797        36899024 deny ip from table(50) to any
02450  20099405962  25367215063865 allow ip from table(20) to table(13)
02455 160620032436 117274836040441 skipto 2600 ip from table(12) to not table(20)
02460   7823323619   1975828000034 allow ip from table(14) to any
02500 161009480895 142962674475760 allow ip from any to table(11)
02600 146061490331 103193757214633 allow ip from table(12) to any
65400    380659943     26753533506 deny ip from any to any


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 16 Ноября 2012, 15:22:41
а, да. В логах noserver.pl вот такое:

Цитировать
DBD::mysql::st execute failed: ����������� ������� 'revision' � 'field list' at nosat.pm line 245.


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 16 Ноября 2012, 15:37:58
а, да. В логах noserver.pl вот такое:

Цитировать
DBD::mysql::st execute failed: ����������� ������� 'revision' � 'field list' at nosat.pm line 245.

Это пофиксил. Но проблема осталась.


Название: Re: freebsd, pf проблема с доступом
Отправлено: versus от 16 Ноября 2012, 16:05:21
носервер точно работает постоянно ? если пользователи всегда онлайн то как бы вобще не должно их выкидывать


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 16 Ноября 2012, 16:48:46
Да, работает постоянно. Выкидывает. :/


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 20 Ноября 2012, 16:21:38
Какие-то предложения будут? Скажите хоть в какую сторону рыть?


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 21 Ноября 2012, 14:02:03
Указал в настройках сателита группы, которые он должен обслуживать.
Цитировать
id групп клиентов с которыми работаем, перечислите через запятую. Пустая строка - все группы. Если в таблице клиентов доступны только наши группы - ставьте пустую строку

Через запяту прописал пару групп. В итоге noserver.pl все равно смотрит по всем группам. Когда в noserver.pl изменил строку:
Код:
our $Where_grp=$c{Usr_nosrvr_groups}? " AND grp IN($c{Usr_nosrvr_groups})" : '';
на
Код:
our $Where_grp=" AND grp IN(1,2,3,4,5,6,7,8)";
Все заработало. Подскажите куда посмотреть, чтобы все работало нормально.


Название: Re: freebsd, pf проблема с доступом
Отправлено: 0xbad0c0d3 от 21 Ноября 2012, 16:45:54
Возможно вы не дождались пока рестартанется носервер (при изменении конфига сателита, соответствующий сателит перезагружается сам). Ну или вносились какие-то правки в код


Название: Re: freebsd, pf проблема с доступом
Отправлено: stix от 21 Ноября 2012, 16:51:53
нужно бы посмотреть, что находится в $c{Usr_nosrvr_groups}


Название: Re: freebsd, pf проблема с доступом
Отправлено: 0xbad0c0d3 от 21 Ноября 2012, 21:17:12
Код:
select config from conf_sat where login='satellite_login';


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 22 Ноября 2012, 13:50:05
Цитировать
Db_server xxx.xxx.xxx.1
Db_mysql_connect_timeout 5
Db_server_a xxx.xxx.xxx.6
Db_mysql_connect_timeouta 5
Db_name nodeny
Db_usr_table users_kitsman
Usr_nosrvr_groups 1,2,3,4,5,6,7,8
Noserver_monitor 1
Noserver_dopdata_tmpl 1
Period_load_user_info 8
Period_load_all_info 30
Allow_auth_off 0
Allow_unauth 0
Allow_overlimits 0
Start_num_ipfw 5000
End_num_ipfw 32000
Start_num2_ipfw 33000
End_num2_ipfw 60000
DefaultSpeedIn 4096
DefaultSpeedOut 512
Denied_ports 25
Usr_auth_groups
L2_auth_monitor 0
V_auth_Ip
T_usr_block 120
T_get_old 120
T_get_new 10
My_server_ip 0
My_port 7723
Ver_client 14
Nomake_monitor 0


Название: Re: freebsd, pf проблема с доступом
Отправлено: 0xbad0c0d3 от 22 Ноября 2012, 14:34:22
Ну надо глянуть тогда, что, в результате в переменной...
В noserver.pl найти:
Код:
$t=&TimeNow();
&Debug($mess);
$sth=&Sql($msql);
и сделать таким:
Код:
$t=&TimeNow();
&Debug($mess);
&Debug("SQL: ".$msql);
$sth=&Sql($msql);
затем запустить perl noserver.pl -v
а дальше смотрим на вывод и ищем SQL: SELECT .....


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 05 Декабря 2012, 11:40:57
Цитировать
nas2# perl noserver.pl -v | grep SQL
DBD::mysql::st execute failed: ����������� ������� 'revision' � 'field list' at nosat.pm line 245.
SQL: SELECT SQL_BUFFER_RESULT id,mid,ip,auth,lstate,paket FROM users_kitsman WHERE state<>'off'
05.12.2012 11:30:06 Error: SELECT SQL_BUFFER_RESULT id,mid,ip,auth,lstate,paket FROM users_dunaivtsi WHERE state<>'off'
SQL: SELECT SQL_BUFFER_RESULT id,mid,ip,auth,lstate,paket FROM users_kitsman WHERE state<>'off' AND auth<>'off' AND (auth<>'no' OR lstate<>0)
SQL: SELECT SQL_BUFFER_RESULT id,mid,ip,auth,lstate,paket FROM users_kitsman WHERE state<>'off' AND auth<>'off' AND (auth<>'no' OR lstate<>0)

Кажется, все хорошо.


Название: Re: freebsd, pf проблема с доступом
Отправлено: stix от 05 Декабря 2012, 12:09:56
DBD::mysql::st execute failed:
05.12.2012 11:30:06 Error:
не совсем все хорошо

SELECT SQL_BUFFER_RESULT id,mid,ip,auth,lstate,paket FROM users_dunaivtsi WHERE state<>'off'

это что за таблица users_dunaivtsi ?


Название: Re: freebsd, pf проблема с доступом
Отправлено: ser970 от 05 Декабря 2012, 12:22:36
DBD::mysql::st execute failed:
05.12.2012 11:30:06 Error:
не совсем все хорошо

SELECT SQL_BUFFER_RESULT id,mid,ip,auth,lstate,paket FROM users_dunaivtsi WHERE state<>'off'

это что за таблица users_dunaivtsi ?

это походу должна быть вьюха CREATE ALGORITHM = UNDEFINED VIEW users_dunaivtsi AS SELECT * FROM users WHERE grp IN (группы);


Название: Re: freebsd, pf проблема с доступом
Отправлено: stix от 05 Декабря 2012, 12:29:47
DROP VIEW 'users_dunaivtsi';
CREATE ALGORITHM = UNDEFINED VIEW users_dunaivtsi AS SELECT * FROM users WHERE grp IN (через запятую ID твоих групп);


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 05 Декабря 2012, 12:55:29
там users_kitsman должно быть. очепятка)


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 05 Декабря 2012, 13:36:35
Есть вьюха. и на users_dunaivtsi и на users_kitsman


Название: Re: freebsd, pf проблема с доступом
Отправлено: stix от 05 Декабря 2012, 14:20:06
а че ж он тогда ругался на
SELECT SQL_BUFFER_RESULT id,mid,ip,auth,lstate,paket FROM users_dunaivtsi WHERE state<>'off'

?


Название: Re: freebsd, pf проблема с доступом
Отправлено: ser970 от 05 Декабря 2012, 15:24:30
cтукни в аську - помогу


Название: Re: freebsd, pf проблема с доступом
Отправлено: serg_sk от 05 Декабря 2012, 16:48:39
SELECT SQL_BUFFER_RESULT id,mid,ip,auth,lstate,paket FROM users_kitsman WHERE state<>'off'

Вот так должно быть. Нету там dunaivtsi.