Considerando a necessidade que tive para realização de autenticação em DHCP com o MKAUTH (planos altos se comportam melhor em DHCP do que em PPPoE) e considerando que o mesmo não dá esse suporte, fiz pesquisas no fórum do MKAUTH com a intenção de encontrar alguma resposta para meu caso. A solução que achei mais parecida com o que queria foi feita por Jonas Ferreira (http://mk-auth.com.br/forum/topics/autentica-o-hotspot-autom-tica-via-mac-address), mas não queria que fosse necessário abrir uma página da web para a realização do login automático queria que fosse o mais prático possível, só em conectar o cabo na ONU usando DHCP e realizar a autenticação. Baseado nisso, resolvi botar a mão na massa e fazer a solução.
O funcionamento dela é baseado no arquivo prelogin.php feito por Jonas (fiz algumas alterações nele).
De forma resumida, é criado um servidor DHCP no mikrotik na interface onde será realizado o atendimento ao cliente e nele é inserido um script para executar uma ação usando a ferramenta "/tool fetch" que envia ao mkauth (via http) o MAC do roteador e retorna parâmetros como login, plano, se está bloqueado, se está desativado (é necessário ter o MAC da WAN do roteador no cadastro do cliente). Abaixo vou litar em tópicos o que é necessário para o funcionamento correto.
REQUISITOS
- RouterOS versão maior ou igual a 6.43;
- Arquivo prelogin.php colocado no diretório /var/www/login/ (arquivo em anexo);
- O RouterOS deve ter comunicação WEB com o mkauth;
- Ter o MAC do cliente cadastrado;
SEGURANÇA
- Na interface do mikrotik onde será colocado o DHCP-SERVER, deve deixar a opção ARP com o valor "reply-only" (evita que o cliente coloque um IP fixo e tenham acesso em L3 ao mikrotik);
- No DHCP-SERVER criado no mikrotik na interface que fará o atendimento ao cliente, deve ser marcada a opção "add ARP For Leases" e "Lease Time" com valor "00:00:30" (isso faz com que somente clientes que pegeram um IP **lease** com o mikrotik tenham comunicação em L3 com ele e o tempo de concessão baixo é necessário para a autenticação pelo script para o caso de falha);
- Inserir regras de filtro para address-list "pgcorte" (default), "pgdesativado" (novo) e "desconhecido" (novo); /ip firewall filter add chain=forwarding src-address-list="pgdesativado" action=drop; /ip firewall filter add chain=forwarding src-address-list="desconhecido" action=drop;
O SCRIPT
Abaixo segue o script que deve ser colocado no servidor DHCP do mikrotik (campo "lease-script") onde o X.X.X.X é o IP do mkauth (também coloquei em arquivo em anexo, nome lease-script.rsc):
************************
:local result [/tool fetch url="http://X.X.X.X/login/prelogin.php\?mac=$leaseActMAC" as-value output=user]; \
:if ($result->"status"="finished" and $result->"data"!="null") do={ \
:local lineInicial 0; \
:local lineFinal 0; \
:set lineFinal ([:find ($result->"data") "\n" $lineFinal]); \
:local login [:pick ($result->"data") ($lineInicial) $lineFinal]; \
:set lineInicial $lineFinal; \
:set lineFinal ([:find ($result->"data") "\n" $lineFinal]); \
:local plano [:pick ($result->"data") ($lineInicial+1) $lineFinal]; \
:set lineInicial $lineFinal; \
:set lineFinal ([:find ($result->"data") "\n" $lineFinal]); \
:local bloqueado [:pick ($result->"data") ($lineInicial+1) $lineFinal]; \
:set lineInicial $lineFinal; \
:set lineFinal ([:find ($result->"data") "\n" $lineFinal]); \
:local ativado [:pick ($result->"data") ($lineInicial+1) $lineFinal]; \
:set lineInicial $lineFinal; \
:set lineFinal ([:find ($result->"data") "\n" $lineFinal]); \
:local veldown [:pick ($result->"data") ($lineInicial+1) $lineFinal]; \
:set lineInicial $lineFinal; \
:set lineFinal ([:find ($result->"data") "\n" $lineFinal]); \
:local velup [:pick ($result->"data") ($lineInicial+1) $lineFinal]; \
/ip dhcp-server lease make-static [find mac-address=$leaseActMAC]; \
/ip dhcp-server lease set [find mac-address=$leaseActMAC] rate-limit=($velup."K/".$veldown."K") address-list="" comment=$login; \
:if ($bloqueado="nao" and $ativado="s") do={ \
/ip dhcp-server lease set [find mac-address=$leaseActMAC] lease-time=12:00:00; \
}; \
:if ($bloqueado="sim") do={ \
/ip dhcp-server lease set [find mac-address=$leaseActMAC] lease-time=00:05:00 address-list="pgcorte"; \
} \
else={ \
:if ([/ip dhcp-server lease get [find mac-address=$leaseActMAC] address-list]="pgcorte") do={ \
/ip dhcp-server lease set [find mac-address=$leaseActMAC] address-list="";\
}; \
}; \
:if ($ativado="n") do={ \
/ip dhcp-server lease set [find mac-address=$leaseActMAC] lease-time=00:05:00 address-list="pgdesativado"; \
} \
else={ \
:if ([/ip dhcp-server lease get [find mac-address=$leaseActMAC] address-list]="pgdesativado") do={ \
/ip dhcp-server lease set [find mac-address=$leaseActMAC] address-list=""; \
}; \
}; \
} else={ \
/ip dhcp-server lease make-static [find mac-address=$leaseActMAC]; \
/ip dhcp-server lease set [find mac-address=$leaseActMAC] address-list="desconhecido"; \
};
****************************
EXEMPLOS DE COMO DEVE FICAR
CONSIDERAÇÕES
- A autenticação é feita através do retorno do banco de dados do mkauth e não pelo RADIUS;
- Como ela não é feita pelo RADIUS do mkauth, não há accounting (não terá registro de conexões no cadastro do cliente);
- Clientes autenticados e sem pendência ficam com lease-time de 12h, caso ele venha a ser bloqueado ou desativado esse evento só irá ocorrer depois da nova concessão (até terminar o tempo do lease-time, se o roteador do cliente reiniciar ou se você remover o lease manualmente);
- Clientes desativados e bloqueados possuem lease-time de 5min (para o caso dele ser reativado ou quitado o débito, esse tempo deve ser pequeno para a realização da próxima consulta no banco de dados do mkauth);
- No momento não funciona com clientes adicionais!
Estarei a disposição para esclarecimento caso alguém tenha alguma dúvida.
Respostas
Amigo, vejo q vc tem várias contribuições, sugiro q se puder compartilhar no github ficaria melhor o acesso e contribuições de outros usuários
Me chama no whatsapp 15996213328
Boa Tarde, Leandro.
Teria um tuto de como fazer ou vc faz e cobra pelo serviço?
Da pra fazer funcionar, porem o codigo disponibilizado precisa ajustar algumas coisas somente, mas funciona, coloquei em teste aqui em alguns clientes
https://wiki.mikrotik.com/wiki/Manual:IP/DHCP_Server#RADIUS_Support
Bom Dia , Ainda funciona esta forma de autenticação por DHCP?
compartilha como conseguio
PZ disse:
Compartilha com a comunidade como você fez para o DHCP autenticar usando o circuit-id, estou querendo fazer o mesmo aqui na minha operação!
PZ disse:
alguma novidade sobre o assunto?
o anexo nao esta abrindo, alguem pode no email jpauloff@gmail.com ou alguem pode me ajudar? preciso muito