5.2 KiB
5.2 KiB
Login Automático no Portal Captivo UniFi (UNICEP)
Daemon e utilitário CLI ultra-leve em C puro (consumindo apenas ~312 KB de RAM e zero subprocessos) para autenticação automática no portal captivo UniFi da faculdade (UNICEP). Também inclui uma versão de referência em Python.
⚡ Destaques da Implementação em C (login_portal.c)
- Consumo Mínimo de Recursos: Usa cerca de 312 KB de RAM (97% menos memória que a versão em Python) em um único processo de 27 KB.
- Netlink Socket Nativo (
AF_NETLINK): Em vez de manter processos pesados comonmcli monitorabertos, escuta eventos de interface e atribuição de IP (RTMGRP_LINK | RTMGRP_IPV4_IFADDR) diretamente do Kernel Linux viapoll()com 0% de uso de CPU. - Leitura de SSID via Kernel (
ioctl): Consulta o nome da rede Wi-Fi conectada diretamente viaSIOCGIWESSID(<linux/wireless.h>), sem invocar processos externos. - Sockets POSIX com
SO_BINDTODEVICE: Todas as conexões HTTP são vinculadas diretamente à placa Wi-Fi (wlan0), contornando túneis de VPN/WireGuard que poderiam bloquear a rota antes da autenticação no portal. - Zero Dependências Externas: Compila apenas com
gcce alibcpadrão do Linux.
🔍 Como o Login Funciona
Ao analisar o fluxo de rede do portal captivo em roteadores Ubiquiti UniFi:
-
Detecção e Interceptação:
- Ao se conectar ao Wi-Fi (ex:
A5_Alunos_Livre), qualquer tentativa de acessar a internet em HTTP (comohttp://connectivitycheck.gstatic.com/generate_204) é interceptada pelo AP UniFi. - O AP responde com um redirecionamento HTTP 302 para o daemon de redirecionamento interno na porta
8882:http://10.0.1.2:8882/redirect?ec=<token_criptografado> - O daemon na porta 8882 decodifica a sessão e redireciona (HTTP 302) para a interface web na porta
8880:
(Ondehttp://10.0.1.2:8880/guest/s/default/?ap=6c:63:f8:9d:76:12&ec=<token>apé o endereço MAC do ponto de acesso eecé o token criptografado da sessão).
- Ao se conectar ao Wi-Fi (ex:
-
Configuração do Portal (
auth: none):- O endpoint
GET /guest/s/default/hotspotconfigindica que a rede utiliza autenticação "click-through" (auth: none): não exige usuário, senha nem vouchers.
- O endpoint
-
A Requisição de Login:
- Quando o botão de login é pressionado, o portal dispara:
POST http://10.0.1.2:8880/guest/s/default/login HTTP/1.1 Referer: http://10.0.1.2:8880/guest/s/default/?ap=<ap_mac>&ec=<token> Content-Length: 0 - O controlador UniFi recebe a requisição, valida o cliente e o AP via cabeçalho
Referer, libera o endereço MAC nas tabelas de firewall do AP e responde com redirecionamento HTTP 302. A internet passa a fluir imediatamente.
- Quando o botão de login é pressionado, o portal dispara:
📁 Estrutura do Projeto
login_portal.c: Implementação principal em C puro (CLI + Daemon Netlink).Makefile: Script de compilação (make,make clean,make install).install.sh: Compila o binário em C e instala/ativa o serviçosystemd --user.uninstall.sh: Desativa e remove o serviço.unifi-portal.service: Arquivo de unidadesystemd --user.99-captive-portal.sh: Script alternativo para NetworkManager Dispatcher (nível de sistema).login_portal.py: Versão alternativa/referência escrita em Python.
🚀 Instalação Rápida
Clone o repositório e execute o instalador (necessita apenas do gcc instalado):
git clone https://github.com/muriloscolari/LoginAutomaticoUnicep.git
cd LoginAutomaticoUnicep
./install.sh
O instalador irá:
- Compilar
login_portal.cgerando o binário otimizadologin_portal. - Configurar e ativar o serviço
systemd --user(unifi-portal.service).
Gerenciando o Serviço
# Ver status e consumo de memória do serviço
systemctl --user status unifi-portal.service
# Acompanhar logs em tempo real
journalctl --user -u unifi-portal.service -f
# Reiniciar ou parar o serviço
systemctl --user restart unifi-portal.service
systemctl --user stop unifi-portal.service
🛠️ Uso Manual (Terminal)
Você pode executar o binário compilado diretamente a qualquer momento:
# Compilar manualmente (se ainda não compilou)
make
# Checa se a internet precisa de liberação e efetua login se necessário
./login_portal
# Força o envio do POST mesmo se a internet já parecer ativa
./login_portal --force
# Especificar interface manualmente
./login_portal -i wlan0
💡 Como a Detecção em 3 Camadas Funciona
- Teste de Conectividade (
generate_204):- No Wi-Fi de casa, o servidor responde
HTTP 204 No Content. O programa encerra em poucos milissegundos sem fazer nada. - Na faculdade (bloqueado), o AP intercepta a conexão e retorna
HTTP 302.
- No Wi-Fi de casa, o servidor responde
- Identificação da Assinatura UniFi:
- Na mesma verificação, segue os cabeçalhos
Location:para confirmar se o destino é o portal UniFi (portas8880/8882e rota/guest/s/).
- Na mesma verificação, segue os cabeçalhos
- Filtro de SSID via
ioctl:- Se a internet cair em uma rede residencial (ex: problema na operadora), o programa lê o SSID via kernel e reconhece que não é a rede da faculdade nem há portal UniFi, ignorando silenciosamente.
📄 Licença
MIT License. Sinta-se livre para usar, modificar e compartilhar.