Implementação e conceito de um Firewall linux com iptables básico

O objetivo deste mini tutorial é mostrar a criação de um firewall iptables básico, baseado na idéia de bloquear tudo e depois liberar apenas o que é necessário.

“Existem diversos scripts de firewall pela internet, muitas vezes mirabolantes e cheio de recursos. Isto é bom pois sempre podemos aproveitar algo. O problema é que muitas vezes o que as pessoas procuram um firewall básico, na qual possa adaptar às suas próprias necessidades.
Pensando nisso, resolvi mostrar um firewall realmente básico, mas que além de ser plenamente funcional, explica o conceito que por trás da liberação e bloqueio de portas, com intuito de servir de alicerce para um firewall mais amplo e customizado”

Primeiro, precisamos definir a política padrão do iptables.

 

konsole

iptables -P INPUT DROP 
iptables -P FORWARD DROP
           iptables -P OUTPUT ACCEPT

Com os comandos acima eu disse que por padrão, nada entra ou atravessa uma interface de rede sem que tenha sido autorizado pelo firewall linux. Aconselho trabalhar desta forma, pois assim você mantém o controle do que está acontecendo com seu servidor.
Como pode notar, OUTPUT eu deixei como ACCEPT, pois são as conexão que se originam de dentro do servidor para fora, logo não tem necessidade de ser bloqueado (afinal de contas é de se esperar que enquanto administrador, você tenha consciencia das conexões que está gerenciando).
Passemos para as linhas seguintes:

konsolemodprobe ip_nat

 

Através do comando modprobe, nós vamos carregar os módulos ip_nat (em alguns lugares iptable_nat) . Este módulo é responsável por dar ao servidor a possibilidade de traduzir pacotes (nat), logo, muito importante de se carregar.

konsole

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

Por padrão, as distribuições linux vêm com o redirecionamento de ips desativado. No caso de você estar configurando um firewall router, firewall com vpn ou algo assim (motivo pelo qual provavelmente você está lendo isso), é preciso ativa-lo.

konsole

  iptables -t filter -A INPUT -p tcp -m -tcp –dport 80 -j ACCEPT

Este modelo de firewall com iptables, como visto, bloqueia tudo por padrão, sendo necessário que criemos as excessões. Uma excessão seria esta mostrada acima, que libera a entrada do tráfego pela porta 80.
Você poderia repetir várias vezes esta linha trocando apenas a porta, mas vou mostrar como fazer um looping que torne as coisas mais fáceis e menos repetitivas.

konsolefor PORTA in 80 ;
do
              iptables -t filter -A INPUT -p tcp -m -tcp –dport $PORTA -j ACCEPT
             done

 

Neste exemplo acima, eu crio um looping para que a regra do iptables libere o acesso à porta 80. Utilize este looping e adicione as portas que necessita. Veja algumas das principais portas:

20 e 21 ftp
Libere-as caso tenha um servidor ftp instalado no servidor.  Caso precise acessar ftp externamente, será usada uma regra de FORWARD.

22 ssh
Permite acesso a conexões SSH. O acesso a ssh fora do servidor é feito mediante regra de FORWARD

25, 143, 445 e 995 e-mail
Essas portas são utilizadas por servidores de e-mail, como postfix, qmail. Mesmo que não tenha um destes instalado, é bom gravar estas portas, pois são necessários redirecionamentos para acessar de pop e imap de servidores na internet.

80 http.

Utilizada por servidor web, como apache e httpd. Também é necessário permitir seu acesso caso vá usar um proxy server, como squid

137,138,139 netbios. Estas portas são necessárias para permitir que se trabalhe com netbios, um protocolo de comunicação para redes simples, que utiliza nomes para resolver hosts. Considero muito importante caso vá se trabalhar com Samba.

443 https. Porta http segura. Quem trabalha com servidor web e proxy, precisa liberar essa porta caso contrário não poderá acessar conexões seguras (como bancos, orkut, gmail)

445 CIFS
Necessário pra quem instalar SAMBA.

3128
A porta do mais famoso proxy server do linux, o squid.

Essas portas mostradas acima são as mais comuns a se liberar em um firewall. Voltando ao looping acima, veja como ficaria com todas as portas liberadas:

konsolefor PORTA in 20 21 22 25 80 137 138 139 143 443 445 995 ; 
do
               iptables -t filter -A INPUT -p tcp -m -tcp –dport $PORTA -j ACCEPT
              done

Simples, não? Você pode adicionar as portas tcp que precise liberar, de maneira simples e indolor. Observe que aqui liberamos as portas tcp apenas. Crie um novo loop caso tenha que liberar mais portas, porém udp .. Geralmente a única porta udp que precisamos liberar é a 53, que é responsável por lidar com consultas dns. Sendo assim, criaríamos a regra abaixo:

 

konsoleiptables -t filter -A INPUT -p udp -m -udp –dport 53 -j ACCEPT

Falta apenas liberarmos o ping, que é o método mais comum de consultar um computador na rede. Porém o protocolo icmp (muitas vezes chamado de protocolo do ping) é muito amplo, não sendo necessário que seja liberado por completo. Neste caso vamos apenas liberar o icmp do tipo 8 (echo) e 0 (echo reply), que são suficientes para se fazer um ping.

 

konsole

iptables -t filter -A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT
iptables -t filter -A INPUT -p icmp -m icmp –icmp-type 0 -j ACCEPT

Pronto. Agora já liberamos as portas que precisávamos e o ping. Só o que precisamos é liberar o forward, que são as conexões que atravessam as interfaces de rede, como conexões https e pop3.

 

konsoleiptables -t filter -A FORWARD -p tcp -m tcp –dport 443 -j ACCEPT

Note que na regra acima, eu não especifiquei interfaces, sendo assim, o acesso estaria liberado tanto de eth1 para eth0 como vice-versa. Se eu quisesse especificar as interfaces, poderia fazer da seguinte forma:

 

konsoleiptables -t filter -A FORWARD -p tcp -m tcp –i eth0 -o eth1 -dport 443 -j ACCEPT

Nesta regra eu libero apenas o acesso vindo da eth0 (-i) com destino a eth1 (-o).

Para fechar, utilize estas duas regrinhas para aceitar automaticamente todas as conexões já relacionadas e estabelecidas, Desta forma, quando você autoriza uma conexão vinda de uma fonte A para um destino B, automaticamente a resposta desta conexão será aceita, sem a necessidade de criar regras novas para isso:

konsole

iptables -t filter -A INPUT -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT

Bingo! Terminamos nosso pequeno e simples script de firewall. Vejamos ele na íntegra. Com os conceitos explicados acima, fica fácil adapta-lo e expandi-lo conforme as suas necessidades.

 

konsole

iptables -P INPUT DROP
iptables -P FORWARD DROP
              iptables -P OUTPUT ACCEPT
              modprobe ip_nat
              echo 1 > /proc/sys/net/ipv4/ip_forward

              for PORTA in 20 21 22 25 80 137 138 139 143  ;
              do 
              iptables -t filter -A INPUT -p tcp -m -tcp –dport $PORTA -j ACCEPT
              done

              iptables -t filter -A INPUT -p udp -m -udp –dport 53 -j ACCEPT
              iptables -t filter -A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT
              iptables -t filter -A INPUT -p icmp -m icmp –icmp-type 0 -j ACCEPT
              for PORTA in 25 143 443 995 ;
              do
              iptables -t filter -A FORWARD -p tcp -m tcp –dport $PORTA -j ACCEPT 
             done
             iptables -t filter -A INPUT -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT 
             iptables -t filter -A FORWARD -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT

 

fonte:http://jeferson.info

Deixe uma resposta

Você precisa fazer o login para publicar um comentário.