Исправление взаимодействия CaptivePortal c Radius`ом
-
Доброго дня!
Может ли кто-то из знатоков php мне помочь?
Ситуация такая:- для доступа клиентов используется связка CaptivePortal с радиус-авторизацией
- радиус (и сам биллинг) находятся на другой машине.
- авторизация проходит успешно.
- настройки аккаунтинга на CaptivePortal:
- send RADIUS accounting packet
- reauthenticate connected users every minute
- stop/start accounting
- RADUIS Type - cisco
Суть проблемы - значение в поле Acct-Session-Time после пакета Stop не обнуляется, а растет. Т.е. после минуты работы значение 60, после 2-х - 120 и т.д. Биллинг же ожидает в пакете Stop время работы с момента пакета Start.
Мои ковыряния в файле /usr/local/captiveportal/radius_accounting.inc не принесли результата.
-
Указывайте версию pfSense.
-
Версия 1.2.3-RELEASE
-
Суть проблемы - значение в поле Acct-Session-Time после пакета Stop не обнуляется, а растет. Т.е. после минуты работы значение 60, после 2-х - 120 и т.д. Биллинг же ожидает в пакете Stop время работы с момента пакета Start.
Мои ковыряния в файле /usr/local/captiveportal/radius_accounting.inc не принесли результата.Я так понимаю в функции
function RADIUS_ACCOUNTING_STOP($ruleno,$username,$sessionid,$start_time,$radiusip,$radiusport,$radiuskey,$clientip,$clientmac, $term_cause = 1, $interimupdate=false,$stop_time = null) { ... $stop_time = (empty($stop_time)) ? time() : $stop_time; $session_time = $stop_time - $start_time; ...
Судя по коду $session_time вычисляется исходя из $stop_time - $start_time;
Где-то в другом месте $start_time при ре-аунтентификации не обновляет свое значение.
Возможно разработчики исходили из других соображений.
Вы можете в функции ре-аунтентификации задать строку $start_time = time(); -
Дело в том, что пытался самостоятельно воткуть в код подобную замену значения переменной
(правда, в виде $start_time = $stop_time;), но не достиг нужного результата.
Не подскажете, куда именно нужно поместить это выражение?UPDATE
Пытаюсь самостоятельно вычислить место в коде, но пока не получаю никакого эффекта.
В связи с этим вопрос - нужно ли после изменения в коде перегружать всю систему или мои правки вступят в силу "на лету"? -
Дело в том, что пытался самостоятельно воткуть в код подобную замену значения переменной
(правда, в виде $start_time = $stop_time;), но не достиг нужного результата.
Не подскажете, куда именно нужно поместить это выражение?UPDATE
Пытаюсь самостоятельно вычислить место в коде, но пока не получаю никакого эффекта.
В связи с этим вопрос - нужно ли после изменения в коде перегружать всю систему или мои правки вступят в силу "на лету"?Думаю на лету, если эти скрипты вызываются сервером CP.
-
Если кому-то будет интересно - опишу, как решил задачу.
Обратил внимание, что в логе RADUIS-сервера, приходящий от PfSense пакет STOP имеет 2 (ДВА!) поля
Acct-Session-Time - 5 и 20 параметры.
В скрипте radius_accounting.inc заменил строку
$racct->putAttribute(RADIUS_ACCT_SESSION_TIME, $session_time, "integer");
на
$racct->putAttribute(RADIUS_ACCT_SESSION_TIME, 61, "integer");
61 сек., а не 60 из-за задержек, так считает точнее.
Что имеем в итоге:
NAS-IP-Address = 192.168.x.x
NAS-Identifier = "xxx.nas.local"
User-Name = "00004738"
Acct-Status-Type = Stop
Acct-Session-Time = 1113
Acct-Authentic = RADIUS
Service-Type = Login-User
NAS-Port-Type = Ethernet
NAS-Port = 7
Acct-Session-Id = "77fa9de6318ebf74"
Framed-IP-Address = 192.168.x.x
Called-Station-Id = "c4:2c:03:xx:xx:xx"
Calling-Station-Id = "192.168.x.x"
Acct-Input-Packets = 480
Acct-Input-Octets = 72471
Acct-Input-Gigawords = 0
Acct-Output-Packets = 575
Acct-Output-Octets = 624283
Acct-Output-Gigawords = 0
Acct-Session-Time = 62
Acct-Terminate-Cause = NAS-Request
Client-IP-Address = 192.168.x.x
Acct-Unique-Session-Id = "bc7f07ab42xxxxxx"
Timestamp = 1305702304
первое вхождение Acct-Session-Time = 1113 - общая длительность работы клиента
второе Acct-Session-Time = 62 - идет позже, и поэтому именно оно учитывается биллингом. -
Юзера как-нибудь биллинг отключает?