Instalando FreeRadius 3.0.X com integração MySQL ou MariaDB no Debian 9 Stretch

Neste tutorial vamos configurar o FreeRadius 3 em nosso servidor Debina 9, com integração dos usuários/atributos de configurações em uma base de dados MySQL/MariaDB com o módulo SQL, e ainda o módulos SQLIPPOOL para armazenar nossa pool de IPs na base de dados.
Esse tutorial é ideal para provedores fazerem autenticação PPPoE, autenticação Wireless PSK e EAP.

Se você gostou do tutorial ou tem dúvidas deixe seu comentário. Se precisar de alguma ajuda ou trocar uma ideia pode me chamar lá no Telegram @remontti

REQUISITOS
1 – Debian 9 Stretch recomendo uma instalação limpa do Debian
2 – Servidor Atualizado:

# apt update

Mãos à obra!
Primeiramente escolha qual banco de dados você irá instalar:
MySQL ou MariaDB?
Com o lançamento do Debian 9 ao solicitar a instalação do mysql-server, você irá se deparar com a instalação do MariaDB automaticamente.
MariaDB é um banco de dados que surgiu como fork do MySQL, criado pelo próprio fundador do projeto após sua aquisição pela Oracle. Para saber mais acesse https://pt.wikipedia.org/wiki/MariaDB

Para MySQL
A equipe do MySQL Release Engineering fornece repositórios apt para usar com a maioria do software, incluindo o servidor e muitos de seus utilitários. Para instalação com o Mysql então será necessário adicionar em seus repositórios.

# echo -e "deb http://repo.mysql.com/apt/debian/ stretch mysql-5.7\ndeb-src http://repo.mysql.com/apt/debian/ stretch mysql-5.7" > /etc/apt/sources.list.d/mysql.list
# wget -O /tmp/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql --no-check-certificate
# apt-key add /tmp/RPM-GPG-KEY-mysql
# apt update
# apt install mysql-server

Para MariaDB
Não será necessário alterar nada em seus repositórios.
Note que na instalação do MariaDB ele não irá pedir senha do usuário root como acontece no mysql, por padrão o mesmo vem sem senha com permissão de logar apenas via shell.

# apt install mariadb-client mariadb-server

Agora que já temos nosso bando de dados instalado MySQL ou MariaDB, vamos instalar uma servidor web junto com o PHPMyAdmin para facilitar nossa vida.

# apt install apache2 libapache2-mod-php7.0 php7.0 phpmyadmin

Após instalar acesse http://SEU-IP/phpmyadmin para ver se tudo esta ok!

Instalação do FreeRadius

# apt install freeradius freeradius-mysql freeradius-utils

Crie um banco de dados e usuário e conceda permissões para acessar sua base.

No MariaDB use o comando:

# mariadb -u root

* Vale lembrar que MariaDB seu usuário root vem sem senha, para setar uma senha faça:

USE mysql;
UPDATE user SET password=PASSWORD('SUA-SENHA-USER-ROOT') WHERE User='root';
UPDATE user SET plugin="mysql_native_password";
FLUSH PRIVILEGES;

Acesse via linha de comando seu banco de dados, e crie uma base chamada de radius e usuário também chamado de radius, para configurarmos nossa aplicação freeradius.

CREATE DATABASE radius;
GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'SENHA-DO-USER-RADIUS';
FLUSH PRIVILEGES;
quit;

Agora vamos criar nossas tableas

No MariaDB use o comando:

# mariadb -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
# mariadb -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/ippool/mysql/schema.sql

No MySQL use o comando:

# mysql -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
# mysql -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/ippool/mysql/schema.sql

Após cada comando será solicitado a senha (SENHA-DO-USER-RADIUS)

Caso deseje logs mais detalhados edite radiusd.conf

# cp /etc/freeradius/3.0/radiusd.conf /etc/freeradius/3.0/radiusd.conf.orig
# vim /etc/freeradius/3.0/radiusd.conf

Localize as variáveis e altere para yes

[...]
log {
    [...]
        stripped_names = yes
        auth = yes
        auth_badpass = yes
        auth_goodpass = yes
    [...]
}
[...]

Vamos habilitar nosso mod SQL, mas antes precisamos fazer algumas alterações no arquivo

# cp /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-available/sql.orig
# vim /etc/freeradius/3.0/mods-available/sql

Altere:

driver = "rlm_sql_null" por driver = "rlm_sql_mysql"
dialect = "sqlite" por dialect = "mysql"

Descemente as linhas e altere a senha:

server = "localhost"
port = 3306
login = "radius"
password = "SENHA-DO-USER-RADIUS"

Descomente:
read_clients = yes

Habilite o mod:

# ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql

Agora no arquivo /etc/freeradius/3.0/sites-enabled/default vamos comentar alguns valores e descomentar outros:

# cp /etc/freeradius/3.0/sites-available/default  /etc/freeradius/3.0/sites-available/default.org
# vim /etc/freeradius/3.0/sites-enabled/default
  authorize {
      #digest
      #suffix
      #files
      sql
      #-ldap
  }

  authenticate {
      #digest
  }

  preacct {
      #suffix
      #files
  }

  accounting {
      sql
      #exec
      #attr_filter.accounting_response
  }
  session {
    # Se você deseja usar o atributo Simultaneous-Use, descomente sql e comente radutmp</em> 
    #radutmp
    sql
  }

  post-auth {
          sql
          #exec

#        Post-Auth-Type REJECT {
#                # log failed authentications in SQL, too.
#                -sql
#                attr_filter.access_reject
#                # Insert EAP-Failure message if the request was
#                # rejected by policy instead of because of an
#                # authentication failure
#                eap
#
#                #  Remove reply message if the response contains an EAP-Message
#                remove_reply_message_if_eap
#        }

Faça o mesmo com inner-tunnel

# cp /etc/freeradius/3.0/sites-available/inner-tunnel /etc/freeradius/3.0/sites-available/inner-tunnel.org
# vim /etc/freeradius/3.0/sites-enabled/inner-tunnel
authorize {
    #suffix
    #files
    sql
    #-ldap
}

authenticate {

}

session { 
    # Se você deseja usar o atributo Simultaneous-Use, descomente sql e comente radutmp
    #radutmp
    sql
}
post-auth {
    sql

#  Post-Auth-Type REJECT {
#      # log failed authentications in SQL, too.
#      -sql
#      attr_filter.access_reject
#
#      #
#      #  Let the outer session know which module failed, and why.
#      #
#      update outer.session-state {
#              &Module-Failure-Message := &request:Module-Failure-Message
#      }
#  }

}

Habilita mod sqlippool

# ln -s /etc/freeradius/3.0/mods-available/sqlippool /etc/freeradius/3.0/mods-enabled/sqlippool
# vim /etc/freeradius/3.0/mods-enabled/sqlippool
# Comente:
# pool_key = "%{NAS-Port}"
# Descomente
pool_key = "%{Calling-Station-Id}"

Precisamos adicionar o mod sqlippool no nosso arquivo default, você acrescentará sqlippool em accounting e post-auth logo abaixo de sql:

# vim /etc/freeradius/3.0/sites-enabled/default
accounting {
        sql
        sqlippool
}
session {
        sql
}
post-auth {
        sql
        sqlippool
}

Uma alteraçõe que acho interessante é para que a cada nova alocação de IP ela seja randômica, isso pode solucionar alguns problemas como o daqueles clientes que jogam online, que fazem download, que estão sendo atacados, que ao reiniciar seu equipamento o mesmo irá receber um novo IP. Para isso vamos editar /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf

# vim /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf

#
#  The ORDER BY clause of this query tries to allocate the same IP-address
#  which user had last session...
#COMENTE:
#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"

#
#  If you prefer to allocate a random IP address every time, use this query instead.
#DESCOMENTE
allocate_find = "\
       SELECT framedipaddress FROM ${ippool_table} \
       WHERE pool_name = '%{control:Pool-Name}' \
       AND expiry_time IS NULL \
       ORDER BY \
               RAND() \
       LIMIT 1 \
       FOR UPDATE"

Opcional

Inicialmente eu particularmente não gosto da ideia da tabela radusergroup não ter um ID então para alterar isso faça. (Se desejar)

# mysql/mariadb -u radius -p

Entre com SUA-SENHA do radius no MySQL.

USE radius;
ALTER TABLE `radusergroup` ADD `id` INT(20) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`) ;
ALTER TABLE `radusergroup` ADD UNIQUE(`id`);

Caso você tenha uma alta demanda de requisições você pode fazer algumas alterações no radiusd.conf.
Altere conforme sua necessidade, e hardware de seu servidor. Vale lembrar que fazendo essas alterações será necessário alterar as configurações do MySQL/MariaDB para permitir uma maior número de conexões.
Ex carga de cerca de 1000 Access-Request por segundo:

# vim /etc/freeradius/3.0/radiusd.conf
#...
thread pool {
    start_servers = 256
    max_servers = 512
    min_spare_servers = 256
    max_spare_servers = 512
    max_queue_size = 1048576
    max_requests_per_server = 0
    auto_limit_acct = no
}
#...

Para conhecer os atributos que você pode usar em sua base recomendo a leitura do tutorial: "ALIMENTANDO NOSSA BASE DE DADOS" em diante.
Servidor FreeRadius com integração MySQL + Autenticação PPPoE & Hotspot VS Mikrotik + Ubiquiti EAP/PSK

Sugestões ou criticas envie para Telegram: @remontti

Espero ter ajudado! 😉

ARQUIVOS EDITADOS:

# cat /etc/freeradius/3.0/sites-enabled/default |grep -v "#" |awk 'NF>0'
server default {
listen {
        type = auth
        ipaddr = *
        port = 0
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}
listen {
        ipaddr = *
        port = 0
        type = acct
        limit {
        }
}
listen {
        type = auth
        port = 0
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}
listen {
        ipv6addr = ::
        port = 0
        type = acct
        limit {
        }
}
authorize {
        filter_username
        preprocess
        chap
        mschap
        eap {
                ok = return
        }
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        eap
}
preacct {
        preprocess
        acct_unique
}
accounting {
        detail
        sql
        sqlippool
}
session {
        sql
}
post-auth {
        update {
                &reply: += &session-state:
        }
        sql
        sqlippool
        remove_reply_message_if_eap
}
pre-proxy {
}
post-proxy {
        eap
}
}
# cat /etc/freeradius/3.0/sites-enabled/inner-tunnel |grep -v "#" |awk 'NF>0'
server inner-tunnel {
listen {
       ipaddr = 127.0.0.1
       port = 18120
       type = auth
}
authorize {
        filter_username
        chap
        mschap
        update control {
                &Proxy-To-Realm := LOCAL
        }
        eap {
                ok = return
        }
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        eap
}
session {
        sql
}
post-auth {
        sql
}
pre-proxy {
}
post-proxy {
        eap
}
# cat /etc/freeradius/3.0/mods-enabled/sql |grep -v "#" |awk 'NF>0'
sql {
        driver = "rlm_sql_mysql"
        dialect = "mysql"
        server = "localhost"
        port = 3306
        login = "radius"
        password = "SENHA-USUARIO-RADIUS"
        radius_db = "radius"
        acct_table1 = "radacct"
        acct_table2 = "radacct"
        postauth_table = "radpostauth"
        authcheck_table = "radcheck"
        groupcheck_table = "radgroupcheck"
        authreply_table = "radreply"
        groupreply_table = "radgroupreply"
        usergroup_table = "radusergroup"
        delete_stale_sessions = yes
        pool {
                start = ${thread[pool].start_servers}
                min = ${thread[pool].min_spare_servers}
                max = ${thread[pool].max_servers}
                spare = ${thread[pool].max_spare_servers}
                uses = 0
                retry_delay = 30
                lifetime = 0
                idle_timeout = 60
        }
        read_clients = yes
        client_table = "nas"
        group_attribute = "SQL-Group"
        $INCLUDE ${modconfdir}/${.:name}/main/${dialect}/queries.conf
}
# cat /etc/freeradius/3.0/mods-enabled/sqlippool |grep -v "#" |awk 'NF>0'
sqlippool {
        sql_module_instance = "sql"
        dialect = "mysql"
        ippool_table = "radippool"
        lease_duration = 3600
        pool_key = "%{Calling-Station-Id}"
        messages {
                exists = "Existing IP: %{reply:Framed-IP-Address} (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"
                success = "Allocated IP: %{reply:Framed-IP-Address} from %{control:Pool-Name} (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"
                clear = "Released IP %{Framed-IP-Address} (did %{Called-Station-Id} cli %{Calling-Station-Id} user %{User-Name})"
                failed = "IP Allocation FAILED from %{control:Pool-Name} (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"
                nopool = "No Pool-Name defined (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"
        }
        $INCLUDE ${modconfdir}/sql/ippool/${dialect}/queries.conf
}
# cat /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf |grep -v "#" |awk 'NF>0'
allocate_clear = "\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = '', \
                pool_key = 0, \
                callingstationid = '', \
                username = '', \
                expiry_time = NULL \
        WHERE expiry_time <= NOW() - INTERVAL 1 SECOND \
        AND nasipaddress = '%{Nas-IP-Address}'"
allocate_find = "\
        SELECT framedipaddress FROM ${ippool_table} \
        WHERE pool_name = '%{control:Pool-Name}' \
        AND expiry_time IS NULL \
        ORDER BY \
                RAND() \
        LIMIT 1 \
        FOR UPDATE"
pool_check = "\
        SELECT id \
        FROM ${ippool_table} \
        WHERE pool_name='%{control:Pool-Name}' \
        LIMIT 1"
allocate_update = "\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = '%{NAS-IP-Address}', pool_key = '${pool_key}', \
                callingstationid = '%{Calling-Station-Id}', \
                username = '%{User-Name}', expiry_time = NOW() + INTERVAL ${lease_duration} SECOND \
        WHERE framedipaddress = '%I' \
        AND expiry_time IS NULL"
start_update = "\
        UPDATE ${ippool_table} \
        SET \
                expiry_time = NOW() + INTERVAL ${lease_duration} SECOND \
        WHERE nasipaddress = '%{NAS-IP-Address}' \
        AND pool_key = '${pool_key}' \
        AND username = '%{User-Name}' \
        AND callingstationid = '%{Calling-Station-Id}' \
        AND framedipaddress = '%{Framed-IP-Address}'"
stop_clear = "\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = '', \
                pool_key = 0, \
                callingstationid = '', \
                username = '', \
                expiry_time = NULL \
        WHERE nasipaddress = '%{Nas-IP-Address}' \
        AND pool_key = '${pool_key}' \
        AND username = '%{User-Name}' \
        AND callingstationid = '%{Calling-Station-Id}' \
        AND framedipaddress = '%{Framed-IP-Address}'"
alive_update = "\
        UPDATE ${ippool_table} \
        SET \
                expiry_time = NOW() + INTERVAL ${lease_duration} SECOND \
        WHERE nasipaddress = '%{Nas-IP-Address}' \
        AND pool_key = '${pool_key}' \
        AND username = '%{User-Name}' \
        AND callingstationid = '%{Calling-Station-Id}' \
        AND framedipaddress = '%{Framed-IP-Address}'"
on_clear = "\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = '', \
                pool_key = 0, \
                callingstationid = '', \
                username = '', \
                expiry_time = NULL \
        WHERE nasipaddress = '%{Nas-IP-Address}'"
off_clear = "\
        UPDATE ${ippool_table} \
        SET \
                nasipaddress = '', \
                pool_key = 0, \
                callingstationid = '', \
                username = '', \
                expiry_time = NULL \
        WHERE nasipaddress = '%{Nas-IP-Address}'"

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

60 Resultados

  1. Alan disse:

    Boa Tarde!!

    Estou a dias tentando amarrar o endereço mac um determinado login de usuario utilizando o atributo :

    ja tentei das seguintes formas

    (‘cliente’, ‘Calling-Station-Id’, ‘==’, ’00:11:22:33:44:55′);
    (‘cliente’, ‘Calling-Station-Id’, ‘:=’, ’00:11:22:33:44:55′);
    (‘cliente’, ‘Calling-Station-Id’, ‘==’, ’00-11-22-33-44-55′);
    (‘cliente’, ‘Calling-Station-Id’, ‘:=’, ’00-11-22-33-44-55′);

    Acontece que o Radius não valida o Calling-station-id e autentica qualquer equipamento com o mesmo usuário e senha,
    onde sera que estou errando?

  2. Pedro Wessel disse:

    Parabéns pelo artigo! Dificilmente encontra-se material tão detalhado!
    Rudimar trabalhamos com sistema de gerenciamento para provedores (netControl), utilizamos o freeradius para autenticar os clientes e entregar os IPs.
    Para fazer a alocação do IPv4 usamos o allocate_find contendo o select que retorna o IPv4. Tem algum allocateIPv6_find que eu poderia usar ou eu teria que retornar o IPv6 junto com o IPv4 no mesmo select?

  3. Walisson Gois disse:

    Ola, boa tarde. Tem como o FreeRadius autenticar os usuarios PPPoE utilizando qualquer usuario e qualquer senha ? Para uma situação de emergência onde dê pau no servidor Radius.

  4. Elias disse:

    podem ajudar, voces nao falaram o caminho pra da start e stop, acho que estou fazendo no caminho certo, mas mesmo configurando o NAS, nao loga fica dando sempre o mesmo erro

    Thu Dec 26 11:06:27 2019 : Error: Ignoring request to auth address * port 1812 bound to server default from unknown client 172.17.200.102 port 1812 proto udp

    • Elias Moreira disse:

      O arquivo clientes.conf deve ser informado as configurações do dispositivo que vai comunicar com o servidor freeradius.
      exemplo:

      # joe /etc/freeradius/3.0/clients.conf

      client ELIASWIFI {
      ipaddr = 172.17.200.102/32
      secret = exemplosenha
      require_message_authenticator = no
      nastype = other
      virtual_server = eliaswifi
      }

  5. itawar disse:

    Ciao a tutti vengo dall’italia

  6. WILLIAN SILVA LIMA disse:

    Ajuda! Desde já, parabéns pelo compartilhamento de conhecimento. Tentei várias vezes instalar o passo a passo deste tutorial, deu certo em partes, depois dos usuário logar, a tabela *radacct*, não recebe nenhuma informação pra a montagem do extrato da conexão do usuário, gostaria de saber se vc tem alguma ideia que possa ser

    • Olá, depois de refazer umas diversas vezes e lê centenas de artigos, encontrei a solução, Eu, estava importando a tabela antiga do meu Radius, que continha um campo modificado ( nasidentifier), que pega o nome da RB, que este eu modifiquei um arquivo do freeradius. Até aí tudo bem, removi ele, porém ainda não testei, mas, pretendo.

      Outra coisa que percebi que na versão mais nova o Radius na tabela *radacct*, não possui algumas colunas, a esxemplo de (acctstartdelay, acctstopdelay, xascendsessionsvrkey).

  7. tiago disse:

    Muito bom material, parabéns!
    Pensa em fazer algum material envolvendo Freeradius com autenticação no ldap??

  8. ALEX TRINDADE disse:

    Boa noite prezados, estou tentando prender mac usando freeradius 3 com mikrotik, porem não estou conseguindo prender o mac.

    INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES (‘computador’, ‘Caller-ID’, ‘==’, ’62:45:CB:A5:FF:0D’);

    estou tentando prender o mac com o attributo Caller-ID, mas não esta funcionando, eu usava isso no freeradius 2 e agora no freeradius 3 não estou conseguindo usar, alguem sabe como prender mac do cliente pppoe usando freeradius 3 ?

  9. Bryam disse:

    Olá, primeiramente gostaria de agradecer por todos os seus tutorias postados no site, são realmente bem didáticos e de fácil compreensão !!

    Remontti, gostaria de saber como faço para armazenas IPv6’s na tabela SQLIPPOOL, e disponibilizar meus IPv6’s (WAN e LAN) nessa tabela, sempre que o cliente logar pegar 1 que está disponível, assim como é feito no IPv4.

    Nesse caso utilizando os parâmetros:
    Framed-IPv6-Prefix: Responsável pela a entrega do IPv6 da WAN(/64);
    Delegated-IPv6-Prefix: Responsável pela entregada do IPv6 da LAN (/56);

    Sei que deve ser trabalhoso, mas se puder complementar nesse seu tutorial seria incrível!!

    • Ainda não é possível fazer isso os atributos:
      Framed-IPv6-Prefix, Delegated-IPv6-Prefix devem ser atrelados ao usuários. Vale lembrar que o Delegated-IPv6-Prefix no mikrotik não esta funcionando até a versão 6.45beta16

  10. Douglas disse:

    Opa gostei mto tutorial!! Parabéns! No caso gostaria saber onde posso estudar mais sobre assunto?? e se para fazer páginas php integrado freeradius preciso somente alteração banco dados? Queria material bom para possa estudar kk obg.

  11. Ledson disse:

    Com relação a entrega dos pool de IPv6 estou usando o seguinte comando
    (‘usuario@dominio.com.br’, ‘Framed-IPv6-Prefix’, ‘:=’, ‘2001:db8:A:B::/64’), /* IPv6 “Wan” */
    (‘usuario@dominio.com.br’, ‘Mikrotik-Delegated-IPv6-Pool’, ‘:=’, ‘2001:db8:C::/56’); /* IPv6 “Lan” */
    Esse comando tbm é usado na versão 3 do freeradius?
    Pq o bloco que estou adicionando no freeradius não é pego no mikrotik, ele pega o do propio mikrotik mas não pega o do freeradius, vc ja passou por algo semelhante?

    • Mikrotik-Delegated-IPv6-Pool = nome-da-pool-q-exite-no-mk
      No tutorial antigo ta errado mesmo. Oara vc poder mandar seu bloco o atributo seria Delegated-IPv6-Prefix (mas o mk nao entende ele) Existe no forum do mk muita reclamação…

  12. Victor Nishiyama disse:

    Olá Rudimar,

    Parabéns pelo blog, recentemente me formei em Engenharia de Computação, procurando por alguns temas de meu interesse em adquir conhecimento encontrei teu blog, que acabou por suprir várias necessidades de minhas pesquisas.

    Tenho uma dúvida sobre o freeradius, seria possível a aplicação de um servidor radius em nuvem para utilização em uma rede de terceiros? Em uma topologia que seria basicamente a seguinte:

    servidor freeradius internet onu ap

    Onde clientes se autenticaria em meu servidor radius por meio de um ap que estraria atrás de um nat da onu de um provedor qualquer.

    Lembrando que eu os únicos ativos os quais eu iria dispor de gerência seria o servidor e o ap.

    Grato,

    Um grande abraço!

    • Sim, muitos sistemas fazem isso, porem vc tem q estar 100% on para nada ficar fora, e ter um ip fixo, se o radius tiver atras de um nat é so direcionar a porta. já qm for buscar informacao no radius precisa ter um ip fixo tb, pois vai ter q informar na tabela nas o ip valido do lado q vai até o radius fazer a verificacao dos dados.

  13. Ledson disse:

    Olá, coloquei o Radius para funcionar e ele está autenticando normalmente, acontece que quando coloco em produção em um concentrador com um numero maior de requisições (500 assinates nesse concentrador) alguns clientes pppoe deixam de conectar. Isso ocorre por que a requisição ainda fica aberta no banco de dados, o cliente desconecta e não consegue mais conectar dando erro no log mikotik: user XXXX autentication failed.

    • Provavelmente vc está tendo alguma falha de comunicação do radius com o RouterOS, ou vc cria Scripts para resolver esse problema ou vc desabilita o Simultaneous-Use. Observe os logs, e veja o pq isso está acontecendo…

      • Ledson disse:

        O radius esta hospedado em nuvem (Digital Ocean), provavelmente em algum momento tenha falha na comunicação. Sim uso o simultaneous-use, nas pesquisas que fiz disseram para desabilitar, porém em minha percepção não é a maneira correta de resolver o problema. Os scrips que vc esta falando seria para derrubar a conexão em aberto? ok vou dar uma olhada, desde já agradeço.

  14. Daniel Winter disse:

    Boa tarde, como eu consigo criar as queues no freeradius e quando o PPPOE autenticar no mikrotik ele já criar o controle de velocidade também

  15. Gustavo disse:

    ERROR 1050 (42S01) at line 4: Table ‘radippool’ already exists

  16. Nelson disse:

    deu tudo certo!!!!!

    primeiro tutorial na minha vida que da certo do início ao fim.

    Parabens.

  17. Laennio disse:

    Notei que quando reinicio o sistema operacional o serviço freeradius sobe desativado, tenho que dar o comando: service start freeradius, para ele volte funcionar, mas tenho que fazer isso toda vez que o sistema é reiniciado. Já tentei alguns scripts mas sem sucesso. Desde já agradeço.

  18. Ledson disse:

    Boa tarde, o servidor freeradius esta funcioando tudo ok, porém tem acontecido de travar o sistema operacional. Uso virtualizado em uma vmware, servidor dell, verifiquei na maquina virtual questão de processamento ou memoria e não passa dos 20%, já alterei tbm a questão da quantidade de max_queue_size = 1048576, dando uma amenizada no problema, porem ainda travando algumas vezes na semana, já passou por algo semelhante? Ah! quando altero os valores no radiusd.conf para:
    start_servers = 256
    max_servers = 512
    min_spare_servers = 256
    max_spare_servers = 512
    Da um erro, só voltando a funcionar com os valores padrões.
    Desde já agradeço.

  19. Ledson disse:

    Na versão 3 do freeRadius, os arquivos:
    /sites-enabled/default
    /sites-enabled/inner-tunnel
    Não vem mais com o ‘#” no sql para ser descomentado e sim com um sinal de “-” (menos) na frente do sql;
    Nesse caso o sinal de – é removido para que a opção sql seja ativada?

  20. carlos disse:

    Muito bom seu tutorial, to pensando em criar uma pagina em php para que pudesse o desse cadastrar os clientes em uma interface gráfica seria possível?

  21. Rodrigo Barbieri disse:

    Bom dia, parabens pelo post.
    Uma pergunta, comigo, não está funcionando a opção de Simultaneous-Use, mesmo definindo tudo certo, o mesmo usuario autentica várias vezes.
    Tem alguma outra coisa que precisa ser feito?

  22. Anderson disse:

    Saberia dizer o motivo do erro abaixo ao tentar realizar um teste com o Radtest retornando conexão rejeitada:

    Mon Feb 26 12:42:17 2018 : Debug: (1) modsingle[authorize]: returned from sql (rlm_sql)
    Mon Feb 26 12:42:17 2018 : Debug: (1) [sql] = ok
    Mon Feb 26 12:42:17 2018 : Debug: (1) modsingle[authorize]: calling expiration (rlm_expiration)
    Mon Feb 26 12:42:17 2018 : Debug: (1) modsingle[authorize]: returned from expiration (rlm_expiration)
    Mon Feb 26 12:42:17 2018 : Debug: (1) [expiration] = noop
    Mon Feb 26 12:42:17 2018 : Debug: (1) modsingle[authorize]: calling logintime (rlm_logintime)
    Mon Feb 26 12:42:17 2018 : Debug: (1) modsingle[authorize]: returned from logintime (rlm_logintime)
    Mon Feb 26 12:42:17 2018 : Debug: (1) [logintime] = noop
    Mon Feb 26 12:42:17 2018 : Debug: (1) modsingle[authorize]: calling pap (rlm_pap)
    Mon Feb 26 12:42:17 2018 : WARNING: (1) pap: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Mon Feb 26 12:42:17 2018 : WARNING: (1) pap: !!! Ignoring control:User-Password. Update your !!!
    Mon Feb 26 12:42:17 2018 : WARNING: (1) pap: !!! configuration so that the “known good” clear text !!!
    Mon Feb 26 12:42:17 2018 : WARNING: (1) pap: !!! password is in Cleartext-Password and NOT in !!!
    Mon Feb 26 12:42:17 2018 : WARNING: (1) pap: !!! User-Password. !!!
    Mon Feb 26 12:42:17 2018 : WARNING: (1) pap: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Mon Feb 26 12:42:17 2018 : WARNING: (1) pap: No “known good” password found for the user. Not setting Auth-Type
    Mon Feb 26 12:42:17 2018 : WARNING: (1) pap: Authentication will fail unless a “known good” password is available
    Mon Feb 26 12:42:17 2018 : Debug: (1) modsingle[authorize]: returned from pap (rlm_pap)
    Mon Feb 26 12:42:17 2018 : Debug: (1) [pap] = noop
    Mon Feb 26 12:42:17 2018 : Debug: (1) } # authorize = ok
    Mon Feb 26 12:42:17 2018 : ERROR: (1) No Auth-Type found: rejecting the user via Post-Auth-Type = Reject
    Mon Feb 26 12:42:17 2018 : Debug: (1) Failed to authenticate the user
    Mon Feb 26 12:42:17 2018 : Auth: (1) Login incorrect (No Auth-Type found: rejecting the user via Post-Auth-Type = Reject): [anderson.barbosa/cma123] (from client localhost port 10)
    Mon Feb 26 12:42:17 2018 : Debug: (1) Using Post-Auth-Type Reject

    Obrigado!

  23. Anderson disse:

    Duvida, tem como deixar as senhas criptografadas na base? Obrigado!

    • Tem sim.

      Header	    Attribute		Description
      ------	    ---------		-----------
      {clear}	    Cleartext-Password	Clear-text passwords
      {cleartext}  Cleartext-Password	Clear-text passwords
      {crypt}	    Crypt-Password	Unix-style "crypt"ed passwords
      {md5}	    MD5-Password	MD5 hashed passwords
      {base64_md5} MD5-Password	MD5 hashed passwords
      {smd5}	    SMD5-Password	MD5 hashed passwords, with a salt
      {sha}	    SHA-Password	SHA1 hashed passwords
          SHA1-Password	SHA1 hashed passwords
      {ssha}	    SSHA-Password	SHA1 hashed passwords, with a salt
      {sha2}	    SHA2-Password	SHA2 hashed passwords
      {sha224}     SHA2-Password	SHA2 hashed passwords
      {sha256}     SHA2-Password	SHA2 hashed passwords
      {sha384}     SHA2-Password	SHA2 hashed passwords
      {sha512}     SHA2-Password	SHA2 hashed passwords
      {ssha224}    SSHA2-224-Password	SHA2 hashed passwords, with a salt
      {ssha256}    SSHA2-256-Password	SHA2 hashed passwords, with a salt
      {ssha384}    SSHA2-384-Password	SHA2 hashed passwords, with a salt
      {ssha512}    SSHA2-512-Password	SHA2 hashed passwords, with a salt
      {ssha3}	    SHA3-Password	SHA3 hashed passwords
      {ssha3-224}  SHA3-224-Password	SHA3 hashed passwords, with a salt
      {ssha3-256}  SHA3-256-Password	SHA3 hashed passwords, with a salt
      {ssha3-384}  SHA3-384-Password	SHA3 hashed passwords, with a salt
      {ssha3-512}  SHA3-512-Password	SHA3 hashed passwords, with a salt
      {nt}	    NT-Password 	Windows NT hashed passwords
      {nthash}     NT-Password 	Windows NT hashed passwords
      {md4}	    NT-Password 	Windows NT hashed passwords
      {x-nthash}   NT-Password 	Windows NT hashed passwords
      {ns-mta-md5} NS-MTA-MD5-Password Netscape MTA MD5 hashed passwords
      {x- orcllmv} LM-Password 	Windows LANMAN hashed passwords
      {X- orclntv} NT-Password 	Windows NT hashed passwords
      
  24. Ledson disse:

    Nos arquivos

    /etc/freeradius/3.0/sites-enabled/default
    /etc/freeradius/3.0/sites-enabled/inner-tunnel
    /etc/freeradius/3.0/mods-enabled/sqlippool

    Vc faz a copia por segurança colocando no final do arquivo .orig
    Porém o endereço do copy esta para /sites-available/

    É isso msmo, já que o sites-enable é uma especie de link para o available, ou foi erro de digitação?

    • É isso mesmo!
      Em *-available estão os arquivos “realmente”, se você renomear os arquivos dentro do *-enabled vai estar renomeando o nome do atalho, vc vai continuar “chamando” esse arquivo na hora de carregar o freeradius, e pior se você criar outro dentro de enabled irá duplicar as configurações e terá vários erros.

  25. Olá, muito bom o seu tutorial, parabéns. Consegui fazer aqui funcionou tudo certo, so no mikrotik quando o usuario autentica no hotspot no log do mikrotik da a seguinte mensagem RADIUS ACCOUNTING REQUEST NOT SENT: NO RESPONSE.
    Saberia me dizer o que pode estar acontecendo ??

    Desde já muito obrigado

  26. Jacks disse:

    Fiz examente isso tudo ai , porem qdo reinicio o radius , pela primeira vez , ele nao sobe mais…
    Restarting freeradius (via systemctl): freeradius.serviceJob for freeradius.service failed because the control process exited with error code.
    See “systemctl status freeradius.service” and “journalctl -xe” for details.
    failed!

    como se algum arquivo de config estivesse errado , no tutorial vc diz pra descomentar algumas partes com nome ‘sql’ no arquivo está como ‘-sql’ é normal ? é o mesmo parametro ?

  27. DIEGO DA COSTA FELIPPE disse:

    Amigo tenho uma duvida antigamente na senha de um login PPPOE eu usava o atributo Password == senha_pppoe vi que nessa versão ele não aceita mais esse atributo que foi alterado para Cleartext-Password := consegue me dizer o por que? E por sinal o tópico abordado acima e muito bom parabéns me ajudou muito.

  28. Pedro Henrique disse:

    Amigo, muito bom. Como seria para fazer com que o hotspot do Mikrotik seja autenticado no banco de dados mysql?
    Tinha um aqui, mas dava o erro que radius não reponde, funcionava mas dava esse erro às vezes..
    Alguma dica ou ajuda?

  29. Leandro disse:

    Parabéns, muito bom seu tutorial. Teria como me ajudar com os valores que devo inserir nas tabelas do radius?
    Quero fazer autenticação pppoe.
    Obrigado!

    • LEANDRO
      No final deste post falo sobre valores que são inserido nas tabelas: http://blog.remontti.com.br/1651
      Eu particularmente gosto de criar grupos para ficar mais organizando, então ficaria + – assim:

      INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES
      /* Permitimos apenas uma autenticação simultânea */
      ('PLANO_1', 'Simultaneous-Use', ':=', '1'), 
      /* Apenas protocolo PPP então isso não server para Hotspot */
      ('PLANO_1', 'Framed-Protocol', ':=', 'PPP'), 
      /* Definimos o nome da pool de IPs caso vc utilizar o mod sqlippol */
      ('PLANO_1', 'Pool-Name', ':=', 'minhapool'), 
      /* Tipo de serviço  */
      ('PLANO_1', 'Service-Type', ':=', 'Framed-User'); 
      
      INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
      /* Intervalo em seg que a radcct será atualizada */
      ('PLANO_1', 'Acct-Interim-Interval', ':=', '300'), 
      /* Se for Mikrotik (routerOS) velocidade da queues */
      ('PLANO_1', 'Mikrotik-Rate-Limit', ':=', '1024k/2048k'), 
       /* Se tiver Burst "50%" fica da seguinte forma */
      ('PLANO_2', 'Mikrotik-Rate-Limit', ':=', '512k/1024k 1024k/2048k 512k/1024k 600/600');
      
      INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
      /* Usuário x Senha */
      ('usuario@dominio.com.br', 'Cleartext-Password', ':=', 'senha'),
      /* Usuário x MAC assim somente aceita conexão vinda do mesmo */
      ('usuario@dominio.com.br', 'Calling-Station-Id', '==', '00:11:22:33:44:55');
      

      Se precisar ajuda me chama la no telegram. Posso demorar para responder mas respondo 😉

  1. 3 de julho de 2017

    […] Leia também: Instalando FreeRadius 3.0.X com integração MySQL ou MariaDB no Debian 9 Stretch […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *