Servidor FreeRadius com integração MySQL + Autenticação PPPoE & Hotspot VS Mikrotik + Ubiquiti EAP/PSK

Se quiser instalar a versão mais atual leia:
Instalando FreeRadius 3.0.X com integração MySQL ou MariaDB no Debian 9 Stretch

Neste tutorial vamos configurar o FreeRadius de forma simples em um servidor linux (Debina 8), armazenando nossos usuários e atributos de configurações em uma base de dados MySQL, qual será utilizada para autenticações PPPoE ou Hotspot, no RouterOS (Mikrotik). Vamos tratar ainda do módulos IPPOOL para armazenar nossa pool de IPs no banco de dados e o módulo COUNTER muito usado em configurações de Hotspot para controle de tempo da conexão. E por fim um extra de como configurar seu Access Point (AP)/ Station (Clientes/CPE) para fazer autenticação Wireless (PSK / EAP) em seus equipamentos Ubiquiti/Mikrotik entre outros.

Resumindo é um dos cenário mais encontrado em provedores de internet. Se você gostou do tutorial ou tem dúvidas deixe seu comentário. Se precisar de alguma consultoria ou trocar uma ideia pode me chamar lá no Telegram @remontti (Não garanto que irei responder rápido, mas sempre tiver um tempinho…)

REQUISITOS
1 – Debian 8 Jessie recomendo uma instalação limpa do Debian (Debian 8 Jessie / Instalação Limpa)
2 – Serviço Web Rodando (Passo-a-passo como criar um servidor web Apache2, PHP5, MySQL, PHPMyAdmin “LAMP” no Debian 8)
3 – Servidor Atualizado:

# apt update && apt upgrade

INSTALAÇÃO

# apt install freeradius freeradius-mysql freeradius-utils

Integração com MySQL

Após instalação vamos criar nossa base de dados chamada de “radius”, e após criar nosso usuário que também se chamara “radius” para ter acesso a mesma.

# mysql -u root -p

informe a senha do seus usuário root do MySQL.

1
2
3
4
CREATE DATABASE radius;
GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'SUA-SENHA';
FLUSH PRIVILEGES;
quit;

Importamos as tabelas para nosso banco de dados, a cado comando será solicitado senha so usuário mysql radius (SUA-SENHA).

# mysql -u radius -p radius < /etc/freeradius/sql/mysql/schema.sql
# mysql -u radius -p radius < /etc/freeradius/sql/mysql/nas.sql
# mysql -u radius -p radius < /etc/freeradius/sql/mysql/ippool.sql
# mysql -u radius -p radius < /etc/freeradius/sql/mysql/cui.sql
# mysql -u radius -p radius < /etc/freeradius/sql/mysql/wimax.sql

Entramos no diretório onde o FreeRadius tem seus arquivos de configuração.

# cd /etc/freeradius

Antes de editar o radiusd.conf crie um backup do mesmo, farei o mesmo em todos os arquivos que irei editar, assim temos um backup caso cometer algum erro.

# cp radiusd.conf radiusd.conf.orig
# vim radiusd.conf

Descomente

[...]
  ipv6addr = ::
[...]
  $INCLUDE sql.conf
[...]
  $INCLUDE sqlippool.conf
[...]

Se deseja ter logs mais detalhados altere os valores abaixo para yes.

[...]
log {
    [...]
        stripped_names = yes
        auth = yes
        auth_badpass = yes
        auth_goodpass = yes
    [...]
}
[...]
 # cat radiusd.conf |grep -v "#" |awk 'NF>0'

radius.conf ficará assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
prefix = /usr
exec_prefix = /usr
sysconfdir = /etc
localstatedir = /var
sbindir = ${exec_prefix}/sbin
logdir = /var/log/freeradius
raddbdir = /etc/freeradius
radacctdir = ${logdir}/radacct
name = freeradius
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/${name}
db_dir = ${raddbdir}
libdir = /usr/lib/freeradius
pidfile = ${run_dir}/${name}.pid
user = freerad
group = freerad
max_request_time = 30
cleanup_delay = 5
max_requests = 1024
listen {
        type = auth
        ipaddr = *
        port = 0
}
listen {
        ipaddr = *
        port = 0
        type = acct
}
hostname_lookups = no
allow_core_dumps = no
regular_expressions     = yes
extended_expressions    = yes
log {
        destination = files
        file = ${logdir}/radius.log
        syslog_facility = daemon
        stripped_names = yes
        auth = yes
        auth_badpass = yes
        auth_goodpass = yes
}
checkrad = ${sbindir}/checkrad
security {
        max_attributes = 200
        reject_delay = 1
        status_server = yes
        allow_vulnerable_openssl = no
}
proxy_requests  = yes
$INCLUDE proxy.conf
$INCLUDE clients.conf
thread pool {
        start_servers = 5
        max_servers = 32
        min_spare_servers = 3
        max_spare_servers = 10
        max_requests_per_server = 0
}
modules {
        $INCLUDE ${confdir}/modules/
        $INCLUDE eap.conf
        $INCLUDE sql.conf
        $INCLUDE sqlippool.conf
}
instantiate {
        exec
        expr
        expiration
        logintime
}
$INCLUDE policy.conf
$INCLUDE sites-enabled/
# cp sql.conf sql.conf.orig
# vim sql.conf

Alterar
password = "SUA-SENHA"

Descomente
readclients = yes

# cat sql.conf |grep -v "#" |awk 'NF>0'

sql.conf ficará assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sql {
        database = "mysql"
        driver = "rlm_sql_${database}"
        server = "localhost"
        login = "radius"
        password = "MINHA-SENHA"
        radius_db = "radius"
        acct_table1 = "radacct"
        acct_table2 = "radacct"
        postauth_table = "radpostauth"
        authcheck_table = "radcheck"
        authreply_table = "radreply"
        groupcheck_table = "radgroupcheck"
        groupreply_table = "radgroupreply"
        usergroup_table = "radusergroup"
        deletestalesessions = yes
        sqltrace = no
        sqltracefile = ${logdir}/sqltrace.sql
        num_sql_socks = ${thread[pool].max_servers}
        connect_failure_retry_delay = 60
        lifetime = 0
        max_queries = 0
        readclients = yes
        nas_table = "nas"
        $INCLUDE sql/${database}/dialup.conf
}
# cd /etc/freeradius/sites-available
# cp inner-tunnel  inner-tunnel.orig
# vim inner-tunnel

Descomente os sql encontrado em authorize/session/post-auth

authorize {
        [...]
        sql
        [...]
}
[...]
session {
         #radutmp
        sql
}
post-auth {
        sql
}

Comente

#       Post-Auth-Type REJECT {
#               # log failed authentications in SQL, too.
##              sql
#               attr_filter.access_reject
#       }
# cat /etc/freeradius/sites-available/inner-tunnel  |grep -v "#" |awk 'NF>0'

inner-tunne ficará assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
server inner-tunnel {
listen {
       ipaddr = 127.0.0.1
       port = 18120
       type = auth
}
authorize {
        chap
        mschap
        suffix
        update control {
               Proxy-To-Realm := LOCAL
        }
        eap {
                ok = return
        }
        files
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        unix
        eap
}
session {
        sql
}
post-auth {
        sql
}
pre-proxy {
}
post-proxy {
        eap
}
# cp default default.orig
# vim default

Comente / Descomente

authorize {
	#digest
	#suffix
	#files
        sql
}

Comente:

authenticate {
        #digest
        #unix
}
preacct {
        #suffix
        #files
}

Comente / Descomente / inclua abaixo de sql sqlippool

accounting {
        #detail
        sql 
        sqlippool
        #exec
        #attr_filter.accounting_response
}
session {
	#radutmp
        sql
}

post-auth {
        sql 
        sqlippool

        #exec
#       Post-Auth-Type REJECT {
#               # log failed authentications in SQL, too.
##              sql
#               attr_filter.access_reject
#       }
}
# cat /etc/freeradius/sites-available/default  |grep -v "#" |awk 'NF>0'

default ficará assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
authorize {
        preprocess
        chap
        mschap
        eap {
                ok = return
        }
        sql
        expiration
        logintime
        pap
}
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        eap
}
preacct {
        preprocess
        acct_unique
}
accounting {
        sql
        sqlippool
}
session {
        sql
}
post-auth {
        sql
        sqlippool
}
pre-proxy {
}
post-proxy {
        eap
}

Habilite o control-socket

# cd /etc/freeradius/sites-enabled
# ln -s ../sites-available/control-socket

SQLIPOOL
https://wiki.freeradius.org/modules/Rlm_sqlippool

Como dito este é um cenário bem tipico de provedores, então vou usar o modulo sqlipool para deixar meus blocos de IPs diretamente no banco de dados, assim temos um aproveitamento de 100% dos IPs, ainda mais com o esgotamenteo de IPv4 no mundo.
IMPORTANTE: Esse formato pode gerar problemas, um deles é a duplicidade de IPs em sua rede, isso acontece se você tiver varios Servidores PPPoE/Hotspot (se bem que em hotspot eu não usaria), espalhados na sua rede, caso haja alguma interrupção entre seu PPPoE Server e o Freeradius, o Freeradius poderá liberar o IP da da tabela radippool, e assim algum outro PPPoE Sever acabar alocando o mesmo. Então tome cuidado. Eu particularmente usei um script que em caso o Servidor PPPoE perder comunicação com o Servidor Freeradius ele desconecta todos os usuários conectados, assim quando voltar a comunicação seja feito uma nova conexão aos clientes.

# vim /etc/freeradius/sqlippool.conf

Altere
$INCLUDE sql/postgresql/ippool.conf
Por
$INCLUDE sql/mysql/ippool.conf

Este é um valor que você pode trabalhar caso tenha algum problema (eu uso o padrão)
## IP lease duration. (Leases expire even if Acct Stop packet is lost)
lease-duration = 3600

Para evitar duplicidade uso o MAC com key (Pois as NAS-port pode se repetir quando se tem mais de um PPPoE Serv)
Comente:
#pool-key = "%{NAS-Port}"
Descomente:
pool-key = "%{Calling-Station-Id}"

Como é bem possível que seu servidor não autentique apenas usuários pppoe ou hotspot, para não termos cada vez que por exemplo um autenticação wireless psk/eap aparece o log que não foi definido uma pool, eu comentei:
#sqlippool_log_nopool = "No Pool-Name defined \
# (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"

# cat sqlippool.conf |grep -v "#" |awk 'NF>0'

sqlippool.conf ficará assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sqlippool {
 sql-instance-name = "sql"
 ippool_table = "radippool"
 lease-duration = 3600
 pool-key = "%{Calling-Station-Id}"
$INCLUDE sql/mysql/ippool.conf
 sqlippool_log_exists = "Existing IP: %{reply:Framed-IP-Address} \
  (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"
 sqlippool_log_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})"
 sqlippool_log_clear = "Released IP %{Framed-IP-Address}\
 (did %{Called-Station-Id} cli %{Calling-Station-Id} user %{User-Name})"
 sqlippool_log_failed = "IP Allocation FAILED from %{control:Pool-Name} \
  (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"
 #sqlippool_log_nopool = "No Pool-Name defined \
 # (did %{Called-Station-Id} cli %{Calling-Station-Id} port %{NAS-Port} user %{User-Name})"
}

Umas das alterações que acho interessante alterar no ippool, é 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 o /etc/freeradius/sql/mysql/ippool.conf

# vim /etc/freeradius/sql/mysql/ippool.conf

Comente

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

Descomente

### If you prefer to allocate a random IP address every time, i
### use this query instead
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"

COUNTER

Modulo counter é legal para criar alguns cenários de hotspot, ode você deseja limitar o tempo de conexão. Exemplo limitar que um usuário tenha acesso apenas durante 2h por dia/mês/único... E com um pouco de trabalho e personalização no /etc/freeradius/sql/mysql/counter.conf você consegue personalizar para contabilizar até mesmo tráfego de dados.

Caso você deseje habilitar-lo faça o seguinte:

# vim radius.conf

Descomenta

modules {
[...]
       $INCLUDE sql/mysql/counter.conf
[...]
}

Adicione

instantiate {
[...]
        # Habilite o mesmo no inner-tunnel
        # Modulos em  /etc/freeradius/sql/mysql/counter.conf
        dailycounter
        monthlycounter
        noresetcounter
[...]
}
# vim /etc/freeradius/sites-available/inner-tunnel

Adicione abaixo de sql

authorize {
[...]
        sql

        #Mod Counter
        noresetcounter
        dailycounter
        monthlycounter
[...]
}
# vim /etc/freeradius/sites-available/default

Adicione abaixo de sql

authorize {
[...]
        sql

        noresetcounter
        dailycounter
        monthlycounter
[...]
}

Corrigindo um bug. Acerte o nome da tabela (AcctSessionTime ==> acctsessiontime)

# vim /etc/freeradius/sql/mysql/counter.conf
Altere
query = "SELECT IFNULL(SUM(AcctSessionTime),0) FROM radacct WHERE UserName='%{%k}'"
Para
query = "SELECT IFNULL(SUM(acctsessiontime),0) FROM radacct WHERE username='%{%k}'"

ALIMENTANDO NOSSA BASE DE DADOS

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

# mysql -u radius -p

Entre com SUA-SENHA do radius no MySQL.

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

Agora vamos inserir alguns valores na nossa base de dados com alguns exemplos que explicarei no decorrer.
Se você preferir pode usar os comando mysql direto no PHPMyAdmin.

Primeiramente precisamos de um cenário de rede para montar nossas configurações.
FreeRadius: 250.250.0.10
RB/RouterOS HotSpot: 250.250.1.2
RB/RouterOS PPPoE: 250.250.1.3 / 10.10.0.1
UBNT AP: 10.10.0.2

Note que nosso UBNT não está na mesma classe de IPs do FreeRadius, então possivelmente sua rede deve ter configurado algum tipo roteamento como OSPF / iBGP, que faça com que seu AP vs FreeRadius consiga comunicação. Caso exista um NAT para seu AP explicarei o que munda em seguida.

TABELAS

• nas
A tabela NAS contém dados sobre (radius clientes) e é uma "substituição" para o arquivo clients.conf. É muito mais fácil manter os clientes no banco de dados do que dentro do arquivo de configuração. Ou seja, sua RB/RouterOS e seu UBNT AP são clientes, são eles que irão fazer consultas em nosso servidor. Para devemos autorizá-los inserindo na tabela nas:

1
2
3
4
INSERT INTO `nas` (`nasname`, `shortname`, `type`, `ports`, `secret`, `server`, `community`, `description`) VALUES
('250.250.1.2', 'RB-RouterOS-PPPoE', 'other', NULL, 'SEU-SECRET', NULL, NULL, 'RouterOS PPPoE'),
('250.250.1.3', 'RB-RouterOS-HotSpot', 'other', NULL, 'SEU-SECRET', NULL, NULL, 'RouterOS HotSpot'),
('10.10.0.2', 'UBNT-AP', 'other', NULL, 'SEU-SECRET', NULL, NULL, 'POP1');

Depois de adicionar, editar ou apagar dados da tabela nas é necessário reiniciar o serviço FreeRadius para atualizar os dados.

# /etc/init.d/freeradius restart

• radcheck - Armazena os registo de cada utilizador com os respectivos atributos associados;
• radgroupcheck – Associa atributos a um determinado grupo de utilizadores;
• radgroupreply – Armazena os atributos que são devolvidos a todos os utilizadores de um grupo;
• radusergroup - Associa um utilizador a um grupo de utilizadores;
• radreply – Contém lista de atributos enviados ao utilizador;
• radpostauth – Armazena informações acerca das respostas enviadas para os utilizadores;
• radacct - Se encontra toda a informação de contabilização (extrato);

Vamos criar algumas configurações padrões, "nossos planos". Lembre-se que os atributos especificados não são necessariamente os mesmos, dependendo do seu cenário, uma boa alternativa é você rodar o freeradius em modo debug (# freeradius -X), e visualizar quais os valores estão vindo, assim você pode observar o que cada autenticação esta lhe trazendo e assim configurando seu grupo de forma segura. Fique atento pois se você cadastrar apenas um atributo poderá estar deixando grandes falhas de segurança.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
INSERT INTO `radgroupcheck` (`groupname`, `attribute`, `op`, `value`) VALUES
('PLANO_1', 'Pool-Name', ':=', 'minhapool'), /* Definimos o nome da pool de IPs*/
('PLANO_1', 'Simultaneous-Use', ':=', '1'), /* Permitimos apenas uma autenticação simultânea */
('PLANO_1', 'Framed-Protocol', ':=', 'PPP'), /* Apenas protocolo PPP então isso não server para Hotspot */
('PLANO_1', 'Service-Type', ':=', 'Framed-User'), /* Tipo de serviço  */
('PLANO_2', 'Pool-Name', ':=', 'minhapool'),
('PLANO_2', 'Simultaneous-Use', ':=', '1'),
('PLANO_2', 'Framed-Protocol', ':=', 'PPP'),
('PLANO_2', 'Service-Type', ':=', 'Framed-User'),
('AVISO', 'Pool-Name', ':=', 'avisoPool'),
('AVISO', 'Simultaneous-Use', ':=', '1'),
('AVISO', 'Framed-Protocol', ':=', 'PPP'),
('AVISO', 'Service-Type', ':=', 'Framed-User'),
('BLOQUEIO', 'Pool-Name', ':=', 'bloqPool'),
('BLOQUEIO', 'Simultaneous-Use', ':=', '1'),
('BLOQUEIO', 'Framed-Protocol', ':=', 'PPP'),
('BLOQUEIO', 'Service-Type', ':=', 'Framed-User'),
('PLANO_HOT', 'NAS-Port-Type', '==', 'Wireless-802.11'),
('PLANO_HOT(naonecessariamente)', 'Pool-Name', ':=', 'poolHot'),
('PLANO_HOT', 'Simultaneous-Use', ':=', '1'),
('30MIN-DIA', 'Max-Daily-Session', ':=', '1800'), /* Modulo counter */
('30MIN-DIA', 'NAS-Port-Type', '==', 'Wireless-802.11'),
('30MIN-DIA', 'Simultaneous-Use', ':=', '1'),
('2h-UNICO', 'Max-All-Session', ':=', '7200'),
('2h-UNICO', 'NAS-Port-Type', '==', 'Wireless-802.11'),
('2h-UNICO', 'Simultaneous-Use', ':=', '1'),
('7.5h-MES', 'Max-Monthly-Session', ':=', '27000'),
('7.5h-MES', 'NAS-Port-Type', '==', 'Wireless-802.11'),
('7.5h-MES', 'Simultaneous-Use', ':=', '1');
 
INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
('PLANO_1', 'Acct-Interim-Interval', ':=', '300'), /* Intervalo em seg que a radcct será atualizada */
('PLANO_1', 'Mikrotik-Rate-Limit', ':=', '1024k/2048k'), /* Velocidade da queues */
('PLANO_2', 'Mikrotik-Rate-Limit', ':=', '512k/1024k 1024k/2048k 512k/1024k 600/600'), /* Velocidade com Burst */
('PLANO_2', 'Acct-Interim-Interval', ':=', '300'),
('AVISO', 'Acct-Interim-Interval', ':=', '300'),
('AVISO', 'Mikrotik-Rate-Limit', ':=', '999K/999K'),
('BLOQUEIO', 'Mikrotik-Rate-Limit', ':=', '999K/999K'),
('BLOQUEIO', 'Acct-Interim-Interval', ':=', '300'),
('PLANO_HOT', 'Acct-Interim-Interval', ':=', '300'),
('PLANO_HOT', 'Mikrotik-Rate-Limit', ':=', '1024K/1024K'),
('30MIN-DIA', 'Acct-Interim-Interval', ':=', '300'),
('30MIN-DIA', 'Mikrotik-Rate-Limit', ':=', '1024K/1024K'),
('2h-UNICO', 'Acct-Interim-Interval', ':=', '300'),
('2h-UNICO', 'Mikrotik-Rate-Limit', ':=', '1024K/1024K'),
('7.5h-MES', 'Acct-Interim-Interval', ':=', '300'),
('7.5h-MES', 'Mikrotik-Rate-Limit', ':=', '1024K/1024K');

Criamos alguns planos para atribuir aos nossos usuários PPPoE e Hotspot. Vamos aos nossos usuários:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
/*Autenticacao de um cliente CPE UBNT WIFI WPA2 EAP */
('cliente5.8@dominio.com.br', 'Cleartext-Password', ':=', 'senha'),
('cliente5.8@dominio.com.br', 'Calling-Station-Id', '==', '00:11:22:33:44:55'),
('cliente5.8@dominio.com.br', 'Service-Type', '==', 'Framed-User'),
('cliente5.8@dominio.com.br', 'Simultaneous-Use', ':=', '1'),
('cliente5.8@dominio.com.br', 'Pool-Name', ':=', 'minhapool'),
('cliente5.8@dominio.com.br', 'Framed-Protocol', ':=', 'PPP'),
('001122334455', 'Cleartext-Password', ':=', 'minhasenha'),
('001122334455', 'Auth-Type', '==', 'EAP'),
 
/*Autenticacao de um cliente CPE UBNT 2.4 vs WIFI WPA/WPA2 PSK RouterOS */
('cliente2.4@dominio.com.br', 'Cleartext-Password', ':=', 'senha'),
('cliente2.4@dominio.com.br', 'Calling-Station-Id', '==', '55:44:33:22:11:00'),
('cliente2.4@dominio.com.br', 'Service-Type', '==', 'Framed-User'),
('cliente2.4@dominio.com.br', 'Simultaneous-Use', ':=', '1'),
('cliente2.4@dominio.com.br', 'Pool-Name', ':=', 'minhapool'),
('cliente2.4@dominio.com.br', 'Framed-Protocol', ':=', 'PPP'),
('55:44:33:22:11:00', 'Auth-Type', ':=', 'Accept'),
('55:44:33:22:11:00', 'NAS-Port-Type', '==', 'Wireless-802.11');
 
INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES
('55:44:33:22:11:00', 'Mikrotik-Wireless-PSK', ':=', 'senha-psk');
/* A senha PSK fica na radreply */

E por fim vamos alimentar nossa tabela de ippool, como nossos IPs que serão entregue. No cenário fiz 3 pool, minhapool ounde vão ficar os IPs válidos, avisoPool que receberão um bloco de ips diferenciado, por ex. para direcionar os clientes para algum tipo de aviso. E bloqPool para clientes que ficarão bloqueado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO `radippool` (`pool_name`, `framedipaddress`, `nasipaddress`, `calledstationid`, 
`callingstationid`, `expiry_time`, `username`, `pool_key`) VALUES
('minhapool', '100.64.0.1', '', '', '', NULL, '', '0'),
('minhapool', '100.64.0.2', '', '', '', NULL, '', '0'),
('minhapool', '100.64.0.3', '', '', '', NULL, '', '0'),
('minhapool', '100.64.0.4', '', '', '', NULL, '', '0'),
('bloqPool', '172.16.0.1', '', '', '', NULL, '', '0'),
('bloqPool', '172.16.0.2', '', '', '', NULL, '', '0'),
('bloqPool', '172.16.0.3', '', '', '', NULL, '', '0'),
('bloqPool', '172.16.0.4', '', '', '', NULL, '', '0'),
('avisoPool', '172.16.1.1', '', '', '', NULL, '', '0'),
('avisoPool', '172.16.1.2', '', '', '', NULL, '', '0'),
('avisoPool', '172.16.1.3', '', '', '', NULL, '', '0'),
('avisoPool', '172.16.1.4', '', '', '', NULL, '', '0');

Ainda pode fixar algumas configurações especificadamente ao usuário, vamos a alguns exemplos.

1
2
3
4
5
INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES
('usuario@dominio.com.br', 'Mikrotik-Rate-Limit', ':=', '2000k/4000k'), /* Setando velocidade */
('usuario@dominio.com.br', 'Framed-IP-Address', ':=', '250.250.0.150'), /* Setando IP Fixo */
('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" */

Configuração Simples do PPPoE Server no RouterOS (Mikrotik)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/interface pppoe-server server
add authentication=pap,chap disabled=no interface=Bridge keepalive-timeout=30 max-mru=1480 \
 max-mtu=1480 one-session-per-host=yes service-name=PPPoE-Server
 
/ppp profile
set *0 change-tcp-mss=default dns-server=250.250.0.2,250.250.0.3 local-address=250.250.0.10 
 
/ppp aaa
set interim-update=5m use-radius=yes
 
/radius
add address=186.250.168.7 secret="SEU-SECRET" service=ppp,hotspot,wireless
 
####################
### Wireless PSK ###
####################
/interface wireless security-profiles
add authentication-types=wpa2-psk management-protection=allowed mode=dynamic-keys name=WPA2 \ 
 radius-mac-authentication=yes wpa2-pre-shared-key=3n20oXOPjohONpEK
 
/interface wireless
set [ find default-name=wlan1 ] security-profile=WPA2

Configuração UBNT AP (10.10.0.2)

Configuração UBNT Cliente EAP 5.8Mhz

Configuração UBNT Cliente PSK 2.4Mhz Conectando no Cartão do MK

Fontes:
https://wiki.freeradius.org/guide/SQL-HOWTO
https://wiki.freeradius.org/modules/Rlm_sql
https://wiki.freeradius.org/modules/Rlm_sqlippool
https://wiki.freeradius.org/modules/Rlm_sqlcounter

https://www.draw.io/ (Gráficos)

Rudimar Remontti

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

Você pode gostar...

23 Resultados

  1. Fernando disse:

    Bom dia Rudimar,

    Implementei o serviço de counter no freeradius, fiz toda a configuração do tutorial e está funcionando blz. Só que tem um porem, quando o limite de tempo estabelecido previamente se esgota o usuário não é desconectado automaticamente, eu preciso derrubar a conexão do usuário manualmente, ou o usuário desconecte e tente refazer conexão para que esse bloqueio funcione, somente assim ele recebe a mensagem que o tempo limite de uso se esgotou. Preciso que assim que o tempo de uso chegue ao fim o usuário seja desconectado automaticamente. Como poderia ser feito isso? Meu ambiente é mikrotik/freeradius/mysql/unifi

  2. Cairo disse:

    Remontti,

    Tenho uma rede hotspot onde todos os meus 10 APs são mikrotik, onde estes APs são gerenciados via CAPsMAN(Concentrador) e todas as configurações de IP,dhcp,hotspot, SSID e segurança são feitas nesse concentrador e repassadas ao demais AP’s automaticamente. No entanto eu gostaria de saber quais usuários estão conectados em quais APs, sem a necessidade de configurar cada AP individualmente(hotspot, ip, dhcp, radius..etc) . Isso é importante para que eu possa saber quais aps tem o maior volume conexões na minha rede.

    Atualmente eu só cadastro o ip do mikrotik(concetrador) na tabela nas do freeradius, e através da tabela radacct eu vejo todos os meus usuários conectados a esse NAS cadastrado(nasipaddress). A minha necessidade é visualizar esses usuários conectados no seu devido AP.

  3. Dione disse:

    Muito bom teu tutorial….queria tirar uma duvida eu uso EdegeRouterLite , como roteador, e saída pra clientes rocket M5 , vi em vários lugares NA NET mas ainda fica uma coisa no ar!!!os cliente do meu servidorpppoe !! por exemplo eu cadastro ele no edgerouter? ou no Radius? e o controle de banda no pppoe seria configurado no radius?obrigado

  4. Cairo disse:

    Bom dia Remontti, primeiramente parabens pelo post, bem esplicativo e ajudou muito.

    Tenho uma duvida, preciso montar um servidor freeradius, onde esse servidor ira hospedar informaçoes de varios clientes(hotspots) diferente, e gostaria de ter nesse unico servidor as configuraçoes dos diversos clientes diferentes, como configuraçoes de autenticaçao e contabilidade de cadas cliente independente, banco de dados unico para cada cliente. Como se fosse varias instancias no mesmo servidor. Parecido com o Virtual host do Apache. Eu sei que é possivel fazer isso no freeradius, agora voce conhece algum material explicativo para me ajudar a montar esse cenário aqui. sabe como configuro isso? Pode me ajudar?

  5. Cairo Alberto disse:

    Muito bom tutorial Remontti, parabens pelo material e apoio que você presta a comunidade de TI.

    Segui todos os passos do seu tutorial, só que estou enfrentando um problema ao configurar o modulo Counter, depois de preencher todas as informações , quanto tento iniciar o serviço do Freeradius ele nao sobe e da o seguinte erro nos logs: ERROR: Cannot find a configuration entry for module “month1ycounter” . Ja revi todos os passos , verifiquei a digitação, e nao encontrei o erro. Será o que pode ser em? pode me ajudar? Desde Já obrigado.

  6. Tiago disse:

    Rudimar,

    Tenho muitos problemas de duplicidade de ip, tu tens como compartilhar o script (ou como é feito na teoria) para que derrube todos clientes, sendo assim, evitando a duplicidade?

  7. Willians gomes disse:

    ola, estou fazendo um hotspot com laravel e freeradius e gostaria de treinamento sobre o radius para fazer algumas funçoes.

  8. Pedro Henrique disse:

    Rudimar, obrigado por compartilhar o seu conhecimento.

    Fiz o procedimento indicado logo no inicio deste post: http://blog.remontti.com.br/2066
    Não obtive sucesso. O que tenho que fazer aqui é o seguinte: Mikrotik com Hotpost autenticando no Servidor linux com o FreeRadius, tem tanta informação aqui que não sei qual fazer. Saberia me dizer quais passos eu devo seguir neste tutorial daqui, ele está mais completo do que no indicado acima.

  9. Fabio Nicolau disse:

    Ótimo artigo. Gostaria de saber se existe alguma forma de liberar o NAS de outra forma, pois os meus hostpots tem IP dinâmico e para libera-los tenho sempre que atualizar a tabela NAS. Há alguma forma de liberar a autenticação por meio do Identity ou Serial?

    Obrigado

    • FABIO
      Você pode colocar no arquivo: /etc/freeradius/clients.conf

      client 0.0.0.0/0 {
             secret          = meusecre
             shortname       = all-network
      }

      Porém você vai deixar qualquer um solicitar consultas em seu radius…
      Ao meu ver é um ponto negativo na segurança, mas seria uma solução.

  10. Ivan disse:

    Bom dia Rudimar.
    Me chamo Ivan.
    Gostei muito de seu tutorial de radius.
    Já algum tempo, estava querendo aprender mais sobre radius.
    Será que poderíamos combinar um valor e você ministrar um treinamento de radius para mim ??

    Obrigado.

  1. 3 de julho de 2017

    […] Para conhecer os atributos que você pode usar em sua base recomendo a leitura do tutorial: Servidor FreeRadius com integração MySQL + Autenticação PPPoE & Hotspot VS Mikrotik + Ubiquiti E… […]

Deixe uma resposta

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