Criando seu próprio Captive Portal

Publicado por danillo em 25/10/2010

[ Hits: 23.547 ]

 


Criando seu próprio Captive Portal



Vamos lá...

Pra começar é necessário ter as seguintes ferramentas instaladas:
  • Ubuntu 8.10 (minha distro)
  • Apache2
  • MySQL
  • PHP5
  • Dhcp3
  • iptables

Nada de mais, todo servidor que se preze tem que ter tais ferramentas.

No Apache, dentro da "/var/www/" você pode criar qualquer pasta. Eu criei uma aut, que vai ficar "/var/www/aut/".

Dentro da pasta aut você cria um arquivo com o nome "iptablesCli.sh".

Vá no terminal e:

# chmod +x /var/www/aut/iptablesCli.sh

Dentro do arquivo você deixa esse conteúdo:

#!/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 ');

}
}
}
?>

No MySQL, através do phpmyadmin, criei um base de dados com o nome "dados" e dentro de "dados" criei uma tabela "clientes" com os campos: codigo, datacad, nome, endereco, numero, bairro, cidade, estado, rg, cpf, ip, mac, plano, datavenc, valor, bloquear, aviso, logado, login, senha, nomepc. Criei um cadastro completo.

Nesse caso quando o arquivo é executado ele primeiro cria uma 'chain' com o nome "inform" e cria uma regra bloqueando cada cliente cadastrado.

iptables -A inform -d IP_doCliente -j REJECT

Para que a rede não fique também bloqueada e a intranet deixe de funcionar acrescentei uma acl no Squid:

acl intranet dst IP_doServidor
http_access allow inrtanet

Pronto, agora é só criar um página em PHP para desbloquear o cliente com o nome index.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['nomepc']." - ".$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['nomepc']."';
document.login.EdtIP.value = '".$row['ip']."';
document.login.EdtMac.value = '".$row['mac']."';
</script>
";

}

}

}

?>

Quando o cliente acessa ela retorna o código (que é a range da chain), nome_do_pc, ip e mac.

Esses valores que são retornados eu uso em um sistema feito em Delphi, no meu caso eu não autentico na página, um programa feito em Delphi através do componente indy chama a página e autentica. Esse sistema fica como se fosse um discador, um pppoe. Esse sistema está funcionando beleza, ~as eu quero mais...

Se a comunidade puder me ajudar, e assim nos ajudarmos, o que eu estou precisando é fazer um redirecionamento quando o cliente tiver bloqueado.

Com o Squid não dá certo, pois quando uso iptables as regras que bloqueiam o cliente através do Squid deixam de funcionar.

Esse redirecionamento seria somente para indicar que o cliente precisa fazer login com o programa.

Com o programa o sistema fica mais seguro, pois o sistema feito em Delphi tem controle de mac + ip + serial do hd + nome da máquina.

E mesmo que um cara clone o mac, o serial do hd e o nome da máquina, ele tem que saber o login e a senha do então.

Na realidade dá pra fazer um sistema em Delphi pra qualquer captive, mas como aqui todo meu contro é made in danillo, eu criei o meu.

Se a galera puder me ajudar, meu email pra contato: danilloregis@hotmail.com

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Quebrando a senha do root

Drivers de impressoras pelo APT no Debian

Resolver problema de vídeo na instalação do Gentoo pelo Live CD

Guia de instalação do Arch Linux

Criando senhas seguras

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts