Firewall pessoal com IPtables

Publicado por Rodrigo Garcia em 22/04/2013

[ Hits: 13.059 ]

 


Firewall pessoal com IPtables



Olá a todos!!!

Nesta dica, eu vou mostrar algo muito simples e útil, que é um firewall pessoal através do IPtables. O IPtables é um front-end para o módulo NetFilter do kernel do Linux.

Ele possui quatro tabelas:
  • Filter, que é a padrão (controla o tráfego básico de entrada, saída e encaminhamento do firewall);
  • Tabela NAT (responsável por tradução de endereços de redes);
  • Tabela Mangle (que é responsável por regras de ações especiais a serem tomadas pelo firewall);
  • Tabela RAW (controle de pacotes).

Neste firewall, usaremos apenas a tabela Filter, conforme veremos a seguir. Geralmente (nos sistemas baseados em Debian), o IPtables não contém nenhuma regra e a política do firewall é a ACCEPT, que aceita todos os pacotes de entrada, saída e encaminhamento.

Entretanto, nos sistemas baseados em Red Hat, por exemplo, o firewall possui já algumas regras criadas na instalação do S.O. Vamos trabalhar como se já houvessem regras preexistentes.

A primeira ação a ser tomada, é limpar todas as regras de todas as tabelas do firewall:

# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X


A opção "-F" é a mesma de "--flush" e vai limpar todas as tabelas. A opção "-X", vai excluir todas as chains personalizadas preexistentes.

A seguir, vamos aplicar a política "DROP" no firewall, que vai negar qualquer conexão por padrão:

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


O que foi feito acima, foi bloquear qualquer conexão de entrada e de encaminhamento no firewall e permitir todas as conexões de saída. Neste momento, você não conseguirá estabelecer conexão nenhuma, pois conseguirá enviar pacotes de saída, mas não conseguirá receber respostas.

A primeira coisa que devemos liberar no firewall, é o localhost:

# iptables -A INPUT -i lo -j ACCEPT

Em seguida, devemos liberar as conexões que você estabeleceu, para que haja entrada de respostas de pacotes:

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Agora, o próximo passo é liberar a entrada de respostas de ping e solicitações de ping da rede interna (opcional):

# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp -s ip.da.rede.interna/máscara --icmp-type 8 -j ACCEPT


O que vamos fazer agora, é liberar as respostas de servidores de DNS externos:

# iptables -A INPUT -p udp -s 0/0 --sport 53 -j ACCEPT

Vimos que, agora, o comando teve algumas novidades:
  • -s 0/0 :: Significa qualquer origem com qualquer máscara de rede.
  • --sport :: Significa uma conexão que tem como origem a porta 53 (DNS).

A partir deste momento, você conseguirá executar com sucesso ping pelo nome do endereço que você quiser. Então, vamos agora liberar a navegação Web:

# iptables -A INPUT -p tcp -s 0/0 --sport 80 -j ACCEPT
# iptables -A INPUT -p tcp -s 0/0 --sport 443 -j ACCEPT


Pronto! Você já consegue também navegar na internet! Esses são os passos da criação de um firewall pessoal básico, que você mesmo pode personalizar de acordo com suas necessidades.

Por exemplo, se quiser acessar algum serviço externo, deverá criar uma regra assim:

# iptables -A INPUT -p tcp -s 0/0 --sport "porta do serviço" -j ACCEPT

E se quiser liberar na sua máquina o acesso a um serviço SSH de dentro da rede, deverá criar uma regra como essa:

# iptables -A INPUT -p tcp -s ip.da.rede.interna/máscara --dport 22 -j ACCEPT

Para facilitar, eu gosto de criar scripts que aplicam todas essas regras automaticamente e facilitam na adição de novas regras com o uso de variáveis. Por exemplo:

#!/bin/bash
# Script de Firewall
####################################################
# 1 - VARIÁVEIS
####################################################

IPT=$(which iptables)  # Isso diminui a sua digitação, e traz maior segurança
IF_INT="eth0"  # Colocar aqui o nome da placa de rede interna
IP_INT="`ifconfig eth0 | awk 'NR == 2{ print $3 }'`"  # Atualiza o IP local Dinamicamente
NET_INT="192.168.0.0/24"  # IP da rede interna
####################################################
# 2 - LIMPAR FIREWALL
####################################################

for TABLE in filter nat mangle raw
do
      $IPT -t $TABLE -F
      $IPT -t $TABLE -X
done
####################################################
# 3 - APLICAR POLITICAS
####################################################

$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
####################################################
# 4 - LIBERAR LOCALHOST
####################################################

$IPT -A INPUT -i lo -j ACCEPT
####################################################
# 5 - LIBERAR CONEXÕES ESTABELECIDAS
####################################################

$IPT -A INPUT -i $IF_INT -m state --state ESTABLISHED,RELATED -j ACCEPT
####################################################
# 6 - ECHO REPLY E ECHO REQUEST VINDO DA REDE INTERNA
####################################################

$IPT -A INPUT -p icmp --icmp-type 0 -j ACCEPT
$IPT -A INPUT -i $IF_INT -p icmp -s $NET_INT --icmp-type 8 -j ACCEPT
####################################################
# 7 - LIBERAR RESPOSTAS DE DNS
####################################################

$IPT -A INPUT -i $IF_INT -p udp -s 0/0 --sport 53 -j ACCEPT
####################################################
# 8 - LIBERAR NAVEGAÇÃO WEB
####################################################

$IPT -A INPUT -i $IF_INT -p tcp --sport 80 -j ACCEPT
$IPT -A INPUT -i $IF_INT -p tcp --sport 443 -j ACCEPT
####################################################


E assim, terminamos nosso script!

Podemos adicioná-lo na inicialização do sistema editando o arquivo /etc/rc.local e adicionando o caminho absoluto para o script.

No próximo post, vou colocar um script de firewall para redes corporativas. Até a próxima!!!

Dica também publicada em: ::Unix for Life::: Firewall Pessoal

Outras dicas deste autor

VPN básica site-to-site com IPsec

Comandos úteis do HP-UX para administradores GNU/Linux

Discos de storage em Red Hat EL5

Utilizando delay_class 4 do Squid 3 Integrado ao AD

Autenticação do Squid no Winbind 2.4 (Debian 8)

Leitura recomendada

Como bloquear a gravação de arquivos .exe em compartilhamento Samba

Travando arquivos

Script para resolver o erro NO_PUBKEY

Executando scan com NMAP conforme suas ordens (voz) - parte 1 (alto-falantes)

Heartbleed - Corrigindo OpenSSL em servidores Debian

  

Comentários
[1] Comentário enviado por removido em 23/04/2013 - 16:47h

Excelente contribuição.

Parabéns!

[2] Comentário enviado por r.garcia em 23/04/2013 - 21:53h


[1] Comentário enviado por izaias em 23/04/2013 - 16:47h:

Excelente contribuição.

Parabéns!


Obrigado!!! Já mandei um script de firewall corporativo para a fila de espera, ficou bem bacana!!!

Abração!!!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts