Como entregar IPv6+IPv4 no Mikrotik/RouterOS através de PPPoE/DHCPv6 PD e registrando os logs em um banco de dados


Neste tutorial vamos aprender como entregar IPv6 para clientes finais utilizando RouterOS/Mikrotik (Concentrador PPPoE) e registrar os logs dos prefixos IPv6 entregue na WAN (Remote IPv6 Prefix Pool) e na LAN (DHCPv6 PD Pool).

Ainda hoje encontramos alguns bugs no Mikrotik, e um dos maiores motivos de buscar essa solução foi que freeradius não registra os logs de IPv6 PD (Mikrotik), o IPv6 que vai se configurar na LAN cliente (o mais importante a ser guardado), seria muito mais fácil para muitos sistemas se implementassem o Delegated-IPv6-Prefix, mas já faz 6 anos (jan/2020) que é motivo de discussão lá no forum. E para variar a solução é dar aquele jeitinho…. (Popular gambiarra) 😛

Para montar esse servidor de logs você precisa apenas de um serviço WEB (Apache/NGINX) PHP7+ e um banco de dados MySQL/MariaDB.

Requisito para montar um servidor do zero:
– Debian 10 Stretch / Instalação Limpa
– Como criar um servidor WEB Apache + PHP + MariaDB + phpMyAdmin no Debian 10 Buster “LAMP”

Você precisa ter um pouquinho de conhecimento em IPv6 e saber dividir as subclasses. Recomendo dar uma olhadinha no http://ipv6.nic.br/ lá irá encontrar cursos do NIC.BR.

Recomendo você instalar uma calculadora de IPv6. Aqui vai uma calculador muito boa que uso no dia a dia.

Para fazer o calculo use ex.:

Para esse projeto desenvolvi em PHP alguns arquivos onde fica “ouvido” os logs que o Mikrotik irá enviar e uma telinha simples para fazer buscas dos IPs nesse banco de dados. Já disponibilizei ele lá no github.

Com seu servidor web configurado, seria bacana criar um host no seu dns e configurar nesse seu servdor web um domínio virtual ex.: log6.seudominio.com.br onde você irá jogar os arquivos do projeto. Mas como muitos não tem essa facilidade vou tentar deixar aqui a forma mais simples, que é jogar os arquivos no diretório padrão do apache “/var/www/html”, assim qualquer um consegue montar 🙂

Acessamos o diretório base então

Por segurança crie/edite um .htaccess para proteger que apenas determinados IPs tenham acesso. (apensar de ter um token)

Altere pelo IPs que você deseja que tenham acesso. (Seus router e seu NOC)

Precisaremos criar um banco de dados e nossa tabela. Para gerar suas senhas/token recomendo https://senhasegura.remontti.com.br/ e gerar algo aleatório.

Crie o banco de dados, não esqueça de alterar a senha (SUA_SENHA_DA_CONEXAO)

Importe a tabela utilizando a senha criada anteriormente

Agora altere no arquivo config.php o token para validar seu envio de dados e acessar o interface simples que desenvolvi para buscas, e a senha de conexão com banco (db_password).

Agora acesse sua http(s)://URL/logs6/. Você deve receber a seguinte tela.

Já pode autenticar com seu token (ainda não terá logs, então não adianta querer fazer buscas rsrsrs)

Se alguém tiver ideias melhores/criticas todas são bem vindas, sinta-se a vontade para criar forks do projeto.

Para entregar IPv6 em seu Mk é claro que precisa ter conectividade v6 em seu concentrador PPPoE (Não vou entrar em detalhes nessa parte pois entraria na questão roteamento da sua rede, mas se vale de ajuda como dica um iBGP/OSPF resolve fácil)

Servidor preparado para receber os logs vamos ao routerOS/Mikrotik. Você precisará criar duas Pool, uma para WAN outra para a LAN, como recomendação do nic.br para LAN do cliente devemos enviar um prefixo /56 (mas isso não é uma regra). A calcular pode ajudar muito nessa parte. No meu exemplo vou reservar um prefixo /48 para entregar prefixos /64 na WAN (65.536 prefixos/64), e um prefixo /45 entregando prefixos /56 oque daria 2.048 prefixos (clientes).

Ex 2001:db8:1000::/48 (WAN)

Ex 2001:db8:2000::/45 (LAN)

IPv6 -> Pool

Alteramos no profile. Menu PPP aba Profiles.

Remote IPv6 Prefix Pool selecione sua pool_wan e DHCPv6 PD Pool sua pool_lan


Na abra Protocol, Use IPv6 selecione yes.

Vamos ao pulo do gato na aba Scripts. A ideia aqui é toda vez que um PPPoE conectar ou desconectar ele execute um script. Vai ser necessário que você altere o TOKEN que você configurou lá no config.php, informe a URL (URLUP) correta que encontrará seu arquivo log6.php e em checkconnection informe o IP do seu servidor (explico o motivo a seguir).

A lógica é: Antes de tentar enviar as informações/valores (via post ao log6.php) fazer uma verificação se a conexão exite com o servidor de log, isso foi necessário ao simular uma “queda de energia”, as vezes ele pode autenticar antes de conseguir uma conexão (se seu o usuários estiver no routerOS e ai perdemos todos os logs) nesse caso ele fica aguardando por até 5 min na tentativa (ping ao ip checkconnection) antes prosseguir, caso exista uma conexão (checkconnection) então prossegue com o script coletando as informações.

Eu aproveitei coletar IPv4 como localAddr (NAS), remoteAddr (IPv4 entregue ao cliente) isso vai facilitar também em uma analise se você quiser bater com os dados do freeradius (radacct), já aproveitei também para capturar o callerId (MAC), serviço PPP calledId. Acredito que com essas informações podem ser uteis para outros fins. Seguindo o script todo o PPPoE que subir ele vai criar um prefixo (WAN) RemoteIPv6 e em seguida precisei fazer um while que setei 60 seg para que a cada segundo ele tente identificar em /ipv6 dhcp-server binding se o cliente solicitou o prefixo que ele vai auto se configurar em sua LAN, passando por esses requisitos ele irai gerar um LOG (que você também pode estar salvando em um servidor de log remoto) e finalizando fará um fetch com os dados do binding caso ele consiga ou enviará null para a URL e assim o servidor salva-lo no banco de dados. Você verá dois logs na tela de logs, um azul quando uma conexão subir e um vermelho quando desconectar, se você desejar não ter esses logs é só remover as linha “log warning message=….. / :log error message=…..

Acesse PPP vá até a aba profile e configure os script do profile. Não esqueça de alterar as variáveis globais.

On UP

E ao desconectar vamos enviar ao servidor que o mesmo descontou.
On Down

Para concluir em IPv6 -> ND

Marque todas as opções.

No menu IP -> DNS também informe os DNS IPv6. Só assim o cliente irá aprender um DNSv6 (Advertise DNS)

Agora todo PPPoE que autenticar um log será registrado, o legal aqui é que se alguém não utiliza Radius poderá também ter um log 🙂

No arquivo log6.php que recebe os logs sempre que um usuário conectar ele irá verificar se não existe uma conexão em aberta, pois em casos de quedas de energia não vai existir tempo para ele informar que o pppoe desconectou, então ele fecha a conexão com a hora da nova conexão, logo esse IP pode ter sido utilizado por algum outro usuário, neste caso ele registra a hora que fechou a conexão com “falha” (failure), para no caso de uma investigação você observar se o mesmo ip não teve algum outro usuário que usou na horário solicitado.

Pelo phpMyAdmin também fica muito fácil de fazer buscas.

Para quem deseja bloquear um cliente IPv6, uma solução é no Router criar outra Pool6 com uma classe “invalida” por exemplo 2001:db8:6666::/48, e no freeradius usar o attibute Mikrotik-Delegated-IPv6-Pool, pode ser na tabela radreply (dizendo para qual usuário) ou para um grupo de configurações (radgroupreply) “plano”.

Mikrotik:

Freeradius
Ex.: radreply

Ex.: radgroupreply

Desta forma o routerOS interpretará o nome da pool pelo atriburo Mikrotik-Delegated-IPv6-Pool, e assim que o cliente logar ele não pegará do bloco válido. Até poderia usar uma válido e bloquear no firewall (mas isso é coisa de sistema amador #ficadica).

Se seu freradius é antigo (v2.x) precisará ter o dictionary atualizado.

Vou deixar um exemplo de como configurar um pppoe cliente em um mikrotik, já que percebi um bug quando ele precisa renovar seu IPv6.

Gambiarazinha no profile para renovar o IP sem dor de cabeça toda vez que ele autenticar (bugs)

Gostou? Espero que você consiga implementar seu IPv6 e esteja seguro com os logs armazenado!

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Abraço!

Rudimar Remontti

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

Você pode gostar...

7 Resultados

  1. Renan disse:

    instalei Phpmyadmin e deu erro nao carrego nem /logs6 tbm nao Não é possível acessar esse site
    porem php normal acesso normalmente.

  2. Edson disse:

    Olá consigo ver pelo phpmyadmin porem pelo http://x.x.x.x/logs6/ não aparece nada!

Deixe uma resposta

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