Дублирующие IP адреса

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

Автор Abills конечно мне предложил перейти на rlm_perl
так вот почему там многопотоковый перл не поддерживается :D

nsa
Сообщения: 41
Зарегистрирован: Пт авг 01, 2008 4:55 am

Сообщение nsa »

ran писал(а):ещёб дебаг лог радиуса посмотреть... в этой ситуёвине разумеется
logs:

pppd:

Oct 23 12:15:52 forum pppd[16557]: pppd 2.4.4 started by root, uid 0
Oct 23 12:15:52 forum pppd[16557]: Using interface ppp1
Oct 23 12:15:52 forum pppd[16557]: Connect: ppp1 <--> /dev/pts/1
Oct 23 12:15:54 forum pppd[16562]: Plugin radius.so loaded.
Oct 23 12:15:54 forum pppd[16562]: RADIUS plugin initialized.
Oct 23 12:15:54 forum pppd[16562]: Plugin radattr.so loaded.
Oct 23 12:15:54 forum pppd[16562]: RADATTR plugin initialized.
Oct 23 12:15:54 forum pppd[16562]: Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
Oct 23 12:15:54 forum pppd[16562]: pppd 2.4.4 started by root, uid 0
Oct 23 12:15:54 forum pppd[16562]: Using interface ppp49
Oct 23 12:15:54 forum pppd[16562]: Connect: ppp49 <--> /dev/pts/51
Oct 23 12:15:56 forum pppd[16557]: MPPE 128-bit stateless compression enabled
Oct 23 12:15:56 forum pppd[16562]: MPPE 128-bit stateless compression enabled
Oct 23 12:15:57 forum pppd[16557]: local IP address 192.168.0.1
Oct 23 12:15:57 forum pppd[16557]: remote IP address 192.168.5.2
Oct 23 12:15:59 forum pppd[16562]: local IP address 192.168.0.1
Oct 23 12:15:59 forum pppd[16562]: remote IP address 192.168.5.2

radiusd:

364 - й запрос
rad_recv: Accounting-Request packet from host 10.241.0.254:60891, id=73, length=112
Acct-Session-Id = "490032BD40AD00"
User-Name = "kompik1"
Acct-Status-Type = Start
Service-Type = Framed-User
Framed-Protocol = PPP
Calling-Station-Id = "10.241.0.99"
Acct-Authentic = RADIUS
NAS-Port-Type = Async
Framed-IP-Address = 192.168.5.2
NAS-IP-Address = 10.241.0.254
NAS-Port = 1
Acct-Delay-Time = 0
Processing the preacct section of radiusd.conf
modcall: entering group preacct for request 364
modcall[preacct]: module "preprocess" returns noop for request 364
rlm_acct_unique: Hashing 'NAS-Port = 1,Client-IP-Address = 10.241.0.254,NAS-IP-Address = 10.241.0.254,Acct-Session-Id = "490032BD40AD00",User-Name = "kompik1"'
rlm_acct_unique: Acct-Unique-Session-ID = "d93e0edba9f72768".
modcall[preacct]: module "acct_unique" returns ok for request 364
rlm_realm: No '@' in User-Name = "kompik1", looking up realm NULL
rlm_realm: No such realm "NULL"
modcall[preacct]: module "suffix" returns noop for request 364
acct_users: Matched entry DEFAULT at line 17
modcall[preacct]: module "files" returns ok for request 364
modcall: leaving group preacct (returns ok) for request 364
Processing the accounting section of radiusd.conf
modcall: entering group accounting for request 364
radius_xlat: '/var/log/freeradius/radacct/10.241.0.254/detail'
rlm_detail: /var/log/freeradius/radacct/%{Client-IP-Address}/detail expands to /var/log/freeradius/radacct/10.241.0.254/detail
modcall[accounting]: module "detail" returns ok for request 364
modcall[accounting]: module "unix" returns ok for request 364
radius_xlat: '/var/log/freeradius/radutmp'
radius_xlat: 'kompik1'
modcall[accounting]: module "radutmp" returns ok for request 364
modcall: leaving group accounting (returns ok) for request 364
radius_xlat: '/usr/abills/libexec/racct.pl'
Exec-Program: /usr/abills/libexec/racct.pl
Exec-Program output:
Exec-Program: returned: 0
Sending Accounting-Response of id 73 to 10.241.0.254 port 60891
Finished request 364

Going to the next request

365 - й Запрос
rad_recv: Accounting-Request packet from host 10.241.0.254:60891, id=74, length=115
Acct-Session-Id = "490032BF40B200"
User-Name = "kompik2"
Acct-Status-Type = Start
Service-Type = Framed-User
Framed-Protocol = PPP
Calling-Station-Id = "10.241.243.253"
Acct-Authentic = RADIUS
NAS-Port-Type = Async
Framed-IP-Address = 192.168.5.2
NAS-IP-Address = 10.241.0.254
NAS-Port = 49
Acct-Delay-Time = 0
Processing the preacct section of radiusd.conf
modcall: entering group preacct for request 365
modcall[preacct]: module "preprocess" returns noop for request 365
rlm_acct_unique: Hashing 'NAS-Port = 49,Client-IP-Address = 10.241.0.254,NAS-IP-Address = 10.241.0.254,Acct-Session-Id = "490032BF40B200",User-Name = "kompik2"'
rlm_acct_unique: Acct-Unique-Session-ID = "74b13f65297a0d0f".
modcall[preacct]: module "acct_unique" returns ok for request 365
rlm_realm: No '@' in User-Name = "kompik2", looking up realm NULL
rlm_realm: No such realm "NULL"
modcall[preacct]: module "suffix" returns noop for request 365
acct_users: Matched entry DEFAULT at line 17
modcall[preacct]: module "files" returns ok for request 365
modcall: leaving group preacct (returns ok) for request 365
Processing the accounting section of radiusd.conf
modcall: entering group accounting for request 365
radius_xlat: '/var/log/freeradius/radacct/10.241.0.254/detail'
rlm_detail: /var/log/freeradius/radacct/%{Client-IP-Address}/detail expands to /var/log/freeradius/radacct/10.241.0.254/detail
modcall[accounting]: module "detail" returns ok for request 365
modcall[accounting]: module "unix" returns ok for request 365
radius_xlat: '/var/log/freeradius/radutmp'
radius_xlat: 'kompik2'
modcall[accounting]: module "radutmp" returns ok for request 365
modcall: leaving group accounting (returns ok) for request 365
radius_xlat: '/usr/abills/libexec/racct.pl'
Exec-Program: /usr/abills/libexec/racct.pl
Exec-Program output:
Exec-Program: returned: 0
Sending Accounting-Response of id 74 to 10.241.0.254 port 60891
Finished request 365

nsa
Сообщения: 41
Зарегистрирован: Пт авг 01, 2008 4:55 am

Сообщение nsa »

ran писал(а):
Автор Abills конечно мне предложил перейти на rlm_perl
так вот почему там многопотоковый перл не поддерживается :D
Я на него не переходил еще!
Автор мне написал: - "что реже будет этих ошибок в случае перехода на rlm_perl".
Вот и думаю на статику переходить или всё же мучать rlm_perl, хотя до abills использовал nibs и там по крайней мере проблем с пулами не было.

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

та эт уже не интересно... нада то что ДО старт пакета

chtito2
Сообщения: 479
Зарегистрирован: Чт апр 17, 2008 5:26 pm

Сообщение chtito2 »

nsa писал(а): Автор мне написал: - "что реже будет этих ошибок в случае перехода на rlm_perl".
Вот и думаю на статику переходить или всё же мучать rlm_perl, хотя до abills использовал nibs и там по крайней мере проблем с пулами не было.
Этих проблем не должно быть вобще, тем более в продукте с претензией на коммерциализацию. Хотя бы если в доках написали бы, что с многопоточным радиусом использовать не рекомендуется...

P.S.: кстати, в настоящий момент тестируем свой воркараунд в производстве. 10 минут проблем пока никаких. Надеюсь это поможет избавиться от наболевшей проблемы.

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

P.S.: кстати, в настоящий момент тестируем свой воркараунд в производстве. 10 минут проблем пока никаких
вау! 10 минут - это круто (с учётом месячной подготовки) :D чё ж не рассказываешь что там всё же было? дубликаты? ;) или анафига выяснять? эксперимен - здец - а может так - здец - а может эдак - здец - ташош такое - изучение ституёвины :D

chtito2
Сообщения: 479
Зарегистрирован: Чт апр 17, 2008 5:26 pm

Сообщение chtito2 »

Ну пока проблем не было. А они и не сразу бывают. Прогоним еще несколько дней, видно будет. На ночь на всякий случай вырубили.

nsa
Сообщения: 41
Зарегистрирован: Пт авг 01, 2008 4:55 am

Сообщение nsa »

chtito2 писал(а):Кажется проблема решена, т.к. после сделанных изменений в коде, связанных с локингом во время выдачи IP и занесением выданного IP в черный список на одну минуту (до прихода RADIUS start пакета), уже 3 дня нет ни одной жалобы! Особое спасибо ran'у за то, что он надоумил меня искать проявления проблемы дублированных IP на терминирующем железе Cisco (видимо сказывается его опыт нахождения ошибок на стороне pppd), а ему в свою очередь подсказала решение похожая проблема другого страждующего юзера на форуме, которому тоже спасибо ;) Все это заставило меня проанализировать код Абиллса на предмет выдачи IP адресов и обнаружить, что код некорректно работает в мультипоточном режиме и способен выдавать дубликаты даже при средней загрузке. Далее в коде были сделаны необходимые изменения, ликвидирующие проблему. Действительно, когда я до изменений выполнил команду IOS clear pppoe all, инсценировав тем самым одновременный выход всех юзеров и их последующий заход, проблема не заставила себя долго ждать: уже через несколько попыток show users обнаружила дублированные IP у некоторых юзеров, и следовательно инет не работал ни у одного из них (или быть может работал только у одного, что ничуть не лучше)! После моих изменений проблема перестала себя проявлять. И спасибо realmarkiz'у за то, что он только подтвердил мои догадки. Еще одно спасибо летит в лоб нашему нетворк гаю за то, что он так долго не помог мне найти проблему мониторя киску самостоятельно ;) И конечно же спасибо Асмодеусу за то, что в его софте так легко фиксить баги, а также за то, что Абиллс такой хороший и бесплатный ;)

Так это в коде сделаны изменения или всё таки выключена много поточность в radius описаная выше и изменения в radiusd.conf ?


Можете поделиться кодом?

chtito2
Сообщения: 479
Зарегистрирован: Чт апр 17, 2008 5:26 pm

Сообщение chtito2 »

Конечно. Я не вредный :) Для этого вам нужно:
1) Выполнить действия, указанные в теме Корректный подсчет Ipn трафика для юзеров с динам. адресами. Хоть оно изначально не предназначалось для выдачи IP адресов, подошло и под него тютелька в тютельку. Красивая вещь code reuse! :)

2) В Abills/mysql/Auth.pm добавить функцию get_ip_safely():
sub get_ip_safely {
my $self = shift;
$self->query($db, 'SET AUTOCOMMIT=0', 'do');
$self->query($db, 'LOCK TABLES ippools READ, nas_ippools READ, nas_ippools np READ, dv_calls c READ, dirty_ip WRITE', 'do');
my $ip = $self->get_ip(@_);
$self->query($db, "REPLACE INTO dirty_ip SET framed_ip_address='$ip', uid='$self->{UID}';", 'do');
$self->query($db, 'COMMIT', 'do');
$self->query($db, 'UNLOCK TABLES;', 'do');


return $ip;
}
Примечание:SET AUTOCOMMIT=0 и COMMIT полезно если вы как и я используете Innodb. В остальных случаях возможно не нужно.

3) Внутри функции dv_auth() заменить оба вызова get_ip на get_ip_safely.

Вобщем-то вот и все. Конфиг radius остается без изменений. Код годен для работы с Abills-0.4 примерно за 12-е сентября.

nsa
Сообщения: 41
Зарегистрирован: Пт авг 01, 2008 4:55 am

Сообщение nsa »

chtito2 писал(а): sub get_ip_safely {
my $self = shift;
$self->query($db, 'SET AUTOCOMMIT=0', 'do');
$self->query($db, 'LOCK TABLES ippools READ, nas_ippools READ, nas_ippools np READ, dv_calls c READ, dirty_ip WRITE', 'do');
my $ip = $self->get_ip(@_);
$self->query($db, "REPLACE INTO dirty_ip SET framed_ip_address='$ip', uid='$self->{UID}';", 'do');
$self->query($db, 'COMMIT', 'do');
$self->query($db, 'UNLOCK TABLES;', 'do');


return $ip;
}
Сделал все изменения касательно функции dv_auth()!

Также добавил фунцию get_ip_safely() пришлось изменить

$self->query($db, 'LOCK TABLES ippools READ, nas_ippools READ, nas_ippools np READ, dv_calls c READ, dirty_ip WRITE', 'do');

на

$self->query($db, 'LOCK TABLES ippools READ, nas READ, nas np READ, dv_calls c READ, dirty_ip WRITE', 'do');

Так как таблицы в 0.37b nas_ippools еще не было!

Попробовал подключиться, успешно в таблице dirty_ip появился bill_id
привязанный к ip адресу, но как быть после отключения должна происходить очистка dirty_ip?

После повторного подключения адрес не изменился!
Так вот процедура очистки dirty_ip должна существовать или нет?

IPN в данный момент не использую поэтому пропустил некоторые действия описаные в
viewtopic.php?t=4162&highlight=dirtyip

chtito2
Сообщения: 479
Зарегистрирован: Чт апр 17, 2008 5:26 pm

Сообщение chtito2 »

nsa писал(а):Так вот процедура очистки dirty_ip должна существовать или нет?
Да, конечно, одна из операций по линку.
IPN в данный момент не использую поэтому пропустил некоторые действия описаные в
Ipn они касаются лишь косвенно т.к. вся работа ведется в Auth.pm & Acct.pm.
Действия описывают:
- создание таблицы dirty_ip;
- удаление мусора из dirty_ip во время Stop пакета;
- исключение адресов из dirty_ip из доступных новому клиенту;
- выделение того же самого IP адреса юзеру в течение минуты.

Пункты 1, 2 и 3 для вас обязательны, а выделение того же IP мне нужно было для корректной работы traffic2sql, но и вам не навредит. Так что лучше сделайте все. Когда заработает - уже оптимизируйте под себя.

~AsmodeuS~
Site Admin
Сообщения: 5749
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Сообщение ~AsmodeuS~ »

не понимаю зачем ещё одна таблица если и так все данные в dv_calls;

chtito2
Сообщения: 479
Зарегистрирован: Чт апр 17, 2008 5:26 pm

Сообщение chtito2 »

В dv_calls только онлайн абоненты, а вносятся в онлайн они только во время RADIUS Start пакета. Поэтому после авторизации необходимо пометить выданный адрес как занятый до прихода старт пакета, чтобы он не успел выдасться кому-то еще.

chtito2
Сообщения: 479
Зарегистрирован: Чт апр 17, 2008 5:26 pm

Сообщение chtito2 »

chtito2 писал(а):1) Выполнить действия, указанные в теме Корректный подсчет Ipn трафика для юзеров с динам. адресами.
Важно: По линку код в пункте 3 был изменен, чтобы учитывать только адреса, принадлежающие пулу обрабатываемого юзера как занятые, а не все. Рекомендуется обновицца.

Ответить