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.485 ]

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

Criando um painel de rede em PHP

Alterando quotas via PHP (navegador)

Verificando integridade de servidores POP com PHP/sockets

Vulpes - Gerenciamento de acesso para gateways / proxies no Linux

Consultando servidores SNMP com PHP

  
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