Исправление взаимодействия CaptivePortal c Radius`ом



  • Доброго дня!
    Может ли кто-то из знатоков php мне помочь?
    Ситуация такая:

    1. для доступа клиентов используется связка CaptivePortal с радиус-авторизацией
    2. радиус (и сам биллинг) находятся на другой машине.
    3. авторизация проходит успешно.
    4. настройки аккаунтинга на 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



  • @vlad:

    Суть проблемы - значение в поле  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
    Пытаюсь самостоятельно вычислить место в коде, но пока не получаю никакого эффекта.
    В связи с этим вопрос - нужно ли после изменения в коде перегружать всю систему или мои правки вступят в силу "на лету"?



  • @vlad:

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



  • Юзера как-нибудь биллинг отключает?


Log in to reply