Páginas

segunda-feira, 8 de abril de 2013

Entendendo o funcionamento de um firewall e regras IPtables

Introdução 

O Firewall tem o objetivo proteger o servidor e a rede local contra acessos indesejados, tráfego indesejado, proteger serviços que estejam rodando no servidor e bloquear a passagem de coisas que você não deseja receber (como conexões vindas da Internet para sua rede local, evitando acesso aos dados corporativos de uma empresa ou a seus dados pessoais). A implementação de um bom firewall dependerá da experiência, conhecimentos de redes (protocolos, roteamento, interfaces, endereçamento, masquerade, etc), da rede local, e sistema em geral do Administrador de redes, a segurança de sua rede e seus dados dependem da escolha do profissional correto, que entenda a fundo o TCP/IP, roteamento, protocolos, serviços e outros assuntos ligados a rede. No kernel do Linux 2.4, foi introduzido o programa IPtables (também chamado de Netfilter) que substitui o ipchains dos kernels da série 2.2. Este novo programa tem como vantagem ser muito estável (assim como o ipchains e ipfwadm), confiável, permite muita flexibilidade na programação de regras pelo administrador do sistema, mais opções disponíveis ao administrador para controle de tráfego, controle independente do tráfego da rede local/entre redes/interfaces devido a nova organização das etapas de roteamento de pacotes.
O IPtables é um firewall em nível de pacotes e funciona baseado no endereço/porta de origem/destino do pacote, prioridade, etc. Ele funciona através da comparação de regras para saber se um pacote tem ou não permissão para passar. Em firewalls mais restritivos, o pacote é bloqueado e registrado para que o administrador do sistema tenha conhecimento sobre o que está acontecendo em seu servidor. Também pode ser usado para modificar e monitorar o tráfego da rede, fazer NAT (masquerading, source nat, destination nat), redirecionamento de pacotes, marcação de pacotes, modificar a prioridade de pacotes que chegam/saem do seu servidor, contagem de bytes, dividir tráfego entre máquinas, criar proteções anti-spoofing, contra syn flood, DoS, etc. O tráfego vindo de máquinas desconhecidas da rede pode também ser bloqueado/registrado através do uso de simples regras. As possibilidades oferecidas pelos recursos de filtragem iptables como todas as ferramentas UNIX maduras dependem de sua imaginação, pois ele garante uma grande flexibilidade na manipulação das regras de acesso ao sistema, precisando apenas conhecer quais interfaces o sistema possui, o que deseja bloquear, o que tem acesso garantido, quais serviços devem estar acessíveis para cada rede, e iniciar a construção de seu firewall.
Um firewall não funciona de forma automática (instalando e esperar que ele faça as coisas por você), é necessário pelo menos conhecimentos básicos de rede TCP/IP, roteamento e portas para criar as regras que farão a segurança de seu servidor. A segurança do servidor depende do controle das regras que serão criadas por você, as falhas humanas são garantia de mais de 95% de sucesso nas invasões.
Enfim o IPtables é um firewall que agradará tanto a pessoas que desejam uma segurança básica em seu servidor, quando administradores de grandes redes que querem ter um controle minucioso sobre o tráfego que passam entre suas interfaces de rede (controlando tudo o que pode passar de uma rede a outra), controlar o uso de tráfego, monitoração, etc.

Características do Netfilter/Iptables 
Segue abaixo algumas características do Firewall Netfilter/IPtables 

  • Especificação de portas/endereço de origem/destino
  • Suporte a protocolos TCP/UDP/ICMP (incluindo tipos de mensagens icmp)
  • Suporte a interfaces de origem/destino de pacotes
  • Manipula serviços de proxy na rede
  • Tratamento de tráfego dividido em chains para melhor controle do tráfego que entra/sai da máquina e tráfego redirecionado.
  • Permite um número ilimitado de regras por chain
  • Muito rápido, estável e seguro
  • Possui mecanismos internos para rejeitar automaticamente pacotes duvidosos ou mal formados.
  • Suporte a módulos externos para expansão das funcionalidades padrões oferecidas pelo código de firewall
  • Suporte completo a roteamento de pacotes, tratadas em uma área diferente de tráfegos padrões.
  • Suporte a especificação de tipo de serviço para priorizar o tráfego de determinados tipos de pacotes.
  • Permite especificar exceções para as regras ou parte das regras
  • Suporte a detecção de fragmentos
  • Permite enviar alertas personalizados ao syslog sobre o tráfego aceito/bloqueado.
  • Redirecionamento de portas
  • Masquerading
  • Suporte a SNAT (modificação do endereço de origem das máquinas para um único IP ou faixa de IP's).
  • Suporte a DNAT (modificação do endereço de destino das máquinas para um único IP ou fixa de IP's)
  • Contagem de pacotes que atravessaram uma interface/regra
  • Limitação de passagem de pacotes/conferência de regra (muito útil para criar proteções contra, syn flood, ping flood, DoS, etc).

Ficha técnica 
Pacote: IPtables 

  • iptables - Sistema de controle principal para protocolos ipv4
  • ip6tables - Sistema de controle principal para protocolos ipv6
  • iptables-save - Salva as regras atuais em um arquivo especificado como argumento. Este utilitário pode ser dispensado por um shell script contendo as regras executado na inicialização da máquina.
  • iptables-restore - Restaura regras salvas pelo utilitário iptables-save.

Entendendo as regras do IPtables 
Agora iremos entender a estrutura das regras iptables: 
Tabela FILTER 
É a tabela responsável pelos filtros dos pacotes. Ela se divide em 3 chains padrão. 
INPUT 
A chain INPUT é responsável por filtrar todo o tráfego que entra no firewall. 
FORWARD 
A chain FORWARD é responsável por filtrar todo o tráfego que passará pelo firewall, ou seja, todos os pacotes onde o NAT será aplicado. 
OUTPUT 
A chain OUTPUT é responsável por filtrar todo o tráfego que sairá pelo firewall. 
Tabela NAT 
É a tabela responsável pelo redirecionamento de pacotes. Ela também se divide em 3 chains. 
PREROUTING 
A chain PREROUTING é utilizada para alterar pacotes antes que os mesmos sejam roteados. 
POSTROUTING A chain POSTROUTING é utilizada pala alterar pacotes que já sofreram roteamento. 
Tabela MANGLE 
É a tabela responsável pela alteração de prioridade na entrada e saída de pacotes, baseando-se no tipo de serviço (TOS). É dividida em 2 chains. 
Comandos e ações 
Comandos 
-I 
Insere uma regra no início da lista. 
-A 
Adiciona uma regra no fim da lista. 
-D 
Apaga uma regra da lista. 
-L 
Lista as regras da lista. 
-P 
Altera a política padrão das Chains. 
-F 
Remove todas as regras da lista. 
-R 
Substitui uma regra da lista por outra. 
-N 
Cria uma nova chain na tabela especificada. 
-E 
Renomeia uma chain que foi criada com o comando -N. 
-X 
Apaga uma chain criada com o comando -N. 
Ações 
-p 
Especifica o protocolo ao qual a regra se aplicará. Também podemos utilizar o valor numérico que referencia o protocolo em /etc/protocol. Ex: -p gre ; -p 47 
-i 
Especifica a interface de entrada utilizada pela regra. Pode ser utilizada apenas com as chains INPUT e FORWARD. EX: -i eth0 ou -i eth+ para especificar todas as entradas. 
-o 
Especifica a interface de saída utilizada pela regra. Pode ser utilizada apenas com as chains FORWARD e OUTPUT. EX: -o eth0 
-s 
Especifica o endereço ou a rede de origem utilizada pela regra. Se não especificarmos a máscara de rede, o iptables utiliza a máscara padrão da classe C 255.255.255.0. Também podemos utilizar nomes DNS. Ex: -s 192.168.1.2; -s 192.168.1.0/255.255.255.0 domínio: exemplo.com.br 
-d 
Especifica o endereço ou a rede de destino utilizado pela regra. Se utiliza da mesma maneira que a ação -s. 

Utilizado para especificar exceções. Ex: -s ! 192.168.1.6 # A regra se aplicaria a todos os ips que tivessem origem diferente de 192.168.1.6 
-j 
Utilizado para aplicar um alvo a regra, os mesmos podem ser ACCEPT, DROP, REJECT e LOG. Ex: -j ACCEPT 
--sport 
Especifica a porta de origem utilizada. Só podemos aplicar a ação quando estivermos tratando dos protocolos tcp e udp. Ex: -p tcp --sport 25 
--dport 
Especifica a porta de destino utilizada. Funciona da mesma forma que a ação --sport. Ex: -p tcp --dport 25. 
Alvos e módulos 
Alvos 
Quando temos um pacote que combinou com todas as opções da regra, necessitamos especificar um destino para o mesmo, como vimos anteriormente podemos especificar os seguintes alvos / destinos: 
ACCEPT 
Aceita a entrada ou passagem do pacote. 
DROP 
Descarta o pacote. 

REJECT 
Descarta o pacote, porém diferente de DROP, ele retorna uma mensagem ao emissor informando o que houve com o pacote. 
LOG 
Gera um log no sistema. 
RETURN 
Retorna o processamento da chain anterior. 
QUEUE 
Encarrega um programa de administrar o fluxo atribuído ao mesmo. 
SNAT 
Altera o endereço de origem do pacote. 
DNAT 
Altera o endereço de destino do pacote. 
REDIRECT 
Redireciona a porta do pacote juntamente com a opção --to-port. 
TOS 
Prioriza a entrada e saída de pacotes baseado em seu tipo de serviço. 
Podemos especificar em TOS os seguintes valores: 
16 ou 0x10 Espera mínima 
8 ou 0x08 Máximo processamento 
4 ou 0x04 Máxima confiança 
2 ou 0x02 Custo mínimo 
0 ou 0x00 Prioridade normal 
Módulos 
A utilização de módulos junto com o iptables é definida através da opção -m. Podemos utilizar os seguintes módulos: 
limit Impõe um limite de vezes que a regra poderá ser executada. 
state Utiliza o estado da conexão, que pode ser NEW, ESTABLISHED, RELATED, INVALID. 
mac Permite a utilização do endereço mac nas regras. 
multiport Permite a utilização de até 15 portas em uma única regra em conjunto com o --dport. string Verifica o conteúdo do pacote para aplicar a regra. 
owner Verifica o usuário que criou o pacote.

Considerações finais 
Para finalizar, temos que esclarecer algumas coisas sobre firewall do sistema GNU/Linux, que na realidade se chama Netfilter, e o IPtables são comandos interpretados pelo Netfilter no Kernel, por default já vem habilitado na maioria das distros.
Script Firewall com regras IPtables 
#!/bin/bash
#Função: Regras iptables de configuração do firewall
#Utilização:
#no Slackware -> /etc/rc.d/rc.firewall2 e colocar em /etc/rc.d/rc.local
#Start|Stop|Restart
#file executable: chmod 755 /etc/rc.d/rc.firewall2
#Variaveis
ifaceExt="eth0" #acesso internet
ifaceInt="eth1" #acesso intranet (LAN)
LAN="192.168.1.0/24" #rede local
#carrega módulos
/sbin/modprobe ip_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_queue
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_tables
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_raw
/sbin/modprobe ipt_state
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_multiport
/sbin/modprobe ipt_mac
/sbin/modprobe ipt_string
start(){
echo "Firewall iniciando ..............................[OK]"
#Limpa as regras
iptables -F
iptables -X
iptables -Z
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -Z
iptables -t raw -F
iptables -t raw -X
iptables -t raw -Z
#definindo as regras padrão
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#Proxy(Squid) - Redirecionando tráfego porta 80 para porta 3128(Squid)
iptables -t nat -A PREROUTING -p tcp -m multiport -s $LAN --dport 80,443 -j REDIRECT --to-ports 3128
echo "Redirecionando tráfego porta 80 para porta 3128(Squid) "
#roteamento de pacotes
echo 1 > /proc/sys/net/ipv4/ip_forward
#compartilhamento de conexão
iptables -t nat -A POSTROUTING -s $LAN -o $ifaceExt -j MASQUERADE
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "compartilhamento da rede ativo"
#Libera a interface de loopback(localhost)
iptables -A INPUT -i lo -j ACCEPT
#liberando acesso pela internet (eth0=ifaceExt)
iptables -A INPUT -s $LAN -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -s $LAN -p udp --dport 53 -j ACCEPT
#liberando acessos de alguns serviços (eth1=ifaceInt) e serviço DNS/FTP/SSH/SAMBA apenas para rede interna
#chain INPUT
iptables -A INPUT -p tcp --dport 3128 -i $ifaceInt -j ACCEPT
#chain FORWARD
iptables -A FORWARD -p tcp --dport 3128 -i $ifaceInt -o $ifaceExt -s $LAN -j ACCEPT
iptables -A FORWARD -p tcp --dport 53 -i $ifaceInt -o $ifaceExt -s $LAN -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -i $ifaceInt -o $ifaceExt -s $LAN -j ACCEPT
iptables -A FORWARD -p tcp --dport 21 -i $ifaceInt -o $ifaceExt -s $LAN -j ACCEPT
iptables -A FORWARD -p tcp --dport 20 -i $ifaceInt -o $ifaceExt -s $LAN -j ACCEPT
iptables -A FORWARD -p tcp --dport 110 -i $ifaceInt -o $ifaceExt -s $LAN -j ACCEPT
iptables -A FORWARD -p tcp --dport 25 -i $ifaceInt -o $ifaceExt -s $LAN -j ACCEPT
iptables -A FORWARD -p tcp --dport 3389 -i $ifaceInt -o $ifaceExt -s $LAN -j ACCEPT
iptables -A FORWARD -p tcp --dport 137:139 -i $ifaceInt -s $LAN -j ACCEPT
iptables -A FORWARD -p tcp --dport 137:139 -i $ifaceInt -s $LAN -j ACCEPT
#chain OUTPUT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
#técnica Port knocking para SSH
#Fases do Segredo (portas para liberar acesso ssh)
iptables -N INTO-FASE2
iptables -A INTO-FASE2 -m recent --name FASE1 --remove
iptables -A INTO-FASE2 -m recent --name FASE2 --set
iptables -A INTO-FASE2 -j LOG --log-prefix "INTO FASE2:"
iptables -N INTO-FASE3
iptables -A INTO-FASE3 -m recent --name FASE2 --remove
iptables -A INTO-FASE3 -m recent --name FASE3 --set
iptables -A INTO-FASE3 -j LOG --log-prefix "INTO FASE3:"
iptables -N INTO-FASE4
iptables -A INTO-FASE4 -m recent --name FASE3 --remove
iptables -A INTO-FASE4 -m recent --name FASE4 --set
iptables -A INTO-FASE4 -j LOG --log-prefix "INTO FASE4:"
iptables -A INPUT -p tcp -m recent --update --name FASE
#Determina o número de portas e o tempo que o ip ficará em cada uma das fases aguardando a próxima porta ser digitada
iptables -A INPUT -p tcp --dport 1002 -m recent --set --name FASE1
iptables -A INPUT -p tcp --dport 1004 -m recent --rcheck --seconds 15 --name FASE1 -j INTO-FASE2
iptables -A INPUT -p tcp --dport 1006 -m recent --rcheck --seconds 15 --name FASE2 -j INTO-FASE3
iptables -A INPUT -p tcp --dport 1008 -m recent --rcheck --seconds 15 --name FASE3 -j INTO-FASE4
#Aqui chegamos a FASE4, que é a última porta, onde será liberada a conexão com a
porta 22(ssh). O tempo está setado para 3600 segundos(1 hora).
Depois disso será fechada novamente para o ip em questão, lembrando que se ele ainda tiver logado não fará diferença, será fechada mesmo assim. Então aumente o tempo conforme desejado.
iptables -A INPUT -p tcp -s 0/0 --dport 22 -m recent --rcheck --seconds 3600 --name FASE4 -j ACCEPT
#fecha se tiver inativo por 3 minutos
#iptables -A INPUT -p tcp -s 0/0 --dport 22 -m limit --limit 3/minute --limit-burst 3 -j DROP
#Por último fechamos todos acessos a porta 22(ssh)
iptables -A INPUT -p tcp --dport 22 -j DROP
#algumas proteções
#Filtrando pacotes ICMP
echo "Filtrando pacotes contra ICMP Broadcast"
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "Protegendo contra Ping da Morte..."
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
iptables -A INPUT -p icmp -j DROP
#Bloqueando Tracerouters
#Bloqueia pacotes tcp malformados
iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
#Filtro das conexões estabelicidas
echo "Permitindo e filtrando conexões estabelecidas"
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#Proteção contra Synflood
iptables -N syn-flood
iptables -A INPUT -i $ifaceInt -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#Proteção contra falhas de segurança dos serviços do X Window
iptables -A INPUT -p tcp -s 0.0.0.0/0 -d 0.0.0.0/0 --dport 6000:6063 -j DROP
#Proteção contra port-scanners ocultos
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -N SCANNER
iptables -A SCANNER -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -i $ifaceExt -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -i $ifaceExt -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -i $ifaceExt -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,SYN -i $ifaceExt -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -i $ifaceExt -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -i $ifaceExt -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -i $ifaceExt -j DROP
iptables -A FORWARD --protocol tcp --tcp-flags ALL SYN,ACK -j DROP
#-m recent --update --hitcount=4 quer dizer se tentar passar pelo ip utilizando o nmap 4x será jogado na lista INVASOR
iptables -A INPUT -m recent --update --hitcount 4 --name INVASOR --seconds 3600 -j DROP
#indica bloqueio por 3600 segundos, ou seja, 1 hora o host que tentou realizar um scan na rede
iptables -A INPUT -m recent --set --name INVASOR
#Proteção contra IP Spoofing
iptables -A INPUT -s $LAN -i $ifaceExt -j DROP
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $i
done
#Protecao contra ataques DoS
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -p tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP
#Verifica pacotes fragmentados e os descarta
iptables -N VALID_CHECK
iptables -A VALID_CHECK -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags ALL SYN,ACK,FIN,URG -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags ALL ALL -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags ALL FIN -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags ALL NONE -j DROP
#Bloqueia tudo que não foi especificado acima
iptables -A INPUT -p tcp --syn -j DROP
echo "Firewall ativo ---------------------------------[OK]"
}
stop(){
#Limpa as regras
iptables -F
iptables -X
iptables -Z
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -Z
iptables -t raw -F
iptables -t raw -X
iptables -t raw -Z
#reseta as politicas padrões, aceita tudo
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#compartilhamento de conexão
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o $ifaceExt -j MASQUERADE
echo "Firewall desativado! -----------------------------[OK]"
}
case "$1" in
"start") start ;;
"stop") stop ;;
"restart") stop; start ;;
*)
echo "Use os paramentros: start|stop|restart"
esac





Fonte : http://mundodacomputacaointegral.blogspot.com.br/2012/05/entendendo-o-funcionamento-de-um.html

Nenhum comentário:

Postar um comentário