+ Responder ao Tópico



  1. #1

    Padrão FreeRadius e SqlIpPool erro nas queries

    Olá,

    Tenho instalado um freeradius + mysql + debian e este autenticando os meus usuários pppoe.
    O que acontece é que começarei agora a usar o modulo sqlippool para fornecer ips para os clientes.
    O radius fornece o IP normal, porém ele não atualiza a tabela na linha do determinado IP preenchendo as informações de
    nasipaddress, expiry_time, etc...
    e como consequencia tambem não faz o accounting, nem a liberação do ip na tabela radippool.



    Eis algumas saidas de logs


    Ao cliente logar pppoe aparece o seguinte:
    Wed Oct 29 13:29:30 2014 : Error: sqlippool_command: database query error in: 'UPDATE radippool SET nasipaddress = 'xxx.xxx.xxx.xxx', pool_key = 'xxx.xxx.xxx.xxx-2147484007', callingstationid = '24:A4:3C0:58:9C', username = 'usuario', expiry_time = NOW() + INTERVAL 3600 SECOND WHERE framedipaddress = '186.227.249.65' AND expiry_time IS NULL'


    Ao cliente deslogar o pppoe:
    Wed Oct 29 13:28:58 2014 : Error: sqlippool_command: database query error in: 'UPDATE radippool SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', expiry_time = NULL WHERE nasipaddress = 'xxx.xxx.xxx.xxx' AND pool_key = 'xxx.xxx.xxx.xxx-2147484006' AND username = 'usuario' AND callingstationid = '24:A4:3C0:58:9C' AND framedipaddress = 'yyy.yyy.yyy.yyy''


    Ambas as queries se eu copiar e colar direto no mysql-workbench por exemplo, executa normal.


    A tabela radippool é INNODB, eis o script de criação dela...
    CREATE TABLE radippool (
    id int(11) unsigned NOT NULL auto_increment,
    pool_name varchar(30) NOT NULL,
    framedipaddress varchar(15) NOT NULL default '',
    nasipaddress varchar(15) NOT NULL default '',
    calledstationid VARCHAR(30) NOT NULL,
    callingstationid VARCHAR(30) NOT NULL,
    expiry_time DATETIME NULL default NULL,
    username varchar(64) NOT NULL default '',
    pool_key varchar(30) NOT NULL,
    PRIMARY KEY (id),
    KEY radippool_poolname_expire (pool_name, expiry_time),
    KEY framedipaddress (framedipaddress),
    KEY radippool_nasip_poolkey_ipaddress (nasipaddress, pool_key, framedipaddress)
    ) ENGINE=InnoDB;

    Qualquer ajuda será muito bem vinda.




    Obrigado.



    Obs: Já verifiquei nomes de campos, tabelas, etc...tudo certo.

  2. #2

    Padrão Re: FreeRadius e SqlIpPool erro nas queries

    Depois desse log, ele não cita o erro que ocorreu? Qual a versão do FreeRadius e do MySQL?

  3. #3

    Padrão Re: FreeRadius e SqlIpPool erro nas queries

    Não aparece mais nada.
    O mais estranho é que ele fornece o IP que esta no pool, então o problema não é a conexão com o banco, pois ele busca o ip la.
    E se eu pego essa query do erro, copio e colo direto no mysql, funfa direitinho hehheh. Ta me deixando louco isso.

    Eis as versões.


    operador@radius:~$ dpkg -l |egrep 'freeradius|mysql-server'
    ii freeradius 2.1.10+dfsg-2 a high-performance and highly configurable RADIUS server
    ii freeradius-common 2.1.10+dfsg-2 FreeRADIUS common files
    ii freeradius-mysql 2.1.10+dfsg-2 MySQL module for FreeRADIUS server
    ii freeradius-utils 2.1.10+dfsg-2 FreeRADIUS client utilities
    ii libfreeradius2 2.1.10+dfsg-2 FreeRADIUS shared library
    ii mysql-server 5.1.63-0+squeeze1 MySQL database server (metapackage depending on the latest version)
    ii mysql-server-5.1 5.1.63-0+squeeze1 MySQL database server binaries and system database setup
    ii mysql-server-core-5.1 5.1.63-0+squeeze1 MySQL database server binaries
    operador@radius:~$

  4. #4

    Padrão Re: FreeRadius e SqlIpPool erro nas queries

    pena que o topico é velho
    o problema esta na query "expiry_time IS NULL"
    editando o arquivo
    nano /etc/freeradius/sql/mysql/ippool.conf voce resolve isso
    basta trocar tudo que estiver como expiry_time IS NULL \
    por expiry_time = NULL \

    assim vai passar receber a accounting normalmente, porem apos aplicar essas mudanças sera necessario restartar o serviço do freeradius e tambem reiniciar os pppoe server.

    muito se ver por aí pedindo pra trocarem essa query pra evitar que haja duplicidade de ips na rede vinda do sqlippool, e deixar do jeito que esta no seu, mas quando se faz essa alteraçao a tabela radippool para de ser atualizada, entao tem que deixar do modo que eu passei acima.

    para evitar que haja duplicidade de ips o pessoal recomenda alterar a tabela radippool para o formato innodb e deixar o Expiry_time 6 vezes maior que o Interim update.

    alem disso editar o arquivo nano /etc/freeradius/sqlippool.conf
    onde tem pool-key = "%{NAS-Port}"
    se deve alterar para pool-key = "%{NAS-IP-Address}-%{NAS-Port}"

    esses foram os passos que encontrei pra resolver o problema de ips duplicados na rede, porem eu nao tenho uma rede pra testar isso pra ver se realmente funciona para o mysql.

    se alguem usa mysql para cuidar da sqlippool eu queria que deixasse um comentario aqui se esses passos que passei resolve mesmo o problema de ips duplicados na rede.

  5. #5

    Padrão Re: FreeRadius e SqlIpPool erro nas queries

    Na verdade mesmo mano, o que evita IPS duplicados é uma série de fatores, alguns são, accounting funcional de no máximo 5 minutos, liberação rápida de ips não usados... E assim por diante. Fazem dois anos que já uso isso em meus clientes e ainda sofro as vezes com isso, o que fez piorar muito esse recurso foi a escassez de ipv4, no passado você conseguia um /20 e tinha uns 3900 ips só para atender clientes, e tinha seus 500 clientes, aí funciona muito bem, você conseguia deixar o expire-time alto e não sofria com a liberação precisa dos ips, hoje em dia os provedores tem 900 ips para atender 850 clientes... Não existe forma de ficar preciso, principalmente de você tem quedas/rajadas de conexão frequentes. O mais correto é usar o FRAMED-IP-ADDRESS com ip fixo pra cada cliente.

    Esperamos que logo logo tudo seja ipv6 aí sim eliminamos esse obstáculo!

    Enviado via XT1563 usando UnderLinux App

  6. #6

    Padrão Re: FreeRadius e SqlIpPool erro nas queries

    Citação Postado originalmente por andrecarlim Ver Post
    Na verdade mesmo mano, o que evita IPS duplicados é uma série de fatores, alguns são, accounting funcional de no máximo 5 minutos, liberação rápida de ips não usados... E assim por diante. Fazem dois anos que já uso isso em meus clientes e ainda sofro as vezes com isso, o que fez piorar muito esse recurso foi a escassez de ipv4, no passado você conseguia um /20 e tinha uns 3900 ips só para atender clientes, e tinha seus 500 clientes, aí funciona muito bem, você conseguia deixar o expire-time alto e não sofria com a liberação precisa dos ips, hoje em dia os provedores tem 900 ips para atender 850 clientes... Não existe forma de ficar preciso, principalmente de você tem quedas/rajadas de conexão frequentes. O mais correto é usar o FRAMED-IP-ADDRESS com ip fixo pra cada cliente.

    Esperamos que logo logo tudo seja ipv6 aí sim eliminamos esse obstáculo!

    Enviado via XT1563 usando UnderLinux App
    voce usa o mysql para gerenciar o seu radippool ?
    mais pra usar framed-ip-address nao tem que ter o ip desejado na pool do mikrotik ?

    eu queria saber como faz pra fixar no cliente um ip que esta dentro do freeradius, tem como ?

  7. #7

    Padrão

    voce usa o mysql para gerenciar o seu radippool ?
    Sim, uso. O MySQL é mais rápido para o uso com freeradius. Pode ser que quando eu tiver bancos de dados realmente grandes, com muitos indexes eu mude para PostGreSQL, mas é só especulação por enquanto.

    mais pra usar framed-ip-address nao tem que ter o ip desejado na pool do mikrotik ?
    Não, você pode ter qualquer IP para qualquer usuário, mesmo ele não estando inserido na tabela radippool.

    eu queria saber como faz pra fixar no cliente um ip que esta dentro do freeradius, tem como ?
    Essa é um pouco mais complicada, tem que criar um novo campo, de preferência com index, na tabela radippool (ou a que você usa para o pool de ips), e baseado nesse campo você muda a query de alocação de IPs, assim:

    # criamos o novo campo:

    ALTER TABLE `radippool` ADD `livre` INT(1) NULL DEFAULT '1' AFTER `id`, ADD INDEX (`livre`)
    # agora a query é assim:

    allocate-find = "SELECT framedipaddress FROM ${ippool_table} \
    WHERE pool_name = '%{control:Pool-Name}' AND (expiry_time < NOW() OR expiry_time IS NULL) \
    ORDER BY (username <> '%{User-Name}'), \
    (callingstationid <> '%{Calling-Station-Id}'), \
    expiry_time \
    LIMIT 1 \
    FOR UPDATE"
    # mudamos para:

    allocate-find = "SELECT framedipaddress FROM ${ippool_table} \
    WHERE pool_name = '%{control:Pool-Name}' AND (expiry_time < NOW() OR expiry_time IS NULL) \
    AND livre > 0 \
    ORDER BY (username <> '%{User-Name}'), \
    (callingstationid <> '%{Calling-Station-Id}'), \
    expiry_time \
    LIMIT 1 \
    FOR UPDATE"
    Desse modo para alocar um ip para um cliente basta mudar o campo "livre" daquele ip para "0", e associar o IP em questão para o usuário com o attribute Framed-IP-Address, na tabela radreply.

    Era essa a dúvida?

  8. #8

    Padrão Re: FreeRadius e SqlIpPool erro nas queries

    sim era exatamente essa duvida. caraca fiquei muito feliz ao ver que voce me passou o modo de como se fazer, eu gosto muito de aprender novas coisas.
    meu sonho é criar uma pagina em php pra gerenciar tudo isso, e essa sua dica era uma que eu tava precisando muito.
    por enquanto ainda nao comecei a estudar o php, comprei um curso, mas antes estou aprendendo a mexer com o radius pra na hora que for aprender o php eu saber os comandos que irei precisar.
    voce me ajudou muito cara.
    e sobre voce usar o mysql, eu lhe perguntei isso porque eu uso o mysql com o daloradius e lhe fiz essa pergunta porque vi algumas pessoas falarem que nao conseguiram ter uma boa experiencia com mysql para a radippool, e eu nao tenho uma rede pra testar isso, fiz aqui em uma maquina virtual uns clientes mikrotik rsrs
    mas nao da pra fazer 200 clientes no meu pc pra brincar com essas coisas, aí dependo mesmo que alguem que tenha experiencia me oriente sobre este assunto, pois eu prefiro o mysql por ser mais facil de manipular via terminal.
    eu tava mexendo com postgresql agora mesmo e nao consegui usar comandos via terminal, dava erro... só consigo via pgadmin, sem contar que pra daloradius colocar o postgre é bem complicado...

    pra finalizar, voce fez alguma alteração em /etc/freeradius/sql/mysql/ippool.conf ?
    ou ta default ?

    vi algumas pessoas falando pra mudar expiry-time pra is null, eu peguei e mudei tudo e deu ruim rsrs
    entao tive que desfazer tudo pra pode usar, é que algumas pessoas falam que tinha que mudar pra evitar ips duplicados...

    Minha configuração:
    1- a minha tabela radippool ja ta em innodb que ja veio por padrao quando eu - importei da pasta freeradius;

    2- a minha ippool.conf tambem esta default;

    3- a lease-time eu deixei em 3600 mesmo e no pppoe server eu coloquei como 5 minutos o interim-update.

    voce precisou mudar alguma coisa pra deixar filé ?

  9. #9

    Padrão Re: FreeRadius e SqlIpPool erro nas queries

    Eu mudei praticamente tudo no meu ippool.conf! No momento estou em cliente, não consigo te ajudar mais agora, se precisar de mais ajuda meu email [email protected].

    Enviado via XT1563 usando UnderLinux App

  10. #10

    Padrão Re: FreeRadius e SqlIpPool erro nas queries

    Citação Postado originalmente por Alex20cf Ver Post
    voce usa o mysql para gerenciar o seu radippool ?
    mais pra usar framed-ip-address nao tem que ter o ip desejado na pool do mikrotik ?

    eu queria saber como faz pra fixar no cliente um ip que esta dentro do freeradius, tem como ?
    Tem sim meu amigo, depois de criar os registro na tabela radippool vc precisa inserir uma linha na tabela radcheck para cada usuario:
    INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES ('login.usuario', 'Pool-Name', ':=', 'nome_ippool');

    dessa forma o usuario em questão irá pegar um ip dentro da pool que vc informou.

    Para informar um ipfixo vc faz o seguinte:
    INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES ('login.usuario', 'Framed-IP-Address', ':=', '0.0.0.0');

    espero ter ajudado....