PHP + Iptables
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
- # sudoers file.
- #
- # This file MUST be edited with the 'visudo' command as root.
- #
- # See the sudoers man page for the details on how to write a sudoers file.
- #
- # Host alias specification
- # User alias specification
- # Cmnd alias specification
- # Defaults specification
- # User privilege specification
- root ALL=(ALL) ALL
- # Uncomment to allow people in group wheel to run all commands
- # %wheel ALL=(ALL) ALL
- # Same thing without a password
- # %wheel ALL=(ALL) NOPASSWD: ALL
- # Samples
- # %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
- # %users localhost=/sbin/shutdown -h now
- 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
- limpar firewall -> iptables -F
- para o lab 1 usaremos a regra –> iptables -t filter -A FORWARD -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT
- para o lab 2 usaremos a regra –> iptables -t filter -A FORWARD -p tcp -s 192.168.1.0/24 --dport 80
- -j ACCEPT
- para o lab 3 usaremos a regra –> iptables -t filter -A FORWARD -p tcp -s 192.168.2.0/24 --dport 80
- -j ACCEPT
- 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
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title>Firewall do Laboratório - Inspirado por Deus</title>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <style type="text/css">
- <!--
- .style3 {font-family: Verdana, Arial, Helvetica, sans-serif; color: #006699; }
- .style5 {color: #00CCFF}
- .style7 {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- color: #00CCFF;
- }
- -->
- </style>
- <script language="JavaScript" type="text/JavaScript">
- <!--
- function MM_reloadPage(init) { //reloads the window if Nav4 resized
- if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
- document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
- else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
- }
- MM_reloadPage(true);
- //-->
- </script>
- </head>
- <body>
- <form action="firewall.php" method=post>
- <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;">
- <h6 align="center" class="style3 style5">:::... <u>LIBERAR INTERNET</u> ...::: </h6>
- <h6>
- <input name="limpar" type="checkbox" value="lab0">
- <span class="style7">Limpar Firewall
- <br>
- <input name="laboratorio1" type="checkbox" value="lab1">
- Liberar Laboratório 1
- <br>
- <input name="laboratorio2" type="checkbox" value="lab2">
- Liberar Laboratório 2
- <br>
- <input name="laboratorio3" type="checkbox" value="lab3">
- Liberar Laboratório 3
- <br>
- <td colspan="2" align="center"><input type="submit" class="style3" value="Ativar Escolha"></td>
- </span>
- </h6>
- </div>
- </form>
- </body>
- </html>
firewall.php:
PHP
- <?php
- //Criando Variáveis
- $limpar = $_POST['limpar'];
- $laboratorio1 = $_POST['laboratorio1'];
- $laboratorio2 = $_POST['laboratorio2'];
- $laboratorio3 = $_POST['laboratorio3'];
- // sempre liberamos a net para rede corporativa
- shell_exec(“sudo /usr/sbin/iptables -A FORWARD -p tcp -s 192.168.10.0/24 --dport 80 -j ACCEPT”);
- if($limpar == 'lab0')
- {
- shell_exec("sudo /usr/sbin/iptables -F");
- echo '<br>O Firewall foi zerado</br>';
- }
- if($laboratorio1 == 'lab1')
- {
- shell_exec("sudo /usr/sbin/iptables -A FORWARD -p tcp -s 192.168.0.0/24 --dport 80 -j ACCPET”);
- echo 'laboratório 1 foi liberado</ br>';
- }
- if($laboratorio2 == 'lab2')
- {
- shell_exec(“sudo /usr/sbin/iptables -A FORWARD -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT”);
- echo 'laboratório 2 foi liberado</ br>';
- }
- if(laboratorio3 == 'lab3')
- {
- shell_exec("sudo /usr/sbin/iptables -A FORWARD -p tcp -s 192.168.2.0/24 --dport 80 -j ACCPET”);
- echo 'laboratório 3 foi liberado</ br>';
- }
- ?>
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).