removido
(usa Nenhuma)
Enviado em 09/09/2010 - 15:00h
Galera resolvi aqui!
Usei multiplas ferramentas para tal, como:
Postgres(autenticação, inclusão e exclusão dos comandos)
PHP5 (para manipular string no banco)
Apache2(claro, preciso de um servidor Web para manter vivo o portal hehehe)
Agora funciona assim
Criei tabelas no database para autenticação(simples comparação entre valor da variavel e valor do campo 'senha')
Inseri o comando iptables -t nat -A PREROUTING -s rede_local_clientes/24 -p tcp --dport 80 -j DNAT --to ip_servidor:80 e outro, iptables -A FORWARD -s rede_local_clientes/24 -j DROP no banco no campo PREROUTING e FORWARD_DROP, respectivamente, no php se houver sucesso na autenticação, altera alguns outros campos da tabelas com o valores que descrevo a seguir:
campo POSTROUTING
iptables -t nat -I POSTROUTING -s ip_do_cliente -j MASQUERADE --> para liberar o nat ao ip_do_cliente
campo FORWARD
iptables -I FORWARD -s ip_do_cliente -j ACCEPT --> para liberar o repasse antes que a politica que tornei padrão para a rede_local_clientes 'DROPasse' os pacotes.
campo ALLOW_PREROUTING
iptables -t nat -I PREROUTING -s ip_do_cliente -j ACCEPT --> para permitir roteamento de pacotes vindo do ip_do_cliente para não ser redirecionado pela regra PREROUTING da rede toda como falei acima.
Essas regras sempre usando o -I para adicionar ao início, sempre antes das demais regras.
Uma vez isso inserido no banco, uma ferramenta num script faz um select e exporta esses valores para um arquivo exatamente nessa mesma ordem acima, ou seja sempre le os campos na ordem POSTROUTING > FORWWARD > ALLOW_PREROUTING> e por ultimo o campo PREROUTING > FORWARD_DROP.
Essa ferramente se chama psql, que me salvou nessa jornada de tentativas, ele fica dentro de
/usr/bin/psql e faz toda a magia acontecer
os comando ficaram assim:
/usr/bin/psql -h 127.0.0.1 -U postgres -d database -t -c "select POSTROUTING from nat_hosp.liberacao where POSTROUTING is not null" > /var/www/portal/firewall.sh
/usr/bin/psql -h 127.0.0.1 -U postgres -d database -t -c "select FORWARD from nat_hosp.liberacao where FORWARD is not null" >> /var/www/portal/firewall.sh
E assim até o fim dos campos primordiais para o funcionamento correto
e dentro do mesmo script setei para sempre tornar o arquivo firewall.sh como executal e depois executa-lo, assim ficou o script(resumido é claro), ele é executado a cada 1 min.
#################################
/usr/bin/psql -h 127.0.0.1 -U postgres -d database -t -c "select POSTROUTING from nat_hosp.liberacao where POSTROUTING is not null" > /var/www/portal/firewall.sh
/usr/bin/psql -h 127.0.0.1 -U postgres -d database -t -c "select FORWARD from nat_hosp.liberacao where FORWARD is not null" >> /var/www/portal/firewall.sh
chmod +x /var/www/portal/firewall.sh
/var/www/portal/./firewall.sh
#################################
ainda existe um script que zera a tabela de liberação com os ips liberados sempre a meia noite, assim ele sempre tem que se autenticar uma vez por dia todo dia ou, se seu ip mudar, tem que se autenticar novamente, mas essa condição é rara pois configurei o dhcp para apenas mudar o ip a cada 7 dias.
Ou seja exporta>executa... exporta>executa... exporta>executa... a cada minuto do dia e zera ao final do dia, numa incansável tarefa do crontab -e
alterei o arquivo /etc/apache2/sites-enabled/default
este arquivo se refere ao diretorio padrão do apache2
em documentroot
alterei, inves de /var/www
ficou assim
/var/www/portal
Entre outras coisitas que posso falar depois.....
....
Então agora, quando nossos clientes entram em nossa rede, quando tentam navegar são direcionados para a pág que está em "/var/www/portal/index.php" e são obrigados a autenticar-se, se sucesso, o php colhe o ip do cliente executa os insert com os comando citados acima e assim que o script ler>exportar>executar o cliente estará liberado para navegação.
Daí, alguem vai me questionar;
-Mas se ele só roda o script a cada minuto, não é instantanea a liberação...
respota,
-Não, realmente não é instantanea a liberação mas é muito azar se ele executar isso no segundo 00m:01s do minuto corrente do cron pois ele vai ter que esperar um looongo período de 1 minuto para se ver livre do meu portal, então veja que se ele fizer isso no segundo 00m:45s só o tempo dele ler as informações sobre o acesso(aparece na pág de sucesso na autenticação), ja leva esse tempo e quando ele reiniciar o navegador.... funfa... a magia acontece e ele está navegando.
Não conheço muito da área(Linux) ainda, fui lendo, lendo, lendo até que deu certo, mas acho que isso daria um bom artigo pra quem deseja fazer um captive portal customizado, caso tenham interesse, me mandem um e-mail que tiro umas horas do meu fds e post aqui detalhe por detalhe de como fazer e espero receber também idéias para melhorar isso aí!
Agradecimentos a todos que ajudaram e em especial o korvoman que me deu uma boa luz sobre a chain POSTROUTING. Hail Hail Linux!