+ Responder ao Tópico



  1. #1

    Padrão Construir sistema de captive portal (hotspot)

    Senhores;

    Poderiam por favor me informar as etapas para construir um captive portal, de preferencia em php.

    Sei que tem que ter um redirecionamento de quem ainda nao autenticou para uma pagina que pode ser feito com o iptables, depois autentica num bd e se autenticar, cria regras no iptables para liberar.

    Só não tenho idéia de como ver o session timeout do usuário, ou seja, como saber se o usuário ficou x minutos sem fazer nada no navegador para desconectá-lo (apagar as regras do firewall que liberam o seu acesso).

    Não quero um codigo pronto, mas se os amigos puderem me orientar e quais ferramentas usar agradeço muito.

    Ps.: Caso alguém precise depois o código estará disponível para todos.

    Att;
    Marcos A Ferreira

  2. #2

    Padrão Re: Construir sistema de captive portal (hotspot)

    Session timeout? Por que não utiliza uma página que realiza o heartbeat junto ao servidor em um intervalo de tempo pré-determinado? Outra, por que não utiliza uma ferramenta já consolidada, como o WifiDog?



  3. #3

    Padrão Re: Construir sistema de captive portal (hotspot)

    Marcosaferreira,
    Eu também estou construindo, não um captive portal, mas um sistema usando squid, php, apache, mysql, e delphi, em vez de capturar a primeira pagina do cliente e redirecionar para uma página de autenticação, criei uma pagina em php que bloqueia e libera os clientes com regras em iptables, um programa em delphi usando os compoente Indy acessa a pagina em php e autentica o cliente, o bom do programa é a segurança, o programa fica como se fosse um discador, a segurança é bem maior, pois o programa só roda no pc que estiver com as configurações cadastradas como: serial do HD, Mac da placa, IP, e nome do pc.

    O meu problema seja o seu também a questão do session timeout.

    Vou deixar meu email: [email protected] se quiser trocar alguma ideia.

    A minha ideia em fazer é o seguinte toda vez que o cliente conectar um shell dispara pingando o cliente, se o cliente desconectar e ficar um tempo sem pingar ele bloqueia o cliente novamente. eu não sei mas ainda vou dá uma pesquisa para ver a melhor forma possivel. ou criar um sistema em lazarus (linux) para se comunicar com o sistema feito em delphi.(windows)

  4. #4

    Padrão Re: Construir sistema de captive portal (hotspot)

    Boa danillorc Gostei de sua ideia eu vinha pensando a muito tempo em como fazer ago neste sentidotambem desenvolvo um captive protal mais o meu problema e a questão session timeout, se alguma alma caridosa ai puder ajudar agente fala ai



  5. #5

    Padrão Re: Construir sistema de captive portal (hotspot)

    Estaria interessa sim mais minha especialidade e php conheço o lazarus mais não sou bom com ele.
    Eu tenho um captive portal iniciado ja feito em php que no atual momento conta com:
    - Cadastro de Cliente
    - Cadastro de Login
    - Cadastro de Banda
    - Controle de Banda
    - Proxy (Opção de usar ou não usar definida pelo admin)
    - Hotspot (Falta sistema de time out)

    Falta implementar

    - Acesso Agendado
    - Controle de Volume (Tarifação por megas Trafegado)
    - Autenticação Radius
    - ppoe
    - Painel de comtrole

    Ainda falta desenvolver a parte financeira


    Atualmente esto tentando implantar um monitor de trafego usando o proprio iptable com o comando iptables -nvxL .


    Bemo que eu to podendo oferecer e isso no momento

    meu msn e [email protected]

  6. #6
    Não Registrado(s)
    Visitante

    Padrão Re: Construir sistema de captive portal (hotspot)

    JorgeAldo,

    Blz, eu deixei meu msn, me add e aí trocamos uma idéia.

    Na realidade eu fiz todo um sistema, há uns 3 anos atrás eu criei um sistema no linux feito em Lazarus, com base de dados firebird, que fazia um controle de cliente e financeiro, amarrava o mac ao ip, controlava os downloads por tipo de arquivo, bloqueio de determinados sites e etc.. no squid, cadastrava a banda pra cada cliente ou todos os clientes de uma só vez com CBQ Shaper, cadastrava o cliente no DHCP3 pelo mac, tirava um extrato de cada cliente através do sarg, fazia monitoramento do cliente com tail e grep, mostrava quais os clientes conectados, pingava uma determinada faixa de ips. e etc, mas aí eu tinha que acessar o servidor toda vez q iria cadastrar um cliente, depois eu criei o mesmo sistema no delphi, pegando a base de dados em rede, mas fiquei com dificuldade em fazer os dois sistemas se comunicarem, pq eu queria fazer isso atraves de socketes, mas não encontrei nenhum componente pro lazarus, fazia uma comunicação entre os dois a base de ganbiarra, mas num gostei não.
    Depois eu fiz a mesma coisa com Apache, html, php, mysql, só q eu não gostei por causa de keyloogers na casa dos clientes quando eu ia dar manuntenção, aqui tem uns cara esperto. Foi aí que eu fiz outro sistema com delphi e php, e através do delphi com o componente indy, acesso as paginas em php, e faço o cadastro cadastro.

    Mais ou menos assim:

    Código pascal:
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
    Valores,Retorno : TStringList;
    begin
     
       Valores := TStringList.Create;
       Retorno := TStringList.Create;
       Valores.Clear;
       Valores.Add('EditNome=' + edtNome.text);
       Valores.Add('EditSenha=' + edtSenha.text);
       try
         Retorno.Text := Idhttp1.Post('http://servidor/autenticacao/aut.php', Valores);
       finally
         Valores.Free;
         Retorno.Free;
       end;
     
    end;
    Dessa forma não preciso acessar a web para digitar senhas ou cadastrar os clientes.

    Dá pra fazer em qualquer pagina de cadastro, hotspot e etc.

    É bom pela segurança, por exemplo: pegando o Hotspot do Mikrotik, em vez de capiturar a pagina de login, basta redirecionar com outra pagina informando que está bloqueado para acesso até q seja efetuado o login, login q será feito através do programa em delphi.
    Última edição por osmano807; 15-10-2010 às 16:37.



  7. #7

    Padrão Re: Construir sistema de captive portal (hotspot)

    JorgeAldo,

    Blz, eu deixei meu msn, me add e aí trocamos uma idéia.

    Na realidade eu fiz todo um sistema, há uns 3 anos atrás eu criei um sistema no linux feito em Lazarus, com base de dados firebird, que fazia um controle de cliente e financeiro, amarrava o mac ao ip, controlava os downloads por tipo de arquivo, bloqueio de determinados sites e etc.. no squid, cadastrava a banda pra cada cliente ou todos os clientes de uma só vez com CBQ Shaper usando CBQ+Cache Full (Squid) com marcação de pacote, cadastrava o cliente no DHCP3 pelo mac, tirava um extrato de cada cliente através do sarg, fazia monitoramento do cliente com tail e grep, mostrava quais os clientes conectados, fazia o monitoramento de consumo por pacote ou por Kb/Mb/Gb, pingava uma determinada faixa de ips, o sistema fazia isso e umas coisas a mais, mas aí eu tinha que acessar o servidor toda vez q iria cadastrar um cliente ou monitorar um. Depois eu criei o mesmo sistema no delphi, pegando a base de dados em rede, mas fiquei com dificuldade em fazer os dois sistemas se comunicarem, pq eu queria fazer isso atraves de socketes, mas não encontrei nenhum componente pro lazarus, fazia uma comunicação entre os dois a base de ganbiarra, mas num gostei não.
    Depois eu fiz a mesma coisa com Apache, html, php, mysql, só q eu não gostei por causa de keyloogers na casa dos clientes quando eu ia dar manuntenção, aqui tem uns cara esperto. Foi aí que eu fiz outro sistema com delphi e php, e através do delphi com o componente indy, acesso as paginas em php, e faço o cadastro cadastro.

    Mais ou menos assim:

    Código pascal:
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
    Valores,Retorno : TStringList;
    begin
     
       Valores := TStringList.Create;
       Retorno := TStringList.Create;
       Valores.Clear;
       Valores.Add('EditNome=' + edtNome.text);
       Valores.Add('EditSenha=' + edtSenha.text);
       try
         Retorno.Text := Idhttp1.Post('http://servidor/autenticacao/aut.php', Valores);
       finally
         Valores.Free;
         Retorno.Free;
       end;
     
    end;


    Antes eu rodava um shell em php pra bloquear todos os clientes:

    Código php:
    #!/usr/bin/php -q
    <?
    {
    $iptables0 = shell_exec("iptables -F inform");
    $iptables1 = shell_exec("iptables -N inform");
    $iptables2 = shell_exec("iptables -A INPUT -j inform");
    $iptables3 = shell_exec("iptables -A FORWARD -j inform");
     
    $link = mysqli_connect("localhost", "root", "123456") or die ("Não foi possível conectar1");
    mysqli_select_db($link,"dados") or die("Não foi possível selecionar o banco de dados2");
     
    $select = "SELECT * FROM clientes order by codigo";
    if ($select != "") {
    $Query = mysqli_query($link, $select) or die (mysql_error($link));
     
    $i = 0;
    while ($row = mysqli_fetch_array($Query)) {
    $i++;
    echo $i.' - '.$row['nome']."\n";
    $iptables2 = shell_exec('iptables -A inform -d '.$row['ip'].' -j REJECT ');
    echo "$iptables2"."<br>";
    }
    }
    }
    ?>

    Coloca em ordem de codigo todos os cliente de uma tabela "cliente" q tem os campos "nome","ip","mac" etc...
    Criei a 'chain' inform

    quando esse programa é rodado todos os cliente são bloqueados.

    para autenticar um cliente eu crei um aut.php

    Código php:
    <?
    if($_POST)
    {
     
    $login = $_POST['EditNome'];
    $senha = $_POST['EditSenha'];
     
    $link = mysqli_connect("localhost", "root", "123456") or die ("Não foi possível conectar1");
    mysqli_select_db($link,"dados") or die("Não foi possível selecionar o banco de dados2");
     
    $select = "SELECT * FROM clientes WHERE login='$login' AND senha='$senha' order by codigo";
    if ($select != "") {
    $Query = mysqli_query($link, $select) or die (mysql_error($link));
     
    $i = 0;
    while ($row = mysqli_fetch_array($Query)) {
    $i++;
     
    $iptables2 = shell_exec("sudo iptables -R inform ".$row['codigo']." -d ".$row['ip']." -j ACCEPT");
    echo "$iptables2";
     
    echo "sudo iptables -R inform ".$row['codigo']." -d ".$row['ip']." -j ACCEPT";
    $Cliente = fopen("/var/www/portal/log.log","a");
    fwrite($Cliente,$row['codigo']." - ".$row['nome']." - ".$row['ip']." - ".$row['mac']."\n");
    fclose($Cliente);
    echo"
    <form class='style1' action='index.php' name='login' method='post' style='width:300px; height:400px; z-index:4'><br>
    <input style='width:100px; height:20px;' class='style1' type='text' name='EdtCod' id='EdtCod'>
    <input style='width:100px; height:20px;' class='style1' type='text' name='Edtnome' id='Edtnome'>
    <input style='width:100px; height:20px;' class='style1' type='text' name='EdtIP' id='EdtIP'>
    <input style='width:100px; height:20px;' class='style1' type='text' name='EdtMac' id='EdtMac'>
    <script type='text/javascript'>
    document.login.EdtCod.value = '".$row['codigo']."';
    document.login.Edtnome.value = '".$row['nome']."';
    document.login.EdtIP.value = '".$row['ip']."';
    document.login.EdtMac.value = '".$row['mac']."';
    </script>
    ";
     
    }
     
    }
     
    }
     
    ?>

    Dessa forma não preciso acessar a web para digitar senhas ou cadastrar os clientes.

    Dá pra fazer em qualquer pagina de cadastro, hotspot e etc.

    A pagina autentica pois pega a range da chain
    com -R eu substituo uma regra de acordom com a posição em uma chain pelo codigo do cliente q foi colocado em ordem.
    o problema é q o cliente tem q ter o codigo em ordem sem 1,2,3,4,5,6,....

    para que o cliente não seja bloqueado pelo comando do iptables: "iptables -A inform -d IP -j REJECT"

    eu coloquei uma acl no squid q dá permissão para acessar a intranet ou o ip 192.168.1.1

    "acl intranet dst 192.168.1.1"
    "http_access allow inrtanet"

    mas ficou beleza.

    O programa é configurado para rodar com Serial do HD, Mac, IP e nome da maquina, nome do cliente etc...

    fica mais dificil, pro cara hackear, pois os cara tem que clonar Mac, IP, Serial do HD, Nome da maquina e ainda ter a senha e o login do cliente.

    O programa fica sendo como um discador. quando o programa é encerrado ele bloquea novamente o cliente.

    É bom pela segurança, por exemplo: pegando o Hotspot do Mikrotik, em vez de capiturar a pagina de login, basta redirecionar com outra pagina informando que está bloqueado para acesso até q seja efetuado o login, login q será feito através do programa em delphi.

    Gostei da questão do socket TCP/IP do pascal com php, será se dá pra fazer com do pascal com delphi.

    Eu também tenho umas ferramentas feito em fpc q faz alguns controles como adm, uso também como uma especie de cgi entre php e fpc.

    blz.

    me add pra gente trocar umas ideias.
    Última edição por danillorc; 15-10-2010 às 17:49.

  8. #8

    Padrão Re: Construir sistema de captive portal (hotspot)

    Po tem uma cacetada disso por ai mas a base é quase sempre esse aqui
    Using iptables and PHP to create a captive portal - Andywiki



  9. #9

    Padrão Re: Construir sistema de captive portal (hotspot)

    e aí JorgeAldo tem como fazer um socket entre o (pascal e pascal) ou (pascal e lazaros) ou (pascal e delphi.) ou (lazaros e delphi de preferencia)?
    A um tempo atras eu fiz um programa pra controle de lan house utilizando somente com socket's no Delphi.
    Também tenho interesse de fazer para o linux. Além de melhorar meu controle do meu servidor Vs Cliente.

    Cadê vamo ou não vamo criar um sistema.

  10. #10

    Padrão Re: Construir sistema de captive portal (hotspot)

    Eu eu fiz outro com LAMP + Iptables + Delphi ou Lazarus ou Java ou VB, além de usuário e senha em Criptografia md5, amarro: mac + ip + serial do hd + id da placa mãe que é grande pra caramba + Tipo de processador + sistema operacional + chave do produto + nome do computador + nome do usuário e ainda expalho uma porrada de dll na pasta windows e system32 e algumas configurações no regedit e tudo criptografado e ainda informa ao cliente se estiver tendo excesso de upload informando qual o programa que está fazendo a requisição, podendo ser um virus o que é muito bom, pois já tive bastante problemas com esse tipo de virus deixando a rede pesada. O melhor o que fica quase impossivil de haver clonagem e hacker, o programa funciona como um discador paracido com o da oi pppoe, redireciona para a pagina pricipal do servidor, tem contator de tempo de acesso, e muitas outras informações, para o cliente... como extrato de acesso com ou sem graficos, com horáios e sites acessados, caso o cliente queira, ou pode navegar com privacidade, tem impressão de bloqueto bancário e extratos dos pagamentos efetuados, bloquetos online no proprio programa, para os bancos: Banco do Brasil, Caixa Economica e Bradesco, indica quando o boleto pago já tiver sido processado pelo provedor indicando ao cliente que ele está em dias, ou informando que o cliente está inadimplente. com x dias de atraso conforme a configuração do provedor ele bloqueia o cliente fica informando que com tantos dias irá ser bloqueado por inadiplencia, lhe informado o mês em atraso, essa configuração também pode ficar a critério do provedor. Tem também um medidor de sinal (velocimento) para medir a velocidade do seu sinal que vai de 30k a 1000mb. É um sistema bem simples e maneiro o tamanho dele é 900k, e tenho ele nas seguintes linguagens:
    (LAMP + Delphi) ou (LAMP + Lazarus) ou (LAMP + Java) ou (LAMP + VB).
    não precisa instalar, quem tiver interesse posso enviar o parte do codigo font ou o demo. ou VC pode entrar em contato: www.informtreinamento.com.br.

    Quem tiver interessado também faço sistemas gerenciador para provedor, com boletos bancários, com retorno altomatico, validação de cliente, controle financeiro, gereciador de hardware. e etc.
    Última edição por danillorc; 12-07-2011 às 22:39.



  11. #11

    Padrão Re: Construir sistema de captive portal (hotspot)

    Ei JorgeAldo valeu pela dicaconsegui fazer o socket entre lazarus para Delphi e ao contrario, ficou beleza. fiz das duas formas e mais outras, tô apanhado agora é usar mysql em free pascal, em shell dá pra fazer mas fico limitado, queria mesmo era em pascal, acho q não to fazendo da forma correta, To querendo fazer um sistema de vendas pra rodar em terminais burros com mysql e acessar uma base externa para importação de dados com valição. já acompanhei alguns tutoriais mas não consegui inportar nem exportar as informações. já fucei no google mas nada. tem como vc me dar uma luz.