Servidor FreeRadius com integração MySQL + Autenticação PPPoE & Hotspot VS Mikrotik + Ubiquiti EAP/PSK [Descontinuado]
Versão mais atual deste tutorial:
https://blog.remontti.com.br/4063
https://blog.remontti.com.br/4085
(Descontinuado)
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.
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
[...] <font color="blue">ipv6addr = ::</font> [...] <font color="blue">$INCLUDE sql.conf</font> [...] <font color="blue">$INCLUDE sqlippool.conf</font> [...]
Se deseja ter logs mais detalhados altere os valores abaixo para yes.
[...] log { [...] stripped_names = <font color="blue">yes</font> auth = <font color="blue">yes</font> auth_badpass = <font color="blue">yes</font> auth_goodpass = <font color="blue">yes</font> [...] } [...]
# cat radiusd.conf |grep -v "#" |awk 'NF>0'
radius.conf ficará assim:
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:
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
<em>authorize { [...] <font color="blue">sql</font> [...] } [...] session { <font color="red">#radutmp</font> <font color="blue">sql</font> } post-auth { <font color="blue">sql</font> }</em>
Comente
<em><font color="red"># Post-Auth-Type REJECT { # # log failed authentications in SQL, too. ## sql # attr_filter.access_reject # }</em></font>
# cat /etc/freeradius/sites-available/inner-tunnel |grep -v "#" |awk 'NF>0'
inner-tunne ficará assim:
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
<em>authorize { <font color="red">#digest #suffix #files</font> <font color="blue">sql</font> }
Comente:
authenticate { <font color="red">#digest #unix</font> } preacct { <font color="red">#suffix #files</font> }</em>
Comente / Descomente / inclua abaixo de sql sqlippool
<em>accounting { <font color="red">#detail</font> <font color="blue">sql <b>sqlippool</b></font> <font color="red">#exec #attr_filter.accounting_response</font> } session { <font color="red">#radutmp</font> <font color="blue">sql</font> } post-auth { <font color="blue">sql sqlippool</font> <font color="red"> #exec # Post-Auth-Type REJECT { # # log failed authentications in SQL, too. ## sql # attr_filter.access_reject # }</font> }</em>
# cat /etc/freeradius/sites-available/default |grep -v "#" |awk 'NF>0'
default ficará assim:
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:
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... <font color="red">#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"</font>
Descomente
### If you prefer to allocate a random IP address every time, i ### use this query instead <font color="blue">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"</font>
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 { [...] <font color="blue">$INCLUDE sql/mysql/counter.conf</font> [...] }
Adicione
instantiate { [...]<font color="blue"> # Habilite o mesmo no inner-tunnel # Modulos em /etc/freeradius/sql/mysql/counter.conf dailycounter monthlycounter noresetcounter</font> [...] }
# vim /etc/freeradius/sites-available/inner-tunnel
Adicione abaixo de sql
authorize { [...] sql <font color="blue"> #Mod Counter noresetcounter dailycounter monthlycounter</font> [...] }
# vim /etc/freeradius/sites-available/default
Adicione abaixo de sql
authorize { [...] sql <font color="blue"> noresetcounter dailycounter monthlycounter</font> [...] }
Corrigindo um bug. Acerte o nome da tabela (AcctSessionTime ==> acctsessiontime)
# vim /etc/freeradius/sql/mysql/counter.conf
<strong>Altere</strong> <font color="red">query = "SELECT IFNULL(SUM(AcctSessionTime),0) FROM radacct WHERE UserName='%{%k}'"</font> <strong>Para</strong> <font color="blue">query = "SELECT IFNULL(SUM(<strong>acctsessiontime</strong>),0) FROM radacct WHERE username='%{%k}'"</font>
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.
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:
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.
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:
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.
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.
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)
/interface pppoe-server server add authentication=pap,chap disabled=no interface=ether1 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=250.250.250.2 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)
Boa tarde Rudimar,
Parabéns pelos tutoriais.
Você tem curso sobre o Freeradius? caso sim poderia me enviar o valor?
é possivel usar um banco de dados sql com ip publico ao inves de criar um banco de dados com mesmo ip privado do freeradius? No caso eu não criaria um usuario, apenas entraria com meu usuário sql e apenas adicionaria o banco de dados do freeradius nele. Isso seria possível?
Ótimo post. Estou na dúvida em duas coisas:
Usando o FreeRadius, como posso verificar se um usuário está online ou off-line, creio que seja na tabela radacct porém não sei exatamente como proceder, e como realizar a desconexão do usuário através do FreeRadius. Obrigado pelo post!
Sim é na radacct vc pode verificar o campo acctstoptime se esta NULL, se sim esta conectado (nem sempre), depende onde esta conectado (router), vc pode desconectar via alguma API, SSH, radius incoming….
Outra dúvida, se eu for trabalhar com dois NASs, um da Mikrotik e outro da Cisco. Com relação ao cadastro dos grupos, posso cadastrar o grupo uma vez em ‘radgroupcheck’, e posso cadastrar todos os atributos referentes aos dois modelos de NASs, em ‘radgroupreply’?
Boa tarde Amigo, queria tirar uma dúvida contigo, assim que eu ativei todo conjunto (Freeradius / MySql / Mikrotik) abri o debug do freeradius e observei uma coisa estranha, de 30 em 30 segundos o Mikrotik tenta realizar uma conexão no servidor do freeradius, e inclusive fica gravado na tabela “radpostauth” essa tentativa na seguinte forma:
username;pass;reply;authdate
TEST; x=3D27=3DD5q=3D7E=3DC4=3D27GM=3D241Jx:=3D95=3D99;Access-Reject ;2018-05-18 16:42:28
TEST;x=3D27=3DD5q=3D7E=3DC4=3D27GM=3D241Jx:=3D95=3D99;Access-Reject;2018-05-18 16:42:58
Inicialmente achei que fosse uma espécie de ping do Mikrotik para verificar se o freeradius estava OK, mas pensando bem isso seria bem estranho, até mesmo pq vai superlotar o banco com informações sem utilidade, ainda mais por conta dessa frequencia de 30 em 30 segundos.
Vc ja viu algo assim acontecendo??? Pesquisei muito sobre isso, mas não encontrei ninguém comentando a respeito.
Nunca tinha visto estes valores.
Se você tem autenticação wpa/psk wireless pode ser ela.
Se você quiser desativar a radpostauth (pra mim ela nunca foi útil) é só comentar em:
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
Por tempo ele desconecta. Ele não desconecta por dados. Verifica deve ser algum detalhe mínimo. Dá uma repassada no tutorial, veja tb se está usando a distribuição que realizei o tutorial.
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.
É possível que no seu concentrador vc tenha o serviço hotspot rodando em uma brid, vc poderia pegar o mac que esta autenticado e fazer uma consulta nos hosts da brid e pegar ql interface ele ta chegando.
entendi, mas tem uma forma de eu monitorar isso no freeradius, pelas suas tabelas, como radacct e nas?
Olha todas as tabelas e veja se consegue pegar a informação que vc precisa, se tiver em uma delas só programar… Mas se não tiver ai vc vai precisar criar umas “gambiarras” heheh
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
A ideia é ter tudo no banco de dados, usuarioXsenha, usuario x MAC, usuario x Controle de banda….
Você precisa fazer a integração do EdgeRouter com o FreeRadius.
Quanto ao controle de banda, teria que ver quais atributos os Edge reconhece.
https://community.ubnt.com/t5/airOS-Software-Configuration/AirOS-V-Feature-Requests/td-p/131973
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?
https://wiki.freeradius.org/config/Virtual-server
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.
Nao foi preciso de seu apoio, consegui resolver o problema. Foi algum erro de digitação nos arquivos de configuração. kkkk. Valeu
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?
Faça um script, em seu roteador que se ele perder comunicação com o FreeRadius ele desconecte seus PPPoEs.
ola, estou fazendo um hotspot com laravel e freeradius e gostaria de treinamento sobre o radius para fazer algumas funçoes.
Telegram @remontti
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.
O tutorial: http://blog.remontti.com.br/2066 é mais atualizado.
Já no http://blog.remontti.com.br/1651 tem mais detalhes de como configurar as tabelas do freeradius.
Bom é fundamental que você tenha um conhecimento básico do funcionamento do RouterOS (mikrotik) para usar radius nele, e conhecimento do freeradius…
Qqr coisa chama la no Telegram @remontti
Ó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
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.
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.
Ivan
Claro, já estamos fazendo, vi hoje seu comentário.