+ Responder ao Tópico



  1. #1

    Padrão Userman, Falsos usuários conectados

    Bom dia pessoal,

    Quem usa o userman como servidor Radius já deve ter se deparado com usuários que após alguma falha ficam conectados no userman quando na verdade já não estão mais, então quando eles tentam reconectar eles não conseguem, então nos tecnicos temos que remover a sessão dos mesmos para eles reconectar.

    Após uma incansavel busca na internet achei cerca de 10 scripts, mas nenhum deles funcionou.
    Mikrotik 5.24
    Vou deixar abaixo alguns dos que eu achei. Se alguem tem um que funcione e quer compartilhar fico grato.

    Att leandro

    ------------------------------------------------------------------------------------------------------

    # Script Source : Mikrotik Forums
    # This script remove false active sessions in User Manager v5 or above
    # I only tested it with ver 6.32.1 and it worked very well in a active network. [Jahanzaib]

    # Script Starts Here.
    # Setting Timeout in Seconds
    # Timeout in Seconds, when session update is older -> session closed
    :local Timeout 60

    #------------------------------------------
    :local LastSessionUpdate;
    :local SessionTimeout;
    :foreach i in=[/tool user-manager session find where active=yes] do={

    # When was the last Update of the session-informations
    :set LastSessionUpdate [/tool user-manager session get $i till-time]

    # SessionTimeout is a value that tells me how many seconds ago the last update of this session was
    :set SessionTimeout ([system clock get time] - [ick $LastSessionUpdate ([:find $LastSessionUpdate " "]+1) [:len $LastSessionUpdate]]-[/system clock get gmt-offset])

    # if last update is more then Timeout seconds ago then close session and log it
    :if ($SessionTimeout > $Timeout) do={
    /tool user-manager session remove numbers=$i
    :log warning (" Removed false active session by Zaib - Username is " . [/tool user-manager session get $i user]);
    }
    }






    -----------------------------------------------------------------------------------------------------------------------------------------------------------------


    #This script remove false active sessions in User Manager v5
    #when the last update of the session (till-time) is to long ago then the session will be closed

    #Setting Timeout in Seconds (my UserManager update session every minute),
    #Timeout in Seconds, when session update is older -> session clossed
    :local Timeout 60

    #------------------------------------------
    :local LastSessionUpdate;
    :local SessionTimeout;
    :foreach i in=[/tool user-manager session find where active=yes] do={
    #when was the last Update of the session-informations
    :set LastSessionUpdate [/tool user-manager session get $i till-time]
    #SessionTimeout is a value that tells me how many seconds ago the last update of this session was
    :set SessionTimeout ([system clock get time] - [ick $LastSessionUpdate ([:find $LastSessionUpdate " "]+1) [:len $LastSessionUpdate]]-[/system clock get gmt-offset])
    #if last update is more then Timeout seconds ago then close session and log it
    :if ($SessionTimeout > $Timeout) do={
    /tool user-manager session close-session numbers=$i
    :log info (" removed false active session" . [/tool user-manager session get $i user]);
    }
    }


    ---------------------------------------------------------------------------------------------------

    # ver. 1.0 2013-09-06
    # ver. 1.1 2013-11-01 - end of the month all sessions get killed problem solved
    # - logging killed sessions in log as warning
    # ver. 1.2 2014-03-09 - GMToffset not needed in 6.10 and higher (possibly 6.x)
    #
    # SCRIPT: radius-close-inactive-sessions
    # PURPOSE: close sessions which are active in radius, but last-seen is older than $actTimeout
    # this typically happens when client site loses connection to radius and user leaves hotspot
    #------------------------------------------------------------------------------

    # settings
    # --------
    # enable debugging { false | true }
    local debug true
    # after how many seconds of inactivity kill the session
    local actTimeout (10*60)
    # offset from GMT - this is not needed in User Manager 6.10 and higher - should be 0
    local GMToffset [/system clock get gmt-offset]
    if ( [/system clock get dst-active] != yes ) do={ :set GMToffset ( $GMToffset - 3600 ) }
    local GMToffset 0


    # variables
    # ---------
    local sessions
    local testD [/system clock get date]
    local testDayOfMonth [ick $testD 4 6]
    local testT [/system clock get time]
    local testTsec ( ($testDayOfMonth*24*3600) + [ick $testT 0 2]*3600 + [ick $testT 3 5]*60 + [ick $testT 6 8] )

    :set sessions [/tool user-manager session find where active=yes]

    if ($debug = true) do={
    ut ("testD: " . $testD)
    ut ("testDayOfMonth: " . $testDayOfMonth )
    ut ("testT: " . $testT)
    ut ("testTsec: " . $testTsec)
    ut ("Sessions: " . [:len $sessions])
    }

    foreach session in $sessions do={
    :local userName [/tool user-manager session get $session user ]
    :local uptime [/tool user-manager session get $session uptime ]
    :local hostIP [/tool user-manager session get $session "host-ip" ]
    :local lastSeen [/tool user-manager user get $userName last-seen ]

    local lastActD [ick $lastSeen 0 11]
    local lastActDayOfMonth [ick $lastSeen 4 6]
    local lastActT [:totime [ick $lastSeen 12 20]]

    local lastActTsec ( ($lastActDayOfMonth*24*3600) + [ick $lastActT 0 2]*3600 + [ick $lastActT 3 5]*60 + [ick $lastActT 6 8] )

    if ($debug = true) do={
    ut ("id=".$session . " " . " user " . $userName . " uptime " . $uptime . " lastSeen " . $lastSeen . " hostIP ". $hostIP)
    ut ("lastActD: " . $lastActD)
    ut ("lastActDayOfMonth: " . $lastActDayOfMonth)
    ut ("lastActT: " . $lastActT)
    ut ("lastActTsec: " . $lastActTsec)
    }
    :set lastActTsec ($lastActTsec + $GMToffset)
    if ($debug = true) do={
    ut ("lastActTsec after GMT correction: " . $lastActTsec)
    }

    #make sure we are at least end of month + $actTimeout
    if ( $testTsec > $actTimeout) do={
    #difference is bigger than $actTimeout, but not bigger than 27 days (new month)
    #for period localtime-GMT script will be ineffective once a month
    if ( (($testTsec - $lastActTsec) > $actTimeout) and (($testTsec - $lastActTsec) < 27*3600*24) ) do={
    if ($debug = true) do={
    ut ("radius inactive session killed, difference " . ($testTsec - $lastActTsec) . "s actTimeout=" . $actTimeout . "s")
    }
    /tool user-manager session close-session $session
    :log warning ("radius inactive session killed, difference " . ($testTsec - $lastActTsec) . " user " . $userName . " uptime " . $uptime . " lastSeen " . $lastSeen . " hostIP ". $hostIP)
    } else={
    if ($debug = true) do={
    ut ("No need kill session, difference " . ($testTsec - $lastActTsec) . "s actTimeout=" . $actTimeout . "s")
    }
    }
    }
    }




    ---------------------------------------------------------------------------------------------------




    # remove-false-active-sessions script
    # by Vichaya Sirisanthana

    # Policy
    #
    # ftp reboot
    # x read x write
    # policy x test
    # password sniff
    # sensitive


    # :log info "Running script remove-false-active-sessions"

    # Change path to userman session
    /tool user-manager session

    # Loop thru each active session
    :foreach session in=[find where active=yes] do={

    :local sessionTillTime [get $session till-time]
    # :local sessionTimeout ([/system clock get time] - [ick $sessionTillTime ([:find $sessionTillTime " "]+1) [:len $sessionTillTime]] - [/system clock get gmt-offset])
    # :local sessionTimeout ([/system clock get time] - [ick $sessionTillTime ([:find $sessionTillTime " "]+1) [:len $sessionTillTime]])
    :local sessionTimeout (([/system clock get time] - [/system clock get gmt-offset]) - ([ick $sessionTillTime ([:find $sessionTillTime " "]+1) [:len $sessionTillTime]] - [/tool user-manager customer get [find login=punspace] time-zone]))

    # If sessionTimeout is negative, it may be a new day so add 24 hours.
    :if ($sessionTimeout < 0) do={
    # :log info "sessionTimeout is negative: $sessionTimeout"
    :set sessionTimeout ($sessionTimeout + [:totime 86400])
    # :log info "sessionTimeout is: $sessionTimeout"
    }

    # Remove session if last session update (session till time) is more than 2 minutes ago
    :if ($sessionTimeout > 120) do={

    :local sessionUser [get $session user]
    :local sessionUserIp [get $session user-ip]
    :local sessionFromTime [get $session from-time]
    :local sessionUptime [get $session uptime]

    # :log info "Removing session $session $sessionUser $sessionUserIp $sessionFromTime $sessionTillTime $sessionUptime $sessionTimeout"

    :do {
    remove numbers=$session

    :log info "Successfully removed session $session $sessionUser $sessionUserIp $sessionFromTime $sessionTillTime $sessionUptime $sessionTimeout"
    } on-error={
    :log error "Failed to remove session $session $sessionUser $sessionUserIp $sessionFromTime $sessionTillTime $sessionUptime $sessionTimeout"
    }
    }
    }

    # Reset path to root
    /

    # :log info "Finished running script remove-false-active-sessions"




    ------------------------------------------------------------------------------------------
    Última edição por leandrocarlesso; 15-08-2016 às 15:53.

  2. #2

    Padrão Re: Userman, Falsos usuários conectados

    Isso só será um problema se você tem vários usuários conectando por PPPoE através do mesmo MAC, por exemplo no caso de ter um PTP sem estar em bridge transparente (sem WDS), onde todos os usuários atrás daquela antena vem para o concentrador com o MAC da antena, e não do próprio cliente.

    Se sua rede não tem esse problema, então é só você marcar a opção "One Session Per Host" no servidor PPPoE que ta resolvido.

    Agora se você tem esse problema, tem que começar a trabalhar nas gambiarras. Esse problema geralmente ocorre por problemas de comunicação, onde o CLIENTE remete novo pedido de conexão pois ele caiu, mas não comunicou a RB que caiu justamente porque naquele momento não tinha comunicação entre os 2. Ou seja, o CLIENTE acha que caiu, mas a RB não sabe disse e não derruba ele, e assim o cliente pede novo pedido de conexão, fazendo a conexão antiga ficar inativa. Você pode, por exemplo, colocar no perfil para 2 usuários simultâneos, e um Idle Timeout que achar interessante. Assim, a reconexão do usuário vai funcionar pois ele está habilitado a ter 2 simultâneas, e a antiga vai cair depois do tempo definido em Idle Timeout pois não vai mais ter uso devido ao cliente já não conhecer mais aquela sessão.

  3. #3

    Padrão Re: Userman, Falsos usuários conectados

    Não, a rede é separada em varias vlans, e tudo em bridge wds, cada cliente com seu mac, e ativado a opção 1 conexão por usuário.

    Só que acontece de vez em quando quando algum cliente desconecta por queda de luz etc.. ele não desconecta do userman ai tenho que fazer manual, tenho cerca de 1200 sessões simultaneas e a cada 2 3 dias aparece alguns users que não desconectam.

    Att leandro

  4. #4

    Padrão Re: Userman, Falsos usuários conectados

    Entendi, a sessão fica ativa no User Manager.

    A versão do RouterOS que você usa, ja tem os script de On Up e On Down nos perfil do PPPoE? Se tem, da pra tentar desenvolver um script ali, que na hora que a interface cai, ele desloga todas as sessões daquele usuário no user-manager, e assim ocupa menos processamento. Se você criar um script que rode todas as sessões de tempo em tempo, vai pesar muito no processamento sem necessidade, reverificando o que não precisa reverificar.

    Vo dar uma olhada depois nessa questão, e se eu conseguir um script funcionar nesse sentido posto aqui. Vou fazer levando em consideração que tenha script no perfil de PPPoE (acho que os scripts de On Up e On Down foram inteoduzidor por volta da versão 6.30).

  5. #5

    Padrão Re: Userman, Falsos usuários conectados

    Sim o concetrador ppoe é uma ccr1016 com 6.33.5 já possui os scripts.

    valeu

  6. #6

    Padrão Re: Userman, Falsos usuários conectados

    Desculpe a ignorância, mas o userman é um servidor radius com banco de dados em MySQL por exemplo?

    Enviado via XT1563 usando UnderLinux App

  7. #7

    Padrão Re: Userman, Falsos usuários conectados

    Pois é. Esse problema de "prender" a conexão é algo bastante comum no freeradius, uso muito ele, quando usado o módulo sql para distribuição de ip aleatoriamente.

    Eu fiz uma estrutura de controle enorme no MySQL e + alguns scripts para ajudar nesse caso, mas não tem jeito, quando tem reconexões em massa, por problema oriundo de falha de rede o esquema fica crítico e tem que intervir com scripts estáticos.

    Enviado via XT1563 usando UnderLinux App

  8. #8

    Padrão Re: Userman, Falsos usuários conectados

    E ai pessoal consegui desenvolver um script com base nos que postei, roda bem rapido cerca de 2segundos. E vou por pra ele rodar a cada 30min. Valeu pela ajuda.

  9. #9

    Padrão Re: Userman, Falsos usuários conectados

    Compartilha o script. Compartilhar e bom para ajudar os mesmos com um possível problema igual ao seu.

  10. #10

    Padrão Re: Userman, Falsos usuários conectados

    Coloca ai o script, já que conseguiu. Vlw

  11. #11

    Padrão Re: Userman, Falsos usuários conectados

    rapaz eu uso USER MANAGER com cartões, nele inclui código QR CODE, assim o usuário pode autenticar pela internet escaneando esse código, o seu problema ai é fácil de resolver, vou sugirir algo que uso aqui.

    Usei Idle timeout para 00:02:00, assim o cliente será desconectado com 2 minutos de inatividade, e configura a opção MAC COKIE PARA 30 DIAS, dentro do profile Hotspot use também a opção MAC COKIE, assim o cliente só vai precisar autenticar uma vez, após autenticado ele ficara nessa lista do MAC COKIE por 30 dias, assim quando ele for desconectado pelo tempo de inatividade e reconectar na rede wifi, o sistema vai identificar que ele ja foi conectado, esta na lista MAC COKIE e o acesso será liberado