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).
Meu amigo, seu tutorial tem 16 anos, mas me ajudou muito por aqui, pois estava tentando fazer algo parecido com o que você fez. Muito obrigada por compartilhar! Abração!
De nada <3