Script PHP/MySQL - Controle de Máquinas via MAC Address no IPtables

Nesse meu primeiro artigo, vou mostrar como criar um script funcional em PHP que possibilita a inserção de regras iptables para controle do acesso à Internet das máquinas pelo MAC address.

[ Hits: 24.989 ]

Por: Carlos Cesar Augusto Rosa em 06/11/2012 | Blog: https://www.youtube.com/carlosbrasilsp


O script PHP de comandos no servidor Debian



Para possibilitar a execução dos comandos pelo usuário "www-data", que roda o servidor Web, temos que dar permissão para o mesmo, utilizando o arquivo sudoers.

Digite visudo no terminal do Debian, e adicione a seguinte linha:

www-data ALL=PASSWD:/sbin/iptables, /usr/sbin/netstat-nat

Obs.: Se quiser utilizar outros comandos, é só adicionar nesta linha.

Segue o script com os comandos:

#Desenvolvido por Carlos Cesar
#Script PHP para controle de acesso das máquinas via MAC ADDRESS

<html>
<body>
<form>
<input type='button' value='Voltar' onclick="javascript: history.go(-1)" />
</form>

<?php

/*   Habilitar execucao do comando iptables
*   Digite o comando visudo e edite o arquivo /etc/sudoers
*   Entrar com a linha no sudoers
*   www-data ALL=NOPASSWD:/sbin/iptables, /usr/sbin/netstat-nat
*/


$link = mysql_connect("localhost","","");

if (!$link)
{
            die('Não foi possível conectar: ' . mysql_error());
}
echo 'Conexao bem sucedida<br>';
//mysql_close($link);
//print_r($_GET); //caso esteja enviando por GET ou
//print_r($_POST); //caso esteja enviando por POST


$opt = $_POST["var9"];

echo $opt;

$db_selected = mysql_select_db('mac', $link);
     if (!$db_selected) {
                die ('Can\'t use foo : ' . mysql_error());
     }

if ($opt == 1)
   {
          
           $result = mysql_query("SELECT * FROM mac WHERE nome like 'lab03%' ");
           echo "<h1>Maquinas LAB03 Bloqueadas</h1>";
            while($id=mysql_fetch_array($result, MYSQL_NUM))
               {
          printf("<table border=5><tr><td><font color=green size=5>%s</font></td></font> <td><font
color=black size=5>%s</font></td>
</tr></h2></table>",$id[1], $id[2]);
          system("sudo iptables -D FORWARD -m mac --mac-source $id[2] -j REJECT");
          system("sudo iptables -I FORWARD -m mac --mac-source $id[2] -j REJECT");
         
          }
          mysql_free_result($result);
      
     
    //system('sudo iptables -D FORWARD -m mac --mac-source 00:1e:90:de:75:83  -j REJECT');  
    //system('sudo iptables -I FORWARD -m mac --mac-source 00:1e:90:de:75:83  -j REJECT');
   }
  elseif($opt == 2)  
  {
    $result = mysql_query("SELECT * FROM mac WHERE nome like 'lab03%' ");
                 echo "<h1>Maquinas LAB03 Liberadas</h1>";
                  while($id=mysql_fetch_array($result, MYSQL_NUM))
                    {
                    printf("%s %s<br>",$id[1], $id[2]);
                    system("sudo iptables -D FORWARD -m mac --mac-source $id[2] -j REJECT");
               }
                     mysql_free_result($result);
      
    //system('sudo iptables -D FORWARD -m mac --mac-source 00:1e:90:de:75:83  -j REJECT');
  }

  elseif($opt == 7)
  {
        $result = mysql_query("SELECT * FROM mac WHERE nome like 'lab04%' ");
        echo "<h1>Maquinas LAB04 Bloqueadas</h1>";
        while($id=mysql_fetch_array($result, MYSQL_NUM))
             {    
         printf("%s %s<br>",$id[1], $id[2]);
         system("sudo iptables -D FORWARD -m mac --mac-source $id[2] -j REJECT");
              system("sudo iptables -I FORWARD -m mac --mac-source $id[2] -j REJECT");
         }
         mysql_free_result($result);
         //system('sudo iptables -D FORWARD -m mac --mac-source 00:1e:90:de:75:83  -j REJECT');
  }

  elseif($opt == 8)
  {
            $result = mysql_query("SELECT * FROM mac WHERE nome like 'lab04%' ");
            echo "<h1>Maquinas LAB04 Liberadas</h1>";
            while($id=mysql_fetch_array($result, MYSQL_NUM))
                 {
                 printf("%s %s<br>",$id[1], $id[2]);
                 system("sudo iptables -D FORWARD -m mac --mac-source $id[2] -j REJECT");
                 }
                  mysql_free_result($result);
                
  }
      
  elseif($opt == 3)
  {
      echo '<pre>';
      echo '<h3>';
      echo '<font face="arial" color="black">';
      system('sudo netstat-nat -n');
      echo '</font>';
      echo '</h3>';
      echo '<pre>';
  }
  elseif($opt == 5)
  {
          echo '<pre>';
          echo '<body bgcolor=CornflowerBlue>';
          system('sudo /home/apache/firewall');
          echo "<font color=red size=7><center><b>Firewall Restaurado</b></center></font>";
          system('sudo iptables -v -L -n');
          system('sudo -t nat iptables -v -L -n');
          system('sudo -t mangle iptables -v -L -n');
          echo '<pre>';
          echo '</body>';
  }

  elseif($opt == 6)
  {
      echo '<html><body bgcolor=CornflowerBlue>';
      echo '<pre>';    
      $ip_detectado = $_SERVER["REMOTE_ADDR"];
      echo "<h2>$ip_detectado</h2>";
      echo "<font color=green size=7><center><b>Status do Firewall</b></center></font>";
      system('sudo iptables -v -L -n');
      system('sudo iptables -t nat -v -L -n');
      system('sudo iptables -t mangle -v -L -n');
      echo '</pre>';      
      echo '</body></html>';
  }
  else
  {
      system("sudo iptables -I FORWARD -s $opt -j REJECT",$retval);
      if($retval == 2)echo "\nIP INCORRETO!";    
  }

?>

<form>
<input type='button' value='Voltar' onclick="javascript: history.go(-1)" />
</form>
</body>
</html>

Percebam que eu criei uma regra de REJECT na chain FORWARD e uma regra de REDIRECT na chain PREROUTING da tabela NAT, possibilitando a exibição de uma mensagem de bloqueio na tela das máquinas bloqueadas.

Página anterior     Próxima página

Páginas do artigo
   1. Montando o script PHP com as regras
   2. O script PHP de comandos no servidor Debian
   3. Integração com o BD MySQL para cadastro dos MACs address
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Vulpes - Gerenciamento de acesso para gateways / proxies no Linux

Monitoramento de banda em TEMPO REAL com gráfico utilizando BWBAR + PHPLOT

Criando um painel de rede em PHP

Alterando quotas via PHP (navegador)

Montando um velocímetro de internet com PHP e GD

  
Comentários
[1] Comentário enviado por adri3d em 06/11/2012 - 13:37h

solução bem interessante essa

uma sugestão é hospedar esse código no http://github.com (que é gratuito para projetos open source),
porque que fica bem fácil de compartilhar esse código,
e ir atualizando com o tempo,
e receber ajuda de terceiros

eu mesmo me ofereço a ajudar


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts