#  > Desenvolvimento >  > Linguagens de Programação >  >  Ajuda em um Codigo PHP, Via Comando

## ribeirokaka2

olá. to tentando criar um arquivo php para agir junto com meu firewall.. so que nao sei como criar essa regra. 
são dois arquivos php!

index.php

<html>
<head>
<title>..::Firewall com php::..</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:1033px; height:644px; z-index:1; background-color: #006699; layer-background-color: #0$
<h6 align="center" class="style3 style5">:::... <u>FIREWALL CADEIA FILTER</u> ...::: </h6>
<h6>

<br>

<br></br>
<br>


<H3> DIGITE A CADEIA</H3>
<input type="text" size=10 name="Cadeia" value='cad'>

<br>
<h3>ESCOLHA O PROTOCOLO</H3>
<select name="Protocolo" value="prot">
<option>FTP
<option>UDP
</select>

<br>

<H3> DIGITE O IP</H3>
<input type="text" size=10 name="IP" Value="ip">
<br>
<br>

minha duvida é como ligar esse firewall.php para reconhecer o index.php e executar esse comando de acordo com oque eu digitar na index.
<H3> DIGITE A CADEIA</H3>
<input type="text" size=10 name="Cadeia" value='cad'>

<br>
<h3>ESCOLHA O PROTOCOLO</H3>
<select name="Protocolo" value="prot">
<option>FTP
<option>UDP
</select>

<br>

<H3> DIGITE O IP</H3>
<input type="text" size=10 name="IP" Value="ip">
<br>
<br></br>
<H3> DIGITE A PORTA</H3>
<input type="text" size=10 name="Porta" value="port">
<br></br>

<select name="Permissao" value="permiss">
<option>ACCEPT
<option>REJECT
<option>DROP

</select>
<br>
<td colspan="2" align="center"><input type="submit" class="style3" value="Ativar Escolha"></td>
</span>

</h6>
</div>
</form>
</body>
</html>


firewall.php
IRA EXECUTAR O SEGUINTE COMANDO


<?php


//Criando Variáveis


$Cadeia = $_POST['cadeia'];
$Protocolo = $_POST['protocolo'];
$IP = $_POST['ip'];
$Porta = $_POST['port'];
$Permissao = $_POST['permiss']

{
shell_exec("/usr/bin/sudo /sbin/iptables -A $Cadeia -p $Protocolo -s $IP --dport $Porta -j $Permissao);
echo 'Comando inserido com sucesso</br>';
}
?>

----------


## ribeirokaka2

Como faço para fazer isso.

sempre da ess erro

arse error: syntax error, unexpected $end in /var/www/firewall.php on line 18

----------


## ribeirokaka2

Como faço para fazer isso.

sempre da ess erro

arse error: syntax error, unexpected $end in /var/www/firewall.php on line 18

ja usei isso tbm para que no usuario comum nao use senha


# visudo 

E insira as seguintes linhas: 

www-data ALL=NOPASSWD: /sbin/iptables
www-data ALL=NOPASSWD: /sbin/iptables-save
www-data ALL=NOPASSWD: /sbin/iptables-restore

----------


## alexandrecorrea

ta errado seu codigo:



```
<?php
 
 
//Criando Variáveis
 
 
$Cadeia = $_POST['cadeia'];
$Protocolo = $_POST['protocolo'];
$IP = $_POST['ip'];
$Porta = $_POST['port'];
$Permissao = $_POST['permiss'];
if (shell_exec("/usr/bin/sudo /sbin/iptables -A $Cadeia -p $Protocolo -s $IP --dport $Porta -j $Permissao)) {
      echo 'Comando inserido com sucesso</br>';
 }
?>
```

----------


## ribeirokaka2

toda vez que vou estartar o apache no ubuntu da esse erro:


[email protected]:/var/www# /etc/init.d/apache2 start
* Starting web server apache2 apache2: Syntax error on line 189 of /etc/apache2/apache2.conf: Syntax error on line 2 of /etc/apache2/httpd.conf: Cannot load /etc/apache2/modules/mod_auth.so into server: /etc/apache2/modules/mod_auth.so: cannot open shared object file: No such file or directory

----------


## poolborges

Bem o seguinte o voce tem activado o modulo authentication. 
Queres utilizar a autenticação atravez de ficheiro de texto ?:

Senão
Comenta a linha # (#LoadModule auth_basic_module modules/mod_auth.so) que resolve o problema

Isso acontence pq o sistema não tem esse modulo instalado e voce esta a mandar o apache carrega-lo, logo aparece esse erro ao iniciar o apache, 

caso que utilizar este tipo de autenticação, põe aqui algumas insformações da sua instalação do apache que ajufo a habilitar esta fncionalidade, caso não saiba como.

-------- use esse comandos na consola
Verifica qual a versão do apache 
$ httpd -v

Lista os modulos instalados/compilados junto com apache: 
$ httpd -l 

Pelo nome do modulo posso dizer que esta utilizando a versão 1.3, ou 2.0 do apache, pois o nome desse modulo foi mudado na versão 2.2

----------


## ribeirokaka2

[email protected]:~# httpd -v
bash: httpd: comando não encontrado
[email protected]:~# httpd -l

----------


## ribeirokaka2

tbm mudei meu arquivo firewall.php


<?php


//Criando Variáveis

$Filter = $_POST['filt'];
$Cadeia = $_POST['cadeia'];
$Protocolo = $_POST['protocolo'];
$IP = $_POST['ip'];
$Porta = $_POST['port'];
$Permissao = $_POST['permiss'];
if(($Filter)AND($cadeia)AND($Protocolo)AND($IP)AND($Porta)AND($Permissao))
{
shell_exec("sudo /usr/sbin/iptables -t $Filter -A $Cadeia -p $Protocolo -s $IP --dport $Porta -j $$
}else{
echo 'Comando inserido com sucesso</br>';
}

?>

----------


## ribeirokaka2

e acrecenetei isso no index.php


<H3> DIGITE A filter</H3>
<input type="text" size=10 name="Filter" value='filt'>

----------


## ribeirokaka2

o que e esse erro

Parse error: syntax error, unexpected $end in /var/www/firewall.php on line 18

----------


## poolborges

qual a distribuição Linux? (ubuntu, fedora, ...) para resolver o erro do carregamento do modulo??

Ja posto aqui um codigo corrigido do firewall.php e index.php

----------


## poolborges

------------ 

```
CODIGO index.php
```



```
<html>
    <head>
        <title>..::Firewall com php::..</title>
    <body>

        <form action="firewall.php" method=post>
            <table border="1">
                <thead>
                    <tr>
                        <th colspan="2"> EXECUÇÃO DE FIREWALL IPTABLES</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>TABELA</td>
                        <td>
                            <select id="tabela" name="tabela">
                                <option value="nat" selected="selected">nat</option>
                                <option value="mangle">mangle</option>
                                <option value="filter">filter</option>
                            </select>
                        </td>
                    </tr>
                    <tr>
                        <td>CADEIA(Chain)</td>
                        <td>
                            <input type="text" size="50" name="cadeia" value="">
                        </td>
                    </tr>
                    <tr>
                        <td>PROTOCOLO</td>
                        <td>
                            <select id="protocolo" name="protocolo">
                                <option value="tcp" selected="tcp" >TCP</option>
                                <option  value="udp">UDP</option>
                                <option  value="icmp">ICMP</option>
                                <option  value="all">TODOS</option>
                            </select>
                        </td>
                    </tr>
                    <tr>
                        <td>IP</td>
                        <td><input type="text" size="11" maxlength="11" name="ip" id="ip" Value=""></td>
                    </tr>
                    <tr>
                        <td>PORTA(max:65535)</td>
                        <td><input type="text" size="11" maxlength="5" name="porta" value=""></td>
                    </tr>
                    <tr>
                        <td>Permissões(Target)</td>
                        <td>
                            <select id="alvo" name="alvo">
                                <option value="ACCEPT" selected="selected">ACCEPT</option>
                                <option value="REJECT">REJECT</option>
                                <option value="DROP">DROP</option>
                            </select>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p><input type="submit" class="style3" name="activar" value="Ativar Escolha"></p>
            
        </form>
    </body>
</html>
```



```

<?php/**CODIGO firewall.php * * #iptables [-t tabela] [opção] [chain] [dados] -j [ação] *///Verifica se foi pressiona o bottão na outra paginaif(isset ($_POST['activar'])) {    //captura as variaveis do formulario    $Tabela = $_POST['tabela'];    $Cadeia = $_POST['cadeia'];    $Protocolo = $_POST['protocolo'];    $IP = $_POST['ip'];    $Porta = $_POST['porta'];    $Alvo = $_POST['alvo'];    //string com o comando a ser executado    $CMD = "sudo /usr/sbin/iptables -t $Tabela -A $Cadeia -p $Protocolo -s $IP --dport $Porta -j $Alvo";    //Execução do Comando    $resultado = shell_exec($CMD);         echo "<p><b>CMD QUE VAI SER EXECUTADO</b>:</p> $CMD";     echo "<p><b>(CASO FALHE) TESTE O CMD NA CONSOLA PARA VERIFICA A SUA VALIDADE</b>:</p>";         /* Verifa se foi devolvido alguma mensagem é mostra*/    if(!empty($resultado)) {            echo "<p><b>O CMD devolveu o seguinte</b>:</p> $resultado";    }else {        echo "<p><b>O CMD não devolveu NADA</b>:</p>";    }}?><p><a href="index.php">PAGINA INICIAL</a></p>

```

----------


## PEdroArthurJEdi

Será que está faltando uma aspa no comando passado ao shell_exec?

----------


## ribeirokaka2

eu estou utilizando a distribuiçao ubuntu 9.04 , mas ainda estou tentando dar permissao de root a meu usuario ,pois se nao nao e possivel dar determinados comandos no cmd.

----------


## ribeirokaka2

sempre da esse retorno



CMD QUE VAI SER EXECUTADO:

sudo /usr/sbin/iptables -t filter -A FORWARD -p udp -s 192.168.0.1 --dport 80 -j REJECT
(CASO FALHE) TESTE O CMD NA CONSOLA PARA VERIFICA A SUA VALIDADE:

O CMD nÃ£o devolveu NADA:

PAGINA INICIAL

----------


## ribeirokaka2

editei o visudo 

/etc/sudoers.tmp


para nao pedir senha para o meu usuario comum

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root ALL=(ALL) ALL
jefferson ALL=(ALL)ALL
# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=NOPASSWD: ALL
jefferson ALL=NOPASSWD: /usr/sbin/iptables, /usr/sbin/iptables-save, /usr/sbin/iptables-restore



# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

jefferson ALL=NOPASSWD: /usr/sbin/iptables, /usr/sbin/iptables-save, /usr/sbin/iptables-restore

----------


## fsoaress76

> editei o visudo 
> 
> /etc/sudoers.tmp
> 
> 
> para nao pedir senha para o meu usuario comum
> 
> # /etc/sudoers
> #
> ...



Acho que o correto do seria "/sbin/iptables" no Ubunto.

Tente isso...

# User alias specification
www-data ALL=NOPASSWD:/sbin/iptables, /bin/sed, /usr/bin/awk, /bin/grep
sudo ALL=NOPASSWD:/usr/sbin/iptraf, /bin/sed, /usr/bin/awk, /bin/grep

///////////////////////// PHP

$ips = $_GET['ip'];

$masc = "iptables -t nat -A PREROUTING -p tcp -s $ips --dport 80 -j DNAT --to-destination 189.xx.xx.3\n";
$regras = '/dados/ip_web.sh';

if (!$ips){
echo "Arquivo nÃ£o encontrado";
exit;
}
$fp = fopen($regras, 'a+');
fwrite($fp, $masc);

fclose($fp);

if($ips){
shell_exec("/usr/bin/sudo /sbin/iptables -t nat -A PREROUTING -p tcp -s $ips --dport 80 -j DNAT --to-destination 189.xx.xx.3");

echo "<br>O ip $ips foi adicionado para bloqueio</br>";
echo "<br>";
echo "<a href='bloquear.php'>Bloquear outros</a></br>";
}
else {
echo "Error, Regras nÃÂ£o aplicadas...";
}


Esse script guarda dentro do arquivo "/dados/ip_web.sh" e aplica a grega. Fica quardado para caso vc precise restatar o iptables execultar as regras dentro do arquivo. 

Dentro do arquivo que fica as regras do firewall vc coloca: "sh /dados/ip_web.sh"

----------


## ribeirokaka2

index1.php

<html>
<head>
<title>..::Firewall com php::..</title>
<body>

<form action="firewall1.php" method=post>
<table border="1">
<thead>
<tr>
<th colspan="2"> EXECUCAO DE FIREWALL IPTABLES</th>
</tr>
</thead>
<tbody>
<tr>
<td>TABELA</td>
<td>
<select id="tabela" name="tabela" value="baba">
<option value="nat" selected="selected">nat</option>
<option value="mangle">mangle</option>
<option value="filter">filter</option>
</select>
</td>
</tr>
<tr>
<td>CADEIA(Chain)</td>
<td>
<input type="text" size="50" name="cadeia" value="">
</td>
</tr>
<tr>
<td>PROTOCOLO</td>
<td>
 <select id="protocolo" name="protocolo">
<option value="tcp" selected="tcp" >TCP</option>
<option value="udp">UDP</option>
<option value="icmp">ICMP</option>
<option value="all">TODOS</option>
</select>
</td>
</tr>
<tr>
<td>IP</td>
<td><input type="text" size="11" maxlength="11" name="ip" id="ip" Value=""></td>
</tr>
<tr>
<td>PORTA(max:65535)</td>
<td><input type="text" size="11" maxlength="5" name="porta" value=""></td>
</tr>
<tr>
<td>Permissoes(Target)</td>
<td>
<select id="alvo" name="alvo">
<option value="ACCEPT" selected="selected">ACCEPT</option>
<option value="REJECT">REJECT</option>
<option value="DROP">DROP</option>
</select>
</td>
</tr>
</tbody>
</table>
<p><input type="submit" class="style3" name="activar" value="Ativar Escolha"></p>

</form>
</body>
</html>



firewall.php


<?php
/**CODIGO firewall.php
*
* #iptables [-t tabela] [opção] [chain] [dados] -j [ação]
*/


//Verifica se foi pressiona o bottão na outra pagina
if(isset ($_POST['activar'])) {

//captura as variaveis do formulario
$Tabela = $_POST['tabela'];
$Cadeia = $_POST['cadeia'];
$Protocolo = $_POST['protocolo'];
$IP = $_POST['ip'];
$Porta = $_POST['porta'];
$Alvo = $_POST['alvo'];

//string com o comando a ser executado
$CMD = "sudo /usr/sbin/iptables -t $Tabela -A $Cadeia -p $Protocolo -s $IP --dport $Porta -j $Alvo";

//Execução do Comando
$resultado = shell_exec($CMD);

echo "<p><b>CMD QUE VAI SER EXECUTADO</b>:</p> $CMD";
echo "<p><b>(CASO FALHE) TESTE O CMD NA CONSOLA PARA VERIFICA A SUA VALIDADE</b>:</p>";

/* Verifa se foi devolvido alguma mensagem é mostra*/
if(!empty($resultado)) {
echo "<p><b>O CMD devolveu o seguinte</b>:</p> $resultado";
}else {
echo "<p><b>O CMD não devolveu NADA</b>:</p>";
}
}
?>


visudo


# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults env_reset

# Host alias specification

# User alias specification
www-data ALL=NOPASSWD:/sbin/iptables, /bin/sed, /usr/bin/awk, /bin/grep
sudo ALL=NOPASSWD:/usr/sbin/iptraf, /bin/sed, /usr/bin/awk, /bin/grep

# Cmnd alias specification

# User privilege specification
root ALL=(ALL) ALL
www-data ALL=NOPASSWD: /var/www/logar.php
jefferson ALL=NOPASSWD: /usr/sbin/iptables, /usr/sbin/iptables-save, /usr/sbin/iptables-restore
nobody ALL=NOPASSWD: /usr/sbin/iptables, /usr/sbin/iptables-save, /usr/sbin/iptables-restore


# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=NOPASSWD: ALL
jefferson ALL=NOPASSWD: /usr/sbin/iptables, /usr/sbin/iptables-save, /usr/sbin/iptables-restore

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

jefferson ALL=NOPASSWD: /sbin/iptables, /sbin/iptables-save, /sbin/iptables-restore

apache2 ALL=NOPASSWD:/sbin/iptables,/sbin/useradd,/sbin/userdel,/sbin/chpasswd, /bin/smbpasswd,/sbin/cbq,/sbin/ip,/sbin/tc,/sbin/dhcpd,/sbin/arping,/bin/r


esta execuntando cetinho sem erro , so nao insere o comando no sistema, quando vc da iptables -nL nao tem nada la ..


ja quebrei a cabeça de tudo que foi jeito.

alguem tem uma luz ai..

----------


## ribeirokaka2

o que a pessoa digita no index.php esta sendo enviado via post nas variaveis no arquivo firewall.php e mostra na tela , so nao esta mostrando no sistema os camandos escolhidos .

----------


## poolborges

Voce tem que dar permissão ao utilizador do apache, para que o codigo do iptables possa ser executado no php, sabendo que no Ubuntu o apachetem: 
_User(utilizador do apcache) www-data
__Group__(grupo do utilizador do apcache)__ www-data_
_
Sabendo que no Ubuntu os comandos do iptables estão em 

_"/sbin/iptables"
"/sbin/iptables-save"
"/sbin/iptables-restore"

Não deves editar o ficheiro /etc/sudoers directamente com um editor grafico
Pq simplesmente NÃO ira funcionar 

Por isso na consola/shell(linha de comando) ou como quiser chamar execute

visudo (este comando ira abri o ficheiro /etc/sudoers para para ser editado)

adiciona a seguinte linha(ira dar permissão ao utilizador do apache para executar iptables) 
www-data ALL=NOPASSWD:/sbin/iptables 

Caso pretende dar permissão ao utilizador do apcache(www-data) para executar outros comandos
basta separar os comando por virgula exemplo
www-data ALL=NOPASSWD:/sbin/iptables, /sbin/iptables-save, /sbin/iptables-restore


Explicando a alinha que FOI ADICIONADO
o utilizador www-data pode executar 
(/sbin/iptables, /sbin/iptables-save, /sbin/iptables-restore), apartir de qq maquina (ALL)
o ALL podia ser substituido por localhost

----------


## ribeirokaka2

ja dei essas permissoes e continua nao inderindo os comando no shell do ubuntu as regras nao aparecem

----------


## poolborges

Agora estive aqui a ver a copia do teu ficheiro /etc/sudoers e esta uma confusão ali, e aminha pergunta é para que precisas de dar permissão ao jefferson, nobody, apache, precisas mesmo daqueles comandos todos ali para serem executados atravez de um pagina web ??????

Fizeste alguma copia de segurança do /etc/sudoers, pois é importante se não sabes o que fazes manteres sempre um copia do ficheiro qq problema, podes sempre restaurar o ficheiro original

se não tiveres um copia de segunça e caso pretende apenas dar a permissão de executar o iptables ao utilizador do apache (www-data): mantem apenas o necessario no ficheiro /etc/sudoers, para evitar complicações

Não tira o # da linha (%sudo ALL=NOPASSWD: ALL) "NÃO COMPENSA DISTRUIR A ARVORE TODA PARA QUEBRA UM GALHO"


====FICHEIRO /etc/sudoers apenas como o essencial para executar iptables pelo (apache/php)===


# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root ALL=(ALL) ALL
www-data ALL=NOPASSWD:/usr/sbin/iptables, /usr/sbin/iptables-save, /usr/sbin/iptables-restore

# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
# %sudo ALL=NOPASSWD: ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

----------


## poolborges

Conseguese executar na shell com sucesso o que aparece na pagina web ? 
Por exemplo

sudo /usr/sbin/iptables -t filter -A FORWARD -p udp -s 192.168.0.1 --dport 80 -j REJECT

----------


## ribeirokaka2

sim consigo sim na shell executa numa boa..

----------


## ribeirokaka2

na shell consigo executar o que eu vejo na web.

----------


## ribeirokaka2

ah e obrigado pela dica do sudoers.

----------

