Configuração de um Firewall com Iptables

Bem, hoje resolvi postar algumas dicas sobre o iptables esse poderoso firewall que nos serve a cada dia eheh falo isso pq aqui em casa compartilho minha net 2mb com alguns vizinhos mas sempre tem um engracadinho que quer deixar emule ligado o dia todo ou então passar o dia fazendo downloads, então com Firewall + Iptraf consigo tranquilamente resolver o problema, e vou passar algumas dicas do iptables.

Na configuração do Firewall com o iptables, é preciso saber quais são as regras a serem utilizadas para rodar o Firewall:

Regras do Firewall

  • INPUT: È utilizada quando o destino final é a própria máquina firewall.
  • OUTPUT: Qualquer pacote gerado pela máquina firewall e que deva sair para a rede será tratado pela regra OUTPUT.
  • FORWARD: Qualquer pacote que atravessa o firewall, de uma máquina e direcionado à outra, será tratado pela chain FORWARD. Basicamente o IPTABLES tem as seguintes políticas:
  • DROP – Nega pacote e não manda um pacote de volta para o emitente.
  • ACCEPT – Aceita o pacote
  • REJECT – Nega pacote e manda um pacote de volta do tipo host-unreachable (Host Inalcançável) ==Comandos Principais do IPtables== – -A – Este comando acrescenta uma regra às existentes no sistema, ou seja, permite atualizar regras já existentes na estrutura do firewall. – -I – Este comando insere uma nova regra dentro das existentes no firewall. – -D – Este comando exclui uma regra específica no firewall. – -P – Este comando define a regra padrão do firewall. – -L – Este comando lista as regras existentes no firewall. – -F – Este comando ZERA todas as regras criadas no Firewall (o chamado flush). – -h – Este comando mostrará o help, ajuda de comando. – -R – Este comando substitui um regra no firewall. – -C – Este comando basicamente checa as regras. – -Z – Este comando zera uma regra específica. – -N – Este comando cria uma nova regra com um nome. – -X – Este comando exclui uma regra específica por seu nome.

Os parâmetros padrão do iptables são os seguintes:

– -p! (protocolo) – define qual o protocolo TCP/IP deverá ser tratado. São eles: TCP, UDP e ICMP

– -s! (origem)/ -d! (destino) – Define qual o endereço de origem (-S) e de destino (-D) que a regra atuará. Este comando possui dois argumentos: endereço/máscara e porta. Ex.: -S 10.0.0.1/24 80,.

– -i! (interface) – define o nome da interface de rede onde trafegará os pacotes de entrada e saída do firewall. Muito utilizado em mascaramento e técnicas de NAT. Exemplo: -W eth1.

– -j! (ir para) – Serve para redirecionar uma ação desde que as regras sejam similares.

– -f!(fragmento) – Trata datagrama fragmentados.

Os comandos e os parâmetros são exatamente iguais aos do ipchains, sem tirar nem pôr.

Extensões

Novidade do iptables que facilita as regras.

 -sport[!] [port:port] -dport[!] [port:port]

Normalmente estas extensões são utilizadas com o comando -m do iptables. Trata-se de um direcionamento de porta(s) origem (-sport), para porta(s) destino (-dport). Pode-se inclusive definir um número padrão de portas para o acesso (port:port). Este comando pode ser utilizado tanto para portas TCP ou UDP.

 -mac-source[!] endereço

especifica qual a placa de rede, através de seu endereço MAC, que irá transmitir pacotes através do firewall, limitado pela política do mesmo.

 -icmp-type[1] tipo

Especifica quais os tipos de pacotes ICMP pode passar ou não pelo firewall, São eles:

 Mensagem Tipo Código Echo-request 8 0 Echo-reply 3 0 Source-quench 4 0 Time-exceed 11 0 Destination-unreachable 3 0 Network-unreachable 3 0 Host-unreachable 3 1 Protocol-unreachable 3 2 Port-unreachable 3 3

Com isto podemos bloquear alguns ataques do tipo ping flood, bloquear ping e etc

[!] — syn – especifica o uso dos bits ACK e FIN em requisições SYN TCP.

Especificamente, a opção -m state' aceita uma opção adicional–state’, que é uma lista de estados de ativação separados por vírgula. (a flag ‘!’ não indica a ativação desses estados). Esses estados são:

NEW Um pacote que cria uma nova conexão.

ESTABLISHED Um pacote que pertence a uma conexão existente (isto é, um pacote de resposta).

RELATED Um pacote que está relacionado com (mas não faz parte de) uma conexão existente, como um ICMP error, ou (com o módulo FTP inserido),um pacote que estabelecido por uma conexão de dados ftp.

INVALID Um pacote que não poderia ser identificado por alguma razão: isto inclui execução fora da memória e erros de ICMP que não correspondam a nenhuma conexão existente. Geralmente estes pacotes devem ser barrados (drop).

Exemplos do Firewall

 #iptables -A INPUT -p icmp -j DROP

Esta regra nega todos os pacotes ICMP vindos do servidor, em que se encontra o firewall.

 #iptables -D INPUT -p icmp -j DROP

Esta regra exclui a regra criar acima.

 #iptables -A INPUT -s 192.168.1.0/24 -j DROP

Esta regra acima faz com que todos os pacotes vindo de qualquer endereço da classe de ip 192.168.1.1 á 192.168.1.255 nega os pacotes.

 #iptables -A OUTPUT -p icmp -d ! 192.168.1.0/24 -j ACCEPT

Esta regra acima faz com que todos os pacotes vindo de qualquer endereço da classe de ip 192.168.1.1 á 192.168.1.255 aceita os pacotes.

 #echo 1 > /proc/sys/net/ipv4/ip_forward

Habilitando o recurso de IP forwarding

Configurando o Firewall contra ataque

Proteção contra Syn-floods

 # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

Port scanners ocultos

 # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit
 1/s -j ACCEPT

Ping da morte

 # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

Proteção Contra IP Spoofing

 # iptables -A INPUT -s 10.0.0.0/8 -i Interface da NET -j DROP
 # iptables -A INPUT -s 172.16.0.0/16 -i Interface da NET -j DROP
 # iptables -A INPUT -s 192.168.0.0/24 -i Interface da NET -j DROP

Obs.: Interface da NET pode ser ppp0, ethX e etc.

Log a portas proibidas e alguns backdoors

Porta FTP

 # iptables -A INPUT -p tcp --dport 21 -j LOG --log-prefix "Serviço: FTP"

Porta Wincrash

 # iptables -A INPUT -p tcp --dport 5042 -j LOG --log-prefix "Serviço: Wincrash"

Portas BackOrifice

 # iptables -A INPUT -p tcp --dport 12345 -j LOG --log-prefix "Serviço: BackOrifice"
 # iptables -A INPUT -p tcp --dport 123456 -j LOG --log-prefix "Serviço: BackO

Redirecionamento de Portas (Usado em DMZ)

Redirecionar Porta SMTP

 # iptables -t nat -A PREROUTING -i ethx -p tcp --dport 25 -j DNAT --to 192.168.1.1

Redirecionar Porta POP

 # iptables -t nat -A PREROUTING -i ethx -p tcp --dport 110 -j DNAT --to 192.168.1.1

OBS.:Sendo que ethx é sua interface de entrada da WAN.

Bloqueando Kazaa Lite

Para ativar o módulo String match support (EXPERIMENTAL) tem que aplicar o patch e logo depois compilar o kernel.

 # iptables -m string --string "X-Kazaa-Username:" -j DROP
 # iptables -m string --string "X-Kazaa-Network:" -j DROP
 # iptables -m string --string "X-Kazaa-IP:" -j DROP
 # iptables -m string --string "X-Kazaa-SupernodeIP:" -j DROP

Bloqueando cmd.exe

Neste caso você tenha atrás do seu firewall linux um servidor de web IIS da microsoft, e deseja evitar que worms com código arbitrários que usam o comando cmd.exe:

Bloqueando em Silêncio

 # iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"

Bloqueando e reportando por uma hora

 # iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -m limit --limit 1/hour
 Scripts Cases Ruleset 1 Ruleset 2 Ruleset 3 Ruleset 4 Ruleset 5 Ruleset 6

Referência:

Preload de Página

Vamos ver como fazer um Preload como o do Google.

Olá, agora vamos ver como criar o preload mais conhecido da internet, o preload do google, isso mesmo aquela coisa minúscula e vermelha no canto direito da tela.

Vamos ao bom e velho HTML (index.html)
<html>
<head>
<title> Loader :: </title>
<script src=”load.js” type=”text/javascript”></script>
<link href=”load.css” type=”text/css” rel=”stylesheet”>
</head>
<body>
<div id=”conteudo”>
<!– -aqui vai todo o conteudo do site –>
<a href=”index.html”>Testar novamente</a>
<iframe src=”http://news.google.com.br”></iframe>
</div>
<!– funcao que ira criar o elemento div loader –>
<!– esta chamada pode ser a ultima linha dentro do body –>
<script>loading()</script>
</body>
</html>

Acima utilizei dentro do conteúdo da página (div conteudo) um iframe, nada de especial, foi apenas uma forma que encontrei de fazer com que a página demorasse mais que 1 segundo para carregar dando tempo aparecer o texto “Carregando…”. Não vá me colocar um iframe na sua página hein! Coloque o conteúdo normalmente, basta que estejam dentro da DIV conteudo. :)

Vamos ao arquivo JavaScript – salve-o como load.js

function loading()
{
//criando um novo elemento div
x = document.createElement(”div”)
//atribuindo o id ao novo elemento
x.id = “loader”
//adicionando conteudo formatado pelo CSS na div loader
x.innerHTML = ’<div id=”info” class=”info”>’
x.innerHTML += ’<p>Carregando…</p></div>’
// nova div ira aparecer depois da div conteudo
conteudoDiv = document.getElementById(”conteudo”)
//inserindo a div loader dentro do body e apos a div conteudo
document.body.insertBefore(x, conteudoDiv)
}

//função aguarda a pagina carregar para alterar
//propriedade display do elem. fazendo sumir

window.onload = function(){
//obtendo as propriedades do elemento div conteudo
obj2 = document.getElementById(”conteudo”)
//exibindo a div conteudo (display none no CSS)
obj2.style.display = ‘block’
//obtendo as propriedades do elemento div loader
obj = document.getElementById(”loader”)
//removendo o conteudo da div loader
obj.innerHTML = “”
//ocultando a div loader apos o carregamento da pagina
obj.style.display = ‘none’
}

Muito simples, mas foi a forma que encontrei de faze-lo, lembrando que eu também estou aprendendo e procurando explorar ao máximo os recursos do JS.

Vamos ver o arquivo CSS – salve-o como load.css

body{
margin:0px;
padding:0px;
}

#loader{
position:absolute;
width:100%;
height:600px;
}

#conteudo{
display:none;
}

.info{
width:100px;
float:right;
margin-right:2px;
margin-top: 2px;
}

.info P{
margin:0;
padding:3px;
background-color:red;
font:11px verdana;
color:#fff;
text-align:center;
}

Como perceberam o que acontece é que a o atributo DISPLAY do elemento DIV Conteudo dentro do BODY em primeira instância está definida no CSS como NONE, fazendo com que seu conteúdo não apareca no html, em seguida a chamada a função loading() é feita criando um novo elemento DIV dentro do BODY com o texto carregando e sua formatação no CSS, após o carregamento da página, nesse caso apenas um IFRAME, a DIV conteudo tem sua propriedade DISPLAY alterada para BLOCK, ou seja, passa a aparecer no HTML, após isso no window.onload a propriedade da DIV Loader que foi criada tem sua propriedade DISPLAY alterada para NONE, ou seja, deixa de aparecer e como essa div foi criada pelo javascript, mais precisamante pela função loading(), ela não aparece no código HTML.

É isso, não há muito segredo nesse exemplo, nada mais justo agora do que ver funfando!

Mas só uma coisa antes, se esse exemplo lhe ajudar, por favor comente para que eu possa continuar postando, muito obrigado e agora veja o Exemplo Loader do Google

Fonte: http://clares.wordpress.com

Criar thumb (miniaturas) com PHP

Olá, vamos ver como gerar miniaturas de imagens (thumb) para uma galeria de fotos, apresentação de produtos ou qualquer outra aplicação. É muito comum encontrarmos sites que exibem miniaturas de imagens ainda da forma antiga, que trata-se de simplesmente redimensionar a imagem com algum software e criar uma pasta chamada thumbs ou miniaturas, muitos aplicativos utilizam essa solução, mas se você pensar em alguma solução mais inteligente que dispense o trabalho do webdesigner por ex. um cms (gerenciador de conteúdo) fica difícil utilizar essa antiga solução, imagine vender ao seu cliente um sistema onde ele possa gerenciar seu conteúdo sem precisar de você, agora imagine que ele queira colocar miniaturas de fotos no site….dai complicou um pouco não é ? ele terá que enviar todas as imagens para você redimensionar e envia-las de volta para ele poder inserir no site, isso não parece ser um sistema com gerenciador de conteúdo, vamos tomar como exemplo um sistema para imobiliárias onde o proprietário cadastra os imóveis e envias as fotos para o site, agora tente imaginar a página principal com os imóveis em destaque……..estranho né, imagine um anúncio com uma foto 800×600 na página principal…agora imagine 20 anúncios como esse, eu acho que fica feio e você? Também não é, então vamos ver como mostrar a miniatura da foto original enviada para o sistema, acredite isso é muito simples!

Em 1º lugar verifique se o seu php está com a biblioteca gd ou gd2 instalada, se não estiver baixe o easyphp, instale e marque a opção gd2 em php extensions, alias o easyphp é maravilhoso, ele já instala o apache, php5 e mysql, se você não conhece está perdendo tempo, falarei sobre ele em um outro post.

Vamos ao arquivo index.php

<html>
<head>
<title>.: Thumbs :.</title>
</style>
</head>
<body>
<img src=”thumb.php?img=image1.jpg” title=”imóvel cod 01″>
<img src=”thumb.php?img=image2.jpg” title=”imóvel cod 02″>
</body>
</html>

Note que acima no src estamos passando a url da imagem para para o arquivo thumb.php, ao invés de passar diretamente a imagem, isso porque o arquivo thumb.php está encarregado de redimensionar a imagem original, mas esse redimensionamento ocorre somente na visualização, ele não altera propriamente a imagem, ela continua no seu tamanho original, apenas o que é mostrado é que foi redimensionado, isso tem que ficar claro, nenhuma imagem pequena é gerada, esse é o truque, o arquivo thumb.php apenas muda as propriedades da imagem para a visualização ok ?

Claro que nesse exemplo eu utilizei uma url pré-definida, mas para o caso de um sistema essa url deveria ser retornada por ex. de uma consulta SQL, no sisteminha (veja aqui um caso real e e aqui o sisteminha) que fiz a algum tempo atrás eu criei uma tabela mais ou menos assim: codimovel_f , urlFoto, descFoto … onde no momento do upload da foto era feita uma inserção no banco de dados contendo a url da foto que acabara de ser enviada, para não repetir os nomes das imagens e eu não ter que ficar renomeando eu utilizei a função MD5() do PHP que gera um nome/string único, em um artigo posterior falarei sobre o MD5.

Vamos ver o tal arquivo chamado thumb.php

<?php
// recebendo a url da imagem
$filename = $_GET[‘img’];

// Cabeçalho que ira definir a saida da pagina
header(’Content-type: image/jpeg’);

// pegando as dimensoes reais da imagem, largura e altura
list($width, $height) = getimagesize($filename);

//setando a largura da miniatura
$new_width = 120;
//setando a altura da miniatura
$new_height = 100;

//gerando a a miniatura da imagem
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

//o 3º argumento é a qualidade da miniatura de 0 a 100
imagejpeg($image_p, null, 50);
imagedestroy($image_p);
?>