PHP + Iptables

01/11/2007 0 Comments

Esta dica vai para quem está rodando a procura de algum How to de como implementar uma solução PHP + Iptables , aqui vai uma dica que você utilizará e ajustará para um melhor resultado.

Abaixo, atentamente siga os passos.

1 – Preparando o Terreno

1.1 -> Configurar o arquivo sudoers,
1.2 -> Preparar as regras de iptables,
1.3 -> Scripts PHP.

2 – Conclusão

1.1 – Configurar o arquivo sudoers

Antes de mais nada, gostaria de agradecer a Deus por esta simples solução e desejar a todos um ótimo estudo.

Início do ano estive “encalacrado” em uma situação que não me restou escolha, a não ser utilizar esta ferramenta (PHP) para trazer um alívio. Início do ano fomos (eu e amigos de equipe) pegos desprevenidos devido um “desastre” ocorrido com um de nossos servidores, acarretando em perdas de scripts. O servidor era gnu/linux, o mesmo, de uma hora para outra parou (hd foi para o espaço), perdemos diversos scripts, inclusive o script de firewall padrão que era escrito em Shell Script, não por mim, mas sabia como funcionava. Decidi “por a mão na massa”, pesquisei, nada encontrei mas lembrei-me que quando o php está como MÓDULO do APACHE, ele utiliza o usuário do apache, ou seja, NOBODY. Após muito stress em pesquisa, somei how tos daqui e tutorias dali, fiz uma “buchada” e decidi formar minha “obra prima”. Sem mais enrolação, vamos ao que interessa.

Objetivo: Se você deseja criar scripts de firewall, acessíveis via browser que utilizem a ferramenta do LINUX, IPTABLES, para liberar Pcs de rede, basta verificar este exemplo.

Minha necessidade: Como trabalhava com laboratórios, tinha necessidade de liberar vários laboratórios sem que fosse prejudicada a rede Corporativa, tomamos por exemplo:

REDE Corporativa
Laboratório 1
Laboratório 2 \_________________ Todos recebendo Internet do firewall (Linux)
Laboratório 3 /

Suponhamos que na rede corporativa o range de ip (faixa) seja 192.168.10.0, e a porta que eles necessitem estar aberta seja 80 (é claro que deve ser, ou você acha que o seu diretor não gosta de Orkut?)

Suponhamos que na rede laboratorial, o lab 1 (vamos chamar laboratórios de lab), tem faixa de ip diferente, por exemplo: 192.168.0.x
Suponhamos que na rede laboratorial, o lab 2 tem faixa de ip diferente, por exemplo: 192.168.1.x

Suponhamos que na rede laboratorial, o lab 3 tem faixa de ip diferente, por exemplo: 192.168.2.x

————–>>>> Arquivo Sudoers

no /etc (linux), existe um arquivozinho que faz milagres, chamado sudoers, ele faz com que usuários não privilegiados executem comandos de root (ou usuários não comuns), nele vamos inserir a entrada do usuário NOBODY (lembre que falei do módulo do apache), segue exemplo abaixo:

CODE
  1. # sudoers file.
  2. #
  3. # This file MUST be edited with the 'visudo' command as root.
  4. #
  5. # See the sudoers man page for the details on how to write a sudoers file.
  6. #
  7. # Host alias specification
  8. # User alias specification
  9. # Cmnd alias specification
  10. # Defaults specification
  11. # User privilege specification
  12. root ALL=(ALL) ALL
  13. # Uncomment to allow people in group wheel to run all commands
  14. # %wheel ALL=(ALL) ALL
  15. # Same thing without a password
  16. # %wheel ALL=(ALL) NOPASSWD: ALL
  17. # Samples
  18. # %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
  19. # %users localhost=/sbin/shutdown -h now
  20. nobody ALL=NOPASSWD:/usr/sbin/iptables

Esta última linha indica que liberamos o Iptables para o usuário nobody, sem necessidade de password de root.


1.2 – Preparar as regras de iptables

As regras que vamos utilizar são bastante simples, depois você implementará coisas gigantescas, mas agora não é hora ?:) , vamos às regras que iremos utilizar

CODE
  1. limpar firewall -> iptables -F
  2. para o lab 1 usaremos a regra –> iptables -t filter -A FORWARD -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT
  3. para o lab 2 usaremos a regra –> iptables -t filter -A FORWARD -p tcp -s 192.168.1.0/24 --dport 80
  4. -j ACCEPT
  5. para o lab 3 usaremos a regra –> iptables -t filter -A FORWARD -p tcp -s 192.168.2.0/24 --dport 80
  6. -j ACCEPT
  7. para rede corporativa usaremos -> iptables -t filter -A FORWARD -p tcp -s 192.168.10.0/24 --dport 80 -j ACCEPT

Pronto, essas são as regras de iptables que usaremos.

OBS: sabemos que regras como NAT, DNAT, MANGLE e etc são necessárias para compor todo firewall, porém não vou abranger aqui, se você quer algo robusto em firewall, sugiro que leia este Howto -> http://www.linuxguruz.com/iptables/howto/

1.3 – Scripts PHP

criei 2 arquivos, index.php e firewall.php, onde o index.php conterá os labs (para marcar) e no método POST o arquivo firewall.php vai processar a escolha.

Segue exemplo do arquivo index.php:

PHP
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <title>Firewall do Laboratório - Inspirado por Deus</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  6. <style type="text/css">
  7. <!--
  8. .style3 {font-family: Verdana, Arial, Helvetica, sans-serif; color: #006699; }
  9. .style5 {color: #00CCFF}
  10. .style7 {
  11. font-family: Verdana, Arial, Helvetica, sans-serif;
  12. color: #00CCFF;
  13. }
  14. -->
  15. </style>
  16. <script language="JavaScript" type="text/JavaScript">
  17. <!--
  18. function MM_reloadPage(init) { //reloads the window if Nav4 resized
  19. if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
  20. document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  21. else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
  22. }
  23. MM_reloadPage(true);
  24. //-->
  25. </script>
  26. </head>
  27. <body>
  28. <form action="firewall.php" method=post>
  29. <div id="Layer1" style="position:absolute; left:11px; top:14px; width:183px; height:244px; z-index:1; background-color: #006699; layer-background-color: #006699; border: 1px none #000000; visibility: visible;">
  30. <h6 align="center" class="style3 style5">:::... <u>LIBERAR INTERNET</u> ...::: </h6>
  31. <h6>
  32. <input name="limpar" type="checkbox" value="lab0">
  33. <span class="style7">Limpar Firewall
  34. <br>
  35. <input name="laboratorio1" type="checkbox" value="lab1">
  36. Liberar Laboratório 1
  37. <br>
  38. <input name="laboratorio2" type="checkbox" value="lab2">
  39. Liberar Laboratório 2
  40. <br>
  41. <input name="laboratorio3" type="checkbox" value="lab3">
  42. Liberar Laboratório 3
  43. <br>
  44. <td colspan="2" align="center"><input type="submit" class="style3" value="Ativar Escolha"></td>
  45. </span>
  46. </h6>
  47. </div>
  48. </form>
  49. </body>
  50. </html>

firewall.php:

PHP
  1. <?php
  2. //Criando Variáveis
  3. $limpar = $_POST['limpar'];
  4. $laboratorio1 = $_POST['laboratorio1'];
  5. $laboratorio2 = $_POST['laboratorio2'];
  6. $laboratorio3 = $_POST['laboratorio3'];
  7. // sempre liberamos a net para rede corporativa
  8. shell_exec(“sudo /usr/sbin/iptables -A FORWARD -p tcp -s 192.168.10.0/24 --dport 80 -j ACCEPT”);
  9. if($limpar == 'lab0')
  10. {
  11. shell_exec("sudo /usr/sbin/iptables -F");
  12. echo '<br>O Firewall foi zerado</br>';
  13. }
  14. if($laboratorio1 == 'lab1')
  15. {
  16. shell_exec("sudo /usr/sbin/iptables -A FORWARD -p tcp -s 192.168.0.0/24 --dport 80 -j ACCPET”);
  17. echo 'laboratório 1 foi liberado</ br>';
  18. }
  19. if($laboratorio2 == 'lab2')
  20. {
  21. shell_exec(“sudo /usr/sbin/iptables -A FORWARD -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT”);
  22. echo 'laboratório 2 foi liberado</ br>';
  23. }
  24. if(laboratorio3 == 'lab3')
  25. {
  26. shell_exec("sudo /usr/sbin/iptables -A FORWARD -p tcp -s 192.168.2.0/24 --dport 80 -j ACCPET”);
  27. echo 'laboratório 3 foi liberado</ br>';
  28. }
  29. ?>

Feito isso, se o seu apache estiver funcionando certinho, garanto que essas regras funcionarão. Se houver algum erro de “escrita” peço que corrijam na hora de implementar.

2 – Conclusão

Espero ter ajudado um pouco, acredito que alguém poderá passar o que passei (levei 3 dias para fazer isto fucionar, graças a DEUS).

OBS: Recomendo, para segurança, caso acesso seja externo, rodar este tutorial em modo CGI do apache e colocar estas funções em CHROOT.

_____________________________________________________________
Recomendações:

Chroot,
CGI,
mudar porta que não seja 80 ou 8080 nesta aplicação,
htaccess ativado,
SSL ativado (openssl).

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.